Added: 
sling/whiteboard/resourceresolverfactory/jcr-resource/src/test/java/org/apache/sling/jcr/resource/internal/JcrPropertyMapTest.java
URL: 
http://svn.apache.org/viewvc/sling/whiteboard/resourceresolverfactory/jcr-resource/src/test/java/org/apache/sling/jcr/resource/internal/JcrPropertyMapTest.java?rev=1239587&view=auto
==============================================================================
--- 
sling/whiteboard/resourceresolverfactory/jcr-resource/src/test/java/org/apache/sling/jcr/resource/internal/JcrPropertyMapTest.java
 (added)
+++ 
sling/whiteboard/resourceresolverfactory/jcr-resource/src/test/java/org/apache/sling/jcr/resource/internal/JcrPropertyMapTest.java
 Thu Feb  2 12:46:58 2012
@@ -0,0 +1,298 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.sling.jcr.resource.internal;
+
+import java.io.ByteArrayInputStream;
+import java.io.InputStream;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.Iterator;
+
+import javax.jcr.Node;
+import javax.jcr.Property;
+import javax.jcr.RepositoryException;
+import javax.jcr.Value;
+import javax.jcr.ValueFactory;
+
+import org.apache.commons.io.IOUtils;
+import org.apache.jackrabbit.util.ISO9075;
+import org.apache.sling.api.resource.ValueMap;
+import org.apache.sling.commons.testing.jcr.RepositoryTestBase;
+import org.apache.sling.jcr.resource.JcrPropertyMap;
+
+public class JcrPropertyMapTest extends RepositoryTestBase {
+
+    private static final String PROP_NAME = "prop_name";
+
+    private static final String PROP_NAME_NIL = "prop_name_nil";
+
+    private String rootPath;
+
+    private Node rootNode;
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+
+        rootPath = "/test" + System.currentTimeMillis();
+        rootNode = getSession().getRootNode().addNode(rootPath.substring(1),
+            "nt:unstructured");
+        session.save();
+    }
+
+    @Override
+    protected void tearDown() throws Exception {
+        if (rootNode != null) {
+            rootNode.remove();
+            session.save();
+        }
+
+        super.tearDown();
+    }
+
+    public void testJCRType() throws Exception {
+        testValue(rootNode, "A String");
+        testValue(rootNode, Calendar.getInstance());
+        testValue(rootNode, 5L);
+        testValue(rootNode, 1.4D);
+        testValue(rootNode, true);
+    }
+
+    public void testTypeByClass() throws Exception {
+        testValue(rootNode, "A String Value", String.class);
+
+        testValue(rootNode, 1l, Byte.class);
+        testValue(rootNode, 1l, Short.class);
+        testValue(rootNode, 1l, Integer.class);
+        testValue(rootNode, 1l, Long.class);
+
+        testValue(rootNode, 1.0d, Float.class);
+        testValue(rootNode, 1.0d, Double.class);
+
+        Calendar cal = Calendar.getInstance();
+        testValue(rootNode, cal, Calendar.class);
+        testValue(rootNode, cal, Date.class);
+        testValue(rootNode, cal, Long.class);
+    }
+
+    public void testTypeByDefaultValue() throws Exception {
+        testValue(rootNode, "A String Value", "default");
+
+        testValue(rootNode, 1l, (byte) 10);
+        testValue(rootNode, 1l, (short) 10);
+        testValue(rootNode, 1l, 10);
+        testValue(rootNode, 1l, 10l);
+
+        testValue(rootNode, 1.0d, 10.0f);
+        testValue(rootNode, 1.0d, 10.0d);
+
+        long refTime = 1000l;
+        Date refDate = new Date(refTime);
+        Calendar refCal = Calendar.getInstance();
+        refCal.setTimeInMillis(refTime);
+
+        Calendar cal = Calendar.getInstance();
+        testValue(rootNode, cal, refCal);
+        testValue(rootNode, cal, refDate);
+        testValue(rootNode, cal, refTime);
+    }
+
+    public void testDefaultValue() throws Exception {
+        testDefaultValue(rootNode, "default");
+
+        testDefaultValue(rootNode, (byte) 10);
+        testDefaultValue(rootNode, (short) 10);
+        testDefaultValue(rootNode, 10);
+        testDefaultValue(rootNode, 10l);
+
+        testDefaultValue(rootNode, 10.0f);
+        testDefaultValue(rootNode, 10.0d);
+
+        long refTime = 1000l;
+        Date refDate = new Date(refTime);
+        Calendar refCal = Calendar.getInstance();
+        refCal.setTimeInMillis(refTime);
+
+        testDefaultValue(rootNode, refCal);
+        testDefaultValue(rootNode, refDate);
+        testDefaultValue(rootNode, refTime);
+    }
+
+    public void testProperty() throws Exception {
+        ValueMap map = createProperty(rootNode, "Sample Value For Prop");
+        Property prop = rootNode.getProperty(PROP_NAME);
+
+        // explicite type
+        Property result = map.get(PROP_NAME, Property.class);
+        assertTrue(prop.isSame(result));
+
+        // type by default value
+        Property defaultValue = rootNode.getProperty("jcr:primaryType");
+        result = map.get(PROP_NAME, defaultValue);
+        assertTrue(prop.isSame(result));
+
+        // default value
+        result = map.get(PROP_NAME_NIL, defaultValue);
+        assertSame(defaultValue, result);
+    }
+    
+    public void testInputStream() throws Exception {
+        InputStream instream = new ByteArrayInputStream("this too shall 
pass".getBytes());
+        
+        ValueFactory valueFactory = rootNode.getSession().getValueFactory();
+
+        rootNode.setProperty("bin", valueFactory.createBinary(instream));
+        rootNode.getSession().save();
+        
+        ValueMap map = new JcrPropertyMap(rootNode);
+        instream = map.get("bin", InputStream.class);
+        assertNotNull(instream);
+        String read = IOUtils.toString(instream);
+        assertEquals("Stream read successfully", "this too shall pass", read);
+        
+        instream = map.get("bin", InputStream.class);
+        assertNotNull(instream);
+        read = IOUtils.toString(instream);
+        assertEquals("Stream read successfully a second time", "this too shall 
pass", read);
+    }
+
+    // ---------- internal
+
+    private void testValue(Node node, Object value, Object defaultValue) 
throws RepositoryException {
+        ValueMap map = createProperty(rootNode, value);
+        assertValueType(value, map.get(PROP_NAME, defaultValue), 
defaultValue.getClass());
+    }
+
+    private void testDefaultValue(Node node, Object defaultValue) {
+        JcrPropertyMap map = createPropertyMap(rootNode);
+        assertSame(defaultValue, map.get(PROP_NAME_NIL, defaultValue));
+    }
+
+    private void testValue(Node node, Object value, Class<?> type) throws 
RepositoryException {
+        ValueMap map = createProperty(rootNode, value);
+        assertValueType(value, map.get(PROP_NAME, type), type);
+    }
+
+    private void assertValueType(Object value, Object result, Class<?> type) {
+        assertTrue(type.isInstance(result));
+
+        if (value instanceof Long && result instanceof Number) {
+            assertEquals(((Number) value).longValue(), ((Number) 
result).longValue());
+
+        } else if (value instanceof Double && result instanceof Number) {
+            assertEquals(((Number) value).doubleValue(), ((Number) 
result).doubleValue());
+
+        } else if (value instanceof Calendar) {
+            long resultTime;
+            if (result instanceof Date) {
+                resultTime = ((Date) result).getTime();
+            } else if (result instanceof Calendar) {
+                resultTime = ((Calendar) result).getTimeInMillis();
+            } else if (result instanceof Number) {
+                resultTime = ((Number) result).longValue();
+            } else {
+                fail("unexpected result type for Calendar: " + type);
+                return;
+            }
+            assertEquals(((Calendar) value).getTimeInMillis(), resultTime);
+
+        } else {
+            assertEquals(value, result);
+        }
+    }
+
+    protected JcrPropertyMap createPropertyMap(final Node node) {
+        return new JcrPropertyMap(node);
+    }
+
+    private void testValue(Node node, Object value) throws RepositoryException 
{
+        ValueMap map = createProperty(node, value);
+        assertEquals(value, map.get(PROP_NAME));
+    }
+
+    private ValueMap createProperty(Node node, Object value)
+            throws RepositoryException {
+        if (node.hasProperty(PROP_NAME)) {
+            node.getProperty(PROP_NAME).remove();
+        }
+
+        Value jcrValue;
+        ValueFactory fac = session.getValueFactory();
+        if (value instanceof String) {
+            jcrValue = fac.createValue((String) value);
+        } else if (value instanceof Calendar) {
+            jcrValue = fac.createValue((Calendar) value);
+        } else if (value instanceof Date) {
+            Calendar cal = Calendar.getInstance();
+            cal.setTime((Date) value);
+            jcrValue = fac.createValue(cal);
+        } else if (value instanceof Boolean) {
+            jcrValue = fac.createValue(((Boolean) value).booleanValue());
+        } else if (value instanceof Double) {
+            jcrValue = fac.createValue(((Double) value).doubleValue());
+        } else if (value instanceof Long) {
+            jcrValue = fac.createValue(((Long) value).longValue());
+        } else {
+            fail("Cannot create JCR value from " + value);
+            return null;
+        }
+
+        node.setProperty(PROP_NAME, jcrValue);
+        node.getSession().save();
+
+        return createPropertyMap(node);
+    }
+
+    private static final String TEST_PATH = "a<a";
+
+    public void testNames() throws Exception {
+        this.rootNode.setProperty(ISO9075.encodePath(TEST_PATH), "value");
+        final ValueMap vm = this.createPropertyMap(this.rootNode);
+        assertEquals("value", vm.get(TEST_PATH));
+    }
+
+    public void testIerators() throws Exception {
+        this.rootNode.setProperty(ISO9075.encodePath(TEST_PATH), "value");
+        final ValueMap vm = this.createPropertyMap(this.rootNode);
+        assertTrue(vm.containsKey(TEST_PATH));
+        search(vm.keySet().iterator(), TEST_PATH);
+        search(vm.values().iterator(), "value");
+    }
+
+    public void testDotSlash() throws Exception {
+        final String prop = "myProp";
+        final String value = "value";
+        this.rootNode.setProperty(prop, value);
+        final ValueMap vm = this.createPropertyMap(this.rootNode);
+        assertEquals(value, vm.get(prop));
+        assertEquals(value, vm.get("./" + prop));
+        assertTrue(vm.containsKey("./" + prop));
+    }
+
+    protected void search(Iterator<?> i, Object value) {
+        boolean found = false;
+        while ( !found && i.hasNext() ) {
+            final Object current = i.next();
+            found = current.equals(value);
+        }
+        if ( !found ) {
+            fail("Value " + value + " is not found in iterator.");
+        }
+    }
+}

Added: 
sling/whiteboard/resourceresolverfactory/jcr-resource/src/test/java/org/apache/sling/jcr/resource/internal/JcrResourceListenerTest.java
URL: 
http://svn.apache.org/viewvc/sling/whiteboard/resourceresolverfactory/jcr-resource/src/test/java/org/apache/sling/jcr/resource/internal/JcrResourceListenerTest.java?rev=1239587&view=auto
==============================================================================
--- 
sling/whiteboard/resourceresolverfactory/jcr-resource/src/test/java/org/apache/sling/jcr/resource/internal/JcrResourceListenerTest.java
 (added)
+++ 
sling/whiteboard/resourceresolverfactory/jcr-resource/src/test/java/org/apache/sling/jcr/resource/internal/JcrResourceListenerTest.java
 Thu Feb  2 12:46:58 2012
@@ -0,0 +1,175 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with this
+ * work for additional information regarding copyright ownership. The ASF
+ * licenses this file to You under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations 
under
+ * the License.
+ */
+package org.apache.sling.jcr.resource.internal;
+
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Random;
+
+import javax.jcr.Node;
+import javax.jcr.RepositoryException;
+import javax.jcr.Session;
+
+import junitx.util.PrivateAccessor;
+
+import org.apache.sling.api.SlingConstants;
+import org.apache.sling.commons.testing.jcr.EventHelper;
+import org.apache.sling.commons.testing.jcr.RepositoryTestBase;
+import org.osgi.service.event.Event;
+import org.osgi.service.event.EventAdmin;
+import org.osgi.util.tracker.ServiceTracker;
+
+/**
+ * Test of JcrResourceListener.
+ */
+public class JcrResourceListenerTest extends RepositoryTestBase {
+    private String createdPath;
+
+    private String pathToDelete;
+
+    private String pathToModify;
+
+    public void testDefaultWorkspace() throws Exception {
+        List<Event> events = generateEvents(null);
+
+        Event event = events.get(0);
+        assertEquals(SlingConstants.TOPIC_RESOURCE_ADDED, event.getTopic());
+        assertEquals(createdPath, 
event.getProperty(SlingConstants.PROPERTY_PATH));
+        assertNotNull(event.getProperty(SlingConstants.PROPERTY_USERID));
+
+        event = events.get(1);
+        assertEquals(SlingConstants.TOPIC_RESOURCE_CHANGED, event.getTopic());
+        assertEquals(pathToModify, 
event.getProperty(SlingConstants.PROPERTY_PATH));
+        assertNotNull(event.getProperty(SlingConstants.PROPERTY_USERID));
+
+        event = events.get(2);
+        assertEquals(SlingConstants.TOPIC_RESOURCE_REMOVED, event.getTopic());
+        assertEquals(pathToDelete, 
event.getProperty(SlingConstants.PROPERTY_PATH));
+        assertNotNull(event.getProperty(SlingConstants.PROPERTY_USERID));
+
+    }
+
+    public void testInWs2() throws Exception {
+        List<Event> events = generateEvents("ws2");
+
+        assertEquals(3, events.size());
+        Event event = events.get(0);
+        assertEquals(SlingConstants.TOPIC_RESOURCE_ADDED, event.getTopic());
+        assertEquals("ws2:" + createdPath, 
event.getProperty(SlingConstants.PROPERTY_PATH));
+        assertNotNull(event.getProperty(SlingConstants.PROPERTY_USERID));
+
+        event = events.get(1);
+        assertEquals(SlingConstants.TOPIC_RESOURCE_CHANGED, event.getTopic());
+        assertEquals("ws2:" + pathToModify, 
event.getProperty(SlingConstants.PROPERTY_PATH));
+        assertNotNull(event.getProperty(SlingConstants.PROPERTY_USERID));
+
+        event = events.get(2);
+        assertEquals(SlingConstants.TOPIC_RESOURCE_REMOVED, event.getTopic());
+        assertEquals("ws2:" + pathToDelete, 
event.getProperty(SlingConstants.PROPERTY_PATH));
+        assertNotNull(event.getProperty(SlingConstants.PROPERTY_USERID));
+
+    }
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        try {
+            getSession().getWorkspace().createWorkspace("ws2");
+        } catch (Exception e) {
+            if (!e.getMessage().equals("workspace 'ws2' already exists.")) {
+                throw e;
+            }
+        }
+
+    }
+
+    private static void createNode(Session session, String path) throws 
RepositoryException {
+        session.getRootNode().addNode(path.substring(1), "nt:unstructured");
+        session.save();
+    }
+
+
+    private void addNodeToDelete(Session session) throws RepositoryException {
+        pathToDelete = createTestPath();
+        createNode(session, pathToDelete);
+
+    }
+
+    private void addNodeToModify(Session session) throws RepositoryException {
+        pathToModify = createTestPath();
+        createNode(session, pathToModify);
+
+    }
+
+    private String createTestPath() {
+        return "/test" + System.currentTimeMillis() + new Random().nextInt();
+    }
+
+    private List<Event> generateEvents(String workspaceName) throws Exception {
+        final Session session = 
getRepository().loginAdministrative(workspaceName);
+
+        final List<Event> events = new ArrayList<Event>();
+
+        addNodeToModify(session);
+        addNodeToDelete(session);
+
+        JcrResourceResolverFactoryImpl factory = new 
JcrResourceResolverFactoryImpl();
+        PrivateAccessor.setField(factory, "repository", getRepository());
+        PrivateAccessor.setField(factory, "useMultiWorkspaces", Boolean.TRUE);
+
+        final EventAdmin mockEA = new EventAdmin() {
+
+            public void postEvent(Event event) {
+                events.add(event);
+            }
+
+            public void sendEvent(Event event) {
+                events.add(event);
+            }
+        };
+        final ServiceTracker tracker = mock(ServiceTracker.class);
+        when(tracker.getService()).thenReturn(mockEA);
+
+        JcrResourceListener listener = new 
SynchronousJcrResourceListener(workspaceName, factory, "/",
+                "/", tracker);
+
+        createdPath = createTestPath();
+        createNode(session, createdPath);
+
+        Node modified = session.getNode(pathToModify);
+        modified.setProperty("foo", "bar");
+        session.save();
+
+        Node deleted = session.getNode(pathToDelete);
+        deleted.remove();
+        session.save();
+
+        listener.dispose();
+
+        Session newSession = 
getRepository().loginAdministrative(workspaceName);
+        EventHelper helper = new EventHelper(newSession);
+        helper.waitForEvents(5000);
+        helper.dispose();
+        newSession.logout();
+        session.logout();
+
+        return events;
+    }
+}


Reply via email to