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();