You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by bi...@apache.org on 2012/04/29 23:56:23 UTC

svn commit: r1332008 - in /camel/trunk/components/camel-jcr/src: main/java/org/apache/camel/component/jcr/ test/java/org/apache/camel/component/jcr/

Author: bibryam
Date: Sun Apr 29 21:56:23 2012
New Revision: 1332008

URL: http://svn.apache.org/viewvc?rev=1332008&view=rev
Log:
Added option to retrieve JCR nodes by Identifier

Added:
    camel/trunk/components/camel-jcr/src/test/java/org/apache/camel/component/jcr/JcrGetNodeByIdTest.java
Modified:
    camel/trunk/components/camel-jcr/src/main/java/org/apache/camel/component/jcr/JcrConstants.java
    camel/trunk/components/camel-jcr/src/main/java/org/apache/camel/component/jcr/JcrConverter.java
    camel/trunk/components/camel-jcr/src/main/java/org/apache/camel/component/jcr/JcrProducer.java
    camel/trunk/components/camel-jcr/src/test/java/org/apache/camel/component/jcr/JcrConsumerTest.java
    camel/trunk/components/camel-jcr/src/test/java/org/apache/camel/component/jcr/JcrRouteTestSupport.java

Modified: camel/trunk/components/camel-jcr/src/main/java/org/apache/camel/component/jcr/JcrConstants.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-jcr/src/main/java/org/apache/camel/component/jcr/JcrConstants.java?rev=1332008&r1=1332007&r2=1332008&view=diff
==============================================================================
--- camel/trunk/components/camel-jcr/src/main/java/org/apache/camel/component/jcr/JcrConstants.java (original)
+++ camel/trunk/components/camel-jcr/src/main/java/org/apache/camel/component/jcr/JcrConstants.java Sun Apr 29 21:56:23 2012
@@ -25,6 +25,9 @@ public final class JcrConstants {
      * Property key for specifying the name of a node in the repository
      */
     public static final String JCR_NODE_NAME = "CamelJcrNodeName";
+    public static final String JCR_OPERATION = "CamelJcrOperation";
+    public static final String JCR_INSERT = "CamelJcrInsert";
+    public static final String JCR_GET_BY_ID = "CamelJcrGetById";
 
     private JcrConstants() {
         // Utility class

Modified: camel/trunk/components/camel-jcr/src/main/java/org/apache/camel/component/jcr/JcrConverter.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-jcr/src/main/java/org/apache/camel/component/jcr/JcrConverter.java?rev=1332008&r1=1332007&r2=1332008&view=diff
==============================================================================
--- camel/trunk/components/camel-jcr/src/main/java/org/apache/camel/component/jcr/JcrConverter.java (original)
+++ camel/trunk/components/camel-jcr/src/main/java/org/apache/camel/component/jcr/JcrConverter.java Sun Apr 29 21:56:23 2012
@@ -19,6 +19,7 @@ package org.apache.camel.component.jcr;
 import java.io.InputStream;
 import java.util.Calendar;
 
+import javax.jcr.RepositoryException;
 import javax.jcr.Value;
 
 import org.apache.camel.Converter;
@@ -56,4 +57,24 @@ public final class JcrConverter {
         return new StringValue(value);
     }
 
+    @Converter
+    public static Boolean toBoolean(Value value) throws RepositoryException {
+        return value.getBoolean();
+    }
+
+    @Converter
+    public static InputStream toValue(Value value) throws RepositoryException {
+        return value.getBinary().getStream();
+    }
+
+    @Converter
+    public static Calendar toCalendar(Value value) throws RepositoryException {
+        return value.getDate();
+    }
+
+    @Converter
+    public static String toString(Value value) throws RepositoryException {
+        return value.getString();
+    }
+
 }

Modified: camel/trunk/components/camel-jcr/src/main/java/org/apache/camel/component/jcr/JcrProducer.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-jcr/src/main/java/org/apache/camel/component/jcr/JcrProducer.java?rev=1332008&r1=1332007&r2=1332008&view=diff
==============================================================================
--- camel/trunk/components/camel-jcr/src/main/java/org/apache/camel/component/jcr/JcrProducer.java (original)
+++ camel/trunk/components/camel-jcr/src/main/java/org/apache/camel/component/jcr/JcrProducer.java Sun Apr 29 21:56:23 2012
@@ -16,7 +16,13 @@
  */
 package org.apache.camel.component.jcr;
 
+import java.io.InputStream;
+import java.math.BigDecimal;
+import java.util.Calendar;
 import javax.jcr.Node;
+import javax.jcr.Property;
+import javax.jcr.PropertyIterator;
+import javax.jcr.PropertyType;
 import javax.jcr.RepositoryException;
 import javax.jcr.Session;
 import javax.jcr.Value;
@@ -33,37 +39,87 @@ public class JcrProducer extends Default
     }
 
     public void process(Exchange exchange) throws Exception {
+        TypeConverter converter = exchange.getContext().getTypeConverter();
         Session session = openSession();
+        String operation = determineOperation(exchange);
         try {
-            Node base = findOrCreateNode(session.getRootNode(),
-                    getJcrEndpoint().getBase());
-            Node node = findOrCreateNode(base, getNodeName(exchange));
-            TypeConverter converter = exchange.getContext().getTypeConverter();
-            for (String key : exchange.getProperties().keySet()) {
-                Value value = converter.convertTo(Value.class, exchange,
-                        exchange.getProperty(key));
-                node.setProperty(key, value);
+            if (JcrConstants.JCR_INSERT.equals(operation)) {
+                Node base = findOrCreateNode(session.getRootNode(), getJcrEndpoint().getBase());
+                Node node = findOrCreateNode(base, getNodeName(exchange));
+                for (String key : exchange.getProperties().keySet()) {
+                    Value value = converter.convertTo(Value.class, exchange, exchange.getProperty(key));
+                    node.setProperty(key, value);
+                }
+                node.addMixin("mix:referenceable");
+                exchange.getOut().setBody(node.getIdentifier());
+            } else if (JcrConstants.JCR_GET_BY_ID.equals(operation)) {
+                Node node = session.getNodeByIdentifier(exchange.getIn()
+                        .getMandatoryBody(String.class));
+                PropertyIterator properties = node.getProperties();
+                while (properties.hasNext()) {
+                    Property property = properties.nextProperty();
+                    Class<?> aClass = classForJCRType(property);
+                    Object value = converter.convertTo(aClass, exchange, property.getValue());
+                    exchange.setProperty(property.getName(), value);
+                }
+            } else {
+                throw new RuntimeException("Unsupported operation: " + operation);
             }
-            node.addMixin("mix:referenceable");
-            session.save();
-            exchange.getOut().setBody(node.getIdentifier());
+
         } finally {
+            session.save();
             if (session != null && session.isLive()) {
                 session.logout();
             }
         }
     }
 
+    private Class<?> classForJCRType(Property property) throws RepositoryException {
+        switch (property.getType()) {
+        case PropertyType.STRING:
+            return String.class;
+        case PropertyType.BINARY:
+            return InputStream.class;
+        case PropertyType.BOOLEAN:
+            return Boolean.class;
+        case PropertyType.LONG:
+            return Long.class;
+        case PropertyType.DOUBLE:
+            return Double.class;
+        case PropertyType.DECIMAL:
+            return BigDecimal.class;
+        case PropertyType.DATE:
+            return Calendar.class;
+        case PropertyType.NAME:
+            return String.class;
+        case PropertyType.PATH:
+            return String.class;
+        case PropertyType.REFERENCE:
+            return String.class;
+        case PropertyType.WEAKREFERENCE:
+            return String.class;
+        case PropertyType.URI:
+            return String.class;
+        case PropertyType.UNDEFINED:
+            return String.class;
+        default:
+            throw new IllegalArgumentException("unknown type: " + property.getType());
+        }
+    }
+
+    private String determineOperation(Exchange exchange) {
+        String operation = exchange.getIn().getHeader(JcrConstants.JCR_OPERATION, String.class);
+        return operation != null ? operation : JcrConstants.JCR_INSERT;
+    }
+
     private String getNodeName(Exchange exchange) {
         if (exchange.getProperty(JcrConstants.JCR_NODE_NAME) != null) {
-            return exchange.getProperty(JcrConstants.JCR_NODE_NAME,
-                    String.class);
+            return exchange.getProperty(JcrConstants.JCR_NODE_NAME, String.class);
         }
         return exchange.getExchangeId();
     }
 
-    private Node findOrCreateNode(Node parent, String path)
-        throws RepositoryException {
+    private Node findOrCreateNode(Node parent, String path) throws RepositoryException {
         Node result = parent;
         for (String component : path.split("/")) {
             component = Text.escapeIllegalJcrChars(component);
@@ -75,12 +131,10 @@ public class JcrProducer extends Default
     }
 
     protected Session openSession() throws RepositoryException {
-        return getJcrEndpoint().getRepository().login(
-                getJcrEndpoint().getCredentials());
+        return getJcrEndpoint().getRepository().login(getJcrEndpoint().getCredentials());
     }
 
     private JcrEndpoint getJcrEndpoint() {
-        JcrEndpoint endpoint = (JcrEndpoint) getEndpoint();
-        return endpoint;
+        return (JcrEndpoint)getEndpoint();
     }
 }

Modified: camel/trunk/components/camel-jcr/src/test/java/org/apache/camel/component/jcr/JcrConsumerTest.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-jcr/src/test/java/org/apache/camel/component/jcr/JcrConsumerTest.java?rev=1332008&r1=1332007&r2=1332008&view=diff
==============================================================================
--- camel/trunk/components/camel-jcr/src/test/java/org/apache/camel/component/jcr/JcrConsumerTest.java (original)
+++ camel/trunk/components/camel-jcr/src/test/java/org/apache/camel/component/jcr/JcrConsumerTest.java Sun Apr 29 21:56:23 2012
@@ -56,7 +56,7 @@ public class JcrConsumerTest extends Jcr
 
         // now create a node under the specified event node path
 
-        Session session = getRepository().login(new SimpleCredentials("user", "pass".toCharArray()));
+        Session session = openSession();
 
         try {
             Node folderNode = session.getRootNode();

Added: camel/trunk/components/camel-jcr/src/test/java/org/apache/camel/component/jcr/JcrGetNodeByIdTest.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-jcr/src/test/java/org/apache/camel/component/jcr/JcrGetNodeByIdTest.java?rev=1332008&view=auto
==============================================================================
--- camel/trunk/components/camel-jcr/src/test/java/org/apache/camel/component/jcr/JcrGetNodeByIdTest.java (added)
+++ camel/trunk/components/camel-jcr/src/test/java/org/apache/camel/component/jcr/JcrGetNodeByIdTest.java Sun Apr 29 21:56:23 2012
@@ -0,0 +1,78 @@
+/**
+ * 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.camel.component.jcr;
+
+import javax.jcr.Node;
+import javax.jcr.Session;
+
+import org.apache.camel.EndpointInject;
+import org.apache.camel.Exchange;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.mock.MockEndpoint;
+import org.junit.Before;
+import org.junit.Test;
+
+public class JcrGetNodeByIdTest extends JcrRouteTestSupport {
+    public static final String CONTENT = "content is here";
+    public static final Boolean APPROVED = true;
+    private String identifier;
+
+    @EndpointInject(uri = "mock:result")
+    private MockEndpoint result;
+
+    @Override
+    @Before
+    public void setUp() throws Exception {
+        deleteDirectory("target/repository");
+        super.setUp();
+
+        Session session = openSession();
+        Node node = session.getRootNode().addNode("home").addNode("test");
+        node.setProperty("content.approved", APPROVED);
+        node.setProperty("my.contents.property", CONTENT);
+        identifier = node.getIdentifier();
+
+        session.save();
+        session.logout();
+    }
+
+    @Test
+    public void testJcrProducer() throws Exception {
+        result.expectedMessageCount(1);
+        result.expectedPropertyReceived("my.contents.property", CONTENT);
+        result.expectedPropertyReceived("content.approved", APPROVED);
+
+        Exchange exchange = createExchangeWithBody(identifier);
+        template.send("direct:a", exchange);
+        assertMockEndpointsSatisfied();
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() throws Exception {
+        return new RouteBuilder() {
+            @Override
+            public void configure() throws Exception {
+                from("direct:a")
+                        .setHeader(JcrConstants.JCR_OPERATION, constant(JcrConstants.JCR_GET_BY_ID))
+                        .to("jcr://user:pass@repository")
+                        .to("mock:result");
+            }
+        };
+    }
+
+}
+

Modified: camel/trunk/components/camel-jcr/src/test/java/org/apache/camel/component/jcr/JcrRouteTestSupport.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-jcr/src/test/java/org/apache/camel/component/jcr/JcrRouteTestSupport.java?rev=1332008&r1=1332007&r2=1332008&view=diff
==============================================================================
--- camel/trunk/components/camel-jcr/src/test/java/org/apache/camel/component/jcr/JcrRouteTestSupport.java (original)
+++ camel/trunk/components/camel-jcr/src/test/java/org/apache/camel/component/jcr/JcrRouteTestSupport.java Sun Apr 29 21:56:23 2012
@@ -17,6 +17,9 @@
 package org.apache.camel.component.jcr;
 
 import javax.jcr.Repository;
+import javax.jcr.RepositoryException;
+import javax.jcr.Session;
+import javax.jcr.SimpleCredentials;
 import javax.naming.Context;
 
 import org.apache.camel.test.junit4.CamelTestSupport;
@@ -43,6 +46,10 @@ public abstract class JcrRouteTestSuppor
         return repository;
     }
 
+    protected Session openSession() throws RepositoryException {
+        return getRepository().login(new SimpleCredentials("user", "pass".toCharArray()));
+    }
+
     @Override
     protected Context createJndiContext() throws Exception {
         Context context = super.createJndiContext();