public void testUpdatePropertyPrivilegesAndEvents()

in src/main/java/org/apache/sling/launchpad/webapp/integrationtest/servlets/post/PostServletPrivilegesUpdateTest.java [100:220]


    public void testUpdatePropertyPrivilegesAndEvents()
            throws IOException, JsonException, RepositoryException, InterruptedException {
        // 1. Create user as admin (OK)
        // curl -F:name=myuser -Fpwd=password -FpwdConfirm=password
        // http://admin:admin@localhost:8080/system/userManager/user.create.html
        testUserId = H.createTestUser();

        // 2. Create node as admin (OK)
        // curl -F:nameHint=node -FpropOne=propOneValue1 -FpropOne=propOneValue2 -FpropTwo=propTwoValue
        // http://admin:admin@localhost:8080/test/
        final String createTestNodeUrl = postUrl + SlingPostConstants.DEFAULT_CREATE_SUFFIX;
        NameValuePairList clientNodeProperties = new NameValuePairList();
        clientNodeProperties.add(SlingPostConstants.RP_NODE_NAME_HINT, testName.getMethodName());
        clientNodeProperties.add("propOne", "propOneValue1");
        clientNodeProperties.add("propOne", "propOneValue2");
        clientNodeProperties.add("propTwo", "propTwoValue");
        String testNodeUrl = H.getTestClient().createNode(createTestNodeUrl, clientNodeProperties, null, false);

        String content = H.getContent(testNodeUrl + ".json", HttpTest.CONTENT_TYPE_JSON);
        JsonObject json = JsonUtil.parseObject(content);
        Object propOneObj = json.get("propOne");
        assertTrue(propOneObj instanceof JsonArray);
        assertEquals(2, ((JsonArray) propOneObj).size());
        assertEquals("propOneValue1", ((JsonArray) propOneObj).getString(0));
        assertEquals("propOneValue2", ((JsonArray) propOneObj).getString(1));

        Object propTwoObj = json.get("propTwo");
        assertTrue(propTwoObj instanceof JsonString);
        assertEquals("propTwoValue", ((JsonString) propTwoObj).getString());

        // 3. Attempt to update property of node as testUser (500: javax.jcr.AccessDeniedException: /test/node/propOne:
        // not allowed to add or modify item)
        // curl -FpropOne=propOneValueChanged -FpropTwo=propTwoValueChanged1 -FpropTwo=propTwoValueChanged2
        // http://myuser:password@localhost:8080/test/node
        List<NameValuePair> postParams = new ArrayList<NameValuePair>();
        postParams.add(new NameValuePair("propOne", "propOneValueChanged"));
        postParams.add(new NameValuePair("propTwo", "propTwoValueChanged1"));
        postParams.add(new NameValuePair("propTwo", "propTwoValueChanged2"));
        Credentials testUserCreds = new UsernamePasswordCredentials(testUserId, "testPwd");
        String expectedMessage = "Expected javax.jcr.AccessDeniedException";
        H.assertAuthenticatedPostStatus(
                testUserCreds, testNodeUrl, HttpServletResponse.SC_INTERNAL_SERVER_ERROR, postParams, expectedMessage);

        // 4. Grant jcr:modifyProperties rights to testUser as admin (OK)
        // curl -FprincipalId=myuser -Fprivilege@jcr:modifyProperties=granted
        // http://admin:admin@localhost:8080/test/node.modifyAce.html
        Map<String, String> nodeAceProperties = new HashMap<String, String>();
        nodeAceProperties.put("principalId", testUserId);
        nodeAceProperties.put("privilege@jcr:modifyProperties", "granted");
        H.getTestClient().createNode(testNodeUrl + ".modifyAce.html", nodeAceProperties);

        // use a davex session to verify the correct JCR events are delivered
        Repository repository = JcrUtils.getRepository(HttpTest.HTTP_BASE_URL + "/server/");
        Session jcrSession = null;
        TestEventListener listener = new TestEventListener();
        ObservationManager observationManager = null;
        try {
            jcrSession = repository.login(new SimpleCredentials("admin", "admin".toCharArray()));
            observationManager = jcrSession.getWorkspace().getObservationManager();
            String testNodePath = testNodeUrl.substring(HttpTest.HTTP_BASE_URL.length());
            observationManager.addEventListener(
                    listener,
                    Event.PROPERTY_ADDED | Event.PROPERTY_CHANGED | Event.PROPERTY_REMOVED, // event types
                    testNodePath, // absPath
                    true, // isDeep
                    null, // uuid
                    null, // nodeTypeName
                    false); // noLocal

            // 5. Attempt to update properties of node (OK)
            // curl -FpropOne=propOneValueChanged -FpropTwo=propTwoValueChanged1 -FpropTwo=propTwoValueChanged2
            // http://myuser:password@localhost:8080/test/node
            H.assertAuthenticatedPostStatus(
                    testUserCreds, testNodeUrl, HttpServletResponse.SC_OK, postParams, expectedMessage);

            // verify the change happened
            String afterUpdateContent = H.getContent(testNodeUrl + ".json", HttpTest.CONTENT_TYPE_JSON);
            JsonObject afterUpdateJson = JsonUtil.parseObject(afterUpdateContent);
            Object afterUpdatePropOneObj = afterUpdateJson.get("propOne");
            assertTrue(afterUpdatePropOneObj instanceof JsonArray);
            assertEquals(1, ((JsonArray) afterUpdatePropOneObj).size());
            assertEquals("propOneValueChanged", ((JsonArray) afterUpdatePropOneObj).getString(0));

            Object afterUpdatePropTwoObj = afterUpdateJson.get("propTwo");
            assertTrue(afterUpdatePropTwoObj instanceof JsonArray);
            assertEquals(2, ((JsonArray) afterUpdatePropTwoObj).size());
            assertEquals("propTwoValueChanged1", ((JsonArray) afterUpdatePropTwoObj).getString(0));
            assertEquals("propTwoValueChanged2", ((JsonArray) afterUpdatePropTwoObj).getString(1));

            // wait for the expected JCR events to be delivered
            for (int second = 0; second < 15; second++) {
                if (listener.getEventBundlesProcessed() > 0) {
                    break;
                }
                Thread.sleep(1000);
            }

            assertEquals(
                    "One property added event was expected: " + listener.toString(),
                    1,
                    listener.addedProperties.size());
            assertEquals(testNodePath + "/propTwo", listener.addedProperties.get(0));
            assertEquals(
                    "One property removed event was expected: " + listener.toString(),
                    1,
                    listener.removedProperties.size());
            assertEquals(testNodePath + "/propTwo", listener.removedProperties.get(0));
            assertEquals(
                    "One property changed event was expected: " + listener.toString(),
                    1,
                    listener.changedProperties.size());
            assertEquals(testNodePath + "/propOne", listener.changedProperties.get(0));
        } finally {
            // cleanup
            if (observationManager != null) {
                observationManager.removeEventListener(listener);
            }
            jcrSession.logout();
            repository = null;
        }
    }