Author: chetanm
Date: Wed Mar 12 06:17:24 2014
New Revision: 1576589
URL: http://svn.apache.org/r1576589
Log:
OAK-1527 - Remove dependency on commons-beanutils
-- Copied the logic from jackrabbit-core/BeanConfig#newInstance to
PropertiesUtils
-- Moved PropertiesUtils to oak-commons
-- Removed commons-beanutils
Added:
jackrabbit/oak/trunk/oak-commons/src/main/java/org/apache/jackrabbit/oak/commons/PropertiesUtil.java
(contents, props changed)
- copied, changed from r1576555,
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/PropertiesUtil.java
jackrabbit/oak/trunk/oak-commons/src/test/java/org/apache/jackrabbit/oak/commons/PropertiesUtilTest.java
(with props)
Removed:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/PropertiesUtil.java
Modified:
jackrabbit/oak/trunk/oak-core/pom.xml
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/blob/cloud/CloudBlobStoreBuilder.java
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/blob/datastore/DataStoreBlobStoreBuilder.java
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeStoreService.java
jackrabbit/oak/trunk/oak-it/osgi/test-bundles.xml
Copied:
jackrabbit/oak/trunk/oak-commons/src/main/java/org/apache/jackrabbit/oak/commons/PropertiesUtil.java
(from r1576555,
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/PropertiesUtil.java)
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-commons/src/main/java/org/apache/jackrabbit/oak/commons/PropertiesUtil.java?p2=jackrabbit/oak/trunk/oak-commons/src/main/java/org/apache/jackrabbit/oak/commons/PropertiesUtil.java&p1=jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/PropertiesUtil.java&r1=1576555&r2=1576589&rev=1576589&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/PropertiesUtil.java
(original)
+++
jackrabbit/oak/trunk/oak-commons/src/main/java/org/apache/jackrabbit/oak/commons/PropertiesUtil.java
Wed Mar 12 06:17:24 2014
@@ -16,11 +16,20 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.apache.jackrabbit.oak.plugins.document;
+package org.apache.jackrabbit.oak.commons;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.lang.reflect.Modifier;
import java.util.ArrayList;
import java.util.Collection;
+import java.util.HashMap;
import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
// !! THIS UTILITY CLASS IS A COPY FROM APACHE SLING !!
@@ -29,10 +38,9 @@ import java.util.List;
/**
* The <code>PropertiesUtil</code> is a utility class providing some
* usefull utility methods for converting property types.
- *
- * @since 2.1
*/
-class PropertiesUtil {
+public class PropertiesUtil {
+ private static Logger log = LoggerFactory.getLogger(PropertiesUtil.class);
/**
* Returns the boolean value of the parameter or the
@@ -220,4 +228,100 @@ class PropertiesUtil {
return defaultArray;
}
+
+ /**
+ * Populates the bean properties from properties instance
+ *
+ * @param instance bean to populate
+ * @param config propertires to set in the passed bean
+ * @param validate Flag to validate the configured bean property names
against
+ * the configured bean class
+ */
+ @SuppressWarnings("unchecked")
+ public static void populate(Object instance, Map<String,String> config,
boolean validate){
+ Class<?> objectClass = instance.getClass();
+
+ // Set all configured bean properties
+ Map<String, Method> setters = getSetters(objectClass);
+ for(Map.Entry<String,String> e : config.entrySet()) {
+ String name = e.getKey();
+ Method setter = setters.get(name);
+ if (setter != null) {
+ if (setter.getAnnotation(Deprecated.class) != null) {
+ log.warn("Parameter {} of {} has been deprecated",
+ name, objectClass.getName());
+ }
+ String value = e.getValue();
+ setProperty(instance, name, setter, value);
+ } else if (validate) {
+ throw new IllegalArgumentException(
+ "Configured class " + objectClass.getName()
+ + " does not contain a property named " +
name);
+ }
+ }
+ }
+
+ private static Map<String, Method> getSetters(Class<?> klass) {
+ Map<String, Method> methods = new HashMap<String, Method>();
+ for (Method method : klass.getMethods()) {
+ String name = method.getName();
+ if (name.startsWith("set") && name.length() > 3
+ && Modifier.isPublic(method.getModifiers())
+ && !Modifier.isStatic(method.getModifiers())
+ && Void.TYPE.equals(method.getReturnType())
+ && method.getParameterTypes().length == 1) {
+ methods.put(
+ name.substring(3, 4).toLowerCase(Locale.ENGLISH) +
name.substring(4),
+ method);
+ }
+ }
+ return methods;
+ }
+
+ private static void setProperty(
+ Object instance, String name, Method setter, String value) {
+ String className = instance.getClass().getName();
+ Class<?> type = setter.getParameterTypes()[0];
+ try {
+ if (type.isAssignableFrom(String.class)
+ || type.isAssignableFrom(Object.class)) {
+ setter.invoke(instance, value);
+ } else if (type.isAssignableFrom(Boolean.TYPE)
+ || type.isAssignableFrom(Boolean.class)) {
+ setter.invoke(instance, Boolean.valueOf(value));
+ } else if (type.isAssignableFrom(Integer.TYPE)
+ || type.isAssignableFrom(Integer.class)) {
+ setter.invoke(instance, Integer.valueOf(value));
+ } else if (type.isAssignableFrom(Long.TYPE)
+ || type.isAssignableFrom(Long.class)) {
+ setter.invoke(instance, Long.valueOf(value));
+ } else if (type.isAssignableFrom(Double.TYPE)
+ || type.isAssignableFrom(Double.class)) {
+ setter.invoke(instance, Double.valueOf(value));
+ } else {
+ throw new RuntimeException(
+ "The type (" + type.getName()
+ + ") of property " + name + " of class "
+ + className + " is not supported");
+ }
+ } catch (NumberFormatException e) {
+ throw new RuntimeException(
+ "Invalid number format (" + value + ") for property "
+ + name + " of class " + className, e);
+ } catch (InvocationTargetException e) {
+ throw new RuntimeException(
+ "Property " + name + " of class "
+ + className + " can not be set to \"" + value +
"\"",
+ e);
+ } catch (IllegalAccessException e) {
+ throw new RuntimeException(
+ "The setter of property " + name
+ + " of class " + className + " can not be
accessed",
+ e);
+ } catch (IllegalArgumentException e) {
+ throw new RuntimeException(
+ "Unable to call the setter of property "
+ + name + " of class " + className, e);
+ }
+ }
}
Propchange:
jackrabbit/oak/trunk/oak-commons/src/main/java/org/apache/jackrabbit/oak/commons/PropertiesUtil.java
------------------------------------------------------------------------------
svn:eol-style = native
Added:
jackrabbit/oak/trunk/oak-commons/src/test/java/org/apache/jackrabbit/oak/commons/PropertiesUtilTest.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-commons/src/test/java/org/apache/jackrabbit/oak/commons/PropertiesUtilTest.java?rev=1576589&view=auto
==============================================================================
---
jackrabbit/oak/trunk/oak-commons/src/test/java/org/apache/jackrabbit/oak/commons/PropertiesUtilTest.java
(added)
+++
jackrabbit/oak/trunk/oak-commons/src/test/java/org/apache/jackrabbit/oak/commons/PropertiesUtilTest.java
Wed Mar 12 06:17:24 2014
@@ -0,0 +1,194 @@
+/*
+ * 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.jackrabbit.oak.commons;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.junit.Test;
+
+import static org.junit.Assert.assertArrayEquals;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+public class PropertiesUtilTest {
+
+
+ @SuppressWarnings({"deprecation", "UnnecessaryBoxing"})
+ @Test
+ public void testToDouble() {
+ // we test getProperty which calls toDouble - so we can test both
+ // methods in one go
+ assertEquals(2.0, PropertiesUtil.toDouble(null, 2.0), 0);
+ assertEquals(1.0, PropertiesUtil.toDouble(1.0, 2.0), 0);
+ assertEquals(1.0, PropertiesUtil.toDouble(new Double(1.0), 2.0), 0);
+ assertEquals(5.0, PropertiesUtil.toDouble(new Long(5), 2.0), 0);
+ assertEquals(2.0, PropertiesUtil.toDouble("abc", 2.0), 0);
+ }
+
+ @Test
+ public void testToBoolean() {
+ assertEquals(true, PropertiesUtil.toBoolean(null, true));
+ assertEquals(false, PropertiesUtil.toBoolean(1.0, true));
+ assertEquals(false, PropertiesUtil.toBoolean(false, true));
+ assertEquals(false, PropertiesUtil.toBoolean("false", true));
+ assertEquals(false, PropertiesUtil.toBoolean("abc", true));
+ }
+
+ @SuppressWarnings("UnnecessaryBoxing")
+ @Test
+ public void testToInteger() {
+ assertEquals(2, PropertiesUtil.toInteger(null, 2));
+ assertEquals(2, PropertiesUtil.toInteger(1.0, 2));
+ assertEquals(2, PropertiesUtil.toInteger(new Double(1.0), 2));
+ assertEquals(5, PropertiesUtil.toInteger(new Long(5), 2));
+ assertEquals(5, PropertiesUtil.toInteger(new Integer(5), 2));
+ assertEquals(2, PropertiesUtil.toInteger("abc", 2));
+ }
+
+ @SuppressWarnings("UnnecessaryBoxing")
+ @Test
+ public void testToLong() {
+ assertEquals(2, PropertiesUtil.toLong(null, 2));
+ assertEquals(2, PropertiesUtil.toLong(1.0, 2));
+ assertEquals(2, PropertiesUtil.toLong(new Double(1.0), 2));
+ assertEquals(5, PropertiesUtil.toLong(new Long(5), 2));
+ assertEquals(5, PropertiesUtil.toLong(new Integer(5), 2));
+ assertEquals(2, PropertiesUtil.toLong("abc", 2));
+ }
+
+ @Test
+ public void testToObject() {
+ assertEquals("hallo", PropertiesUtil.toObject("hallo"));
+ assertEquals("1", PropertiesUtil.toObject(new String[]{"1", "2"}));
+ assertEquals(null, PropertiesUtil.toObject(null));
+ assertEquals(null, PropertiesUtil.toObject(new String[]{}));
+ final List<String> l = new ArrayList<String>();
+ assertEquals(null, PropertiesUtil.toObject(l));
+ l.add("1");
+ assertEquals("1", PropertiesUtil.toObject(l));
+ l.add("2");
+ assertEquals("1", PropertiesUtil.toObject(l));
+ final Map<String, Object> m = new HashMap<String, Object>();
+ assertEquals(m, PropertiesUtil.toObject(m));
+ }
+
+ @Test
+ public void testToString() {
+ assertEquals("hallo", PropertiesUtil.toString("hallo", null));
+ assertEquals(this.toString(), PropertiesUtil.toString(null,
this.toString()));
+ final Map<String, Object> m = new HashMap<String, Object>();
+ m.put("1", 5);
+ assertEquals(m.toString(), PropertiesUtil.toString(m,
this.toString()));
+ }
+
+ @Test
+ public void testToStringArray() {
+ final String[] defaultValue = new String[]{"1"};
+ assertArrayEquals(null, PropertiesUtil.toStringArray(5));
+ assertArrayEquals(null, PropertiesUtil.toStringArray(null));
+ assertArrayEquals(defaultValue, PropertiesUtil.toStringArray(5,
defaultValue));
+ assertArrayEquals(defaultValue, PropertiesUtil.toStringArray(null,
defaultValue));
+ assertArrayEquals(new String[]{"hallo"},
PropertiesUtil.toStringArray("hallo", defaultValue));
+ assertArrayEquals(new String[]{"hallo"},
PropertiesUtil.toStringArray(new String[]{"hallo"}, defaultValue));
+ assertArrayEquals(new String[]{"hallo", "you"},
PropertiesUtil.toStringArray(new String[]{"hallo", "you"}, defaultValue));
+ assertArrayEquals(new String[]{"5", "1"},
PropertiesUtil.toStringArray(new Integer[]{5, 1}, defaultValue));
+ assertArrayEquals(new String[]{"5", "1"},
PropertiesUtil.toStringArray(new Integer[]{5, null, 1}, defaultValue));
+ final List<String> l = new ArrayList<String>();
+ assertArrayEquals(new String[]{}, PropertiesUtil.toStringArray(l,
defaultValue));
+ l.add("1");
+ l.add("2");
+ assertArrayEquals(new String[]{"1", "2"},
PropertiesUtil.toStringArray(l, defaultValue));
+ l.add(null);
+ assertArrayEquals(new String[]{"1", "2"},
PropertiesUtil.toStringArray(l, defaultValue));
+ final Map<String, Object> m = new HashMap<String, Object>();
+ m.put("1", 5);
+ assertArrayEquals(defaultValue, PropertiesUtil.toStringArray(m,
defaultValue));
+ }
+
+ @Test
+ public void testPopulate() {
+ Map<String, String> props = new HashMap<String, String>();
+ props.put("string", "foo");
+ props.put("bool", "true");
+ props.put("integer", "7");
+ props.put("aLong", "11");
+
+ TestBeanA bean = new TestBeanA();
+ PropertiesUtil.populate(bean, props, false);
+
+ assertEquals("foo", bean.getString());
+ assertTrue(bean.getBool());
+ assertEquals(7, bean.getInteger());
+ assertEquals(11, bean.getaLong());
+ }
+
+ @Test(expected = IllegalArgumentException.class)
+ public void testPopulateAndValidate() {
+ Map<String, String> props = new HashMap<String, String>();
+ props.put("something", "foo");
+
+ TestBeanA bean = new TestBeanA();
+ PropertiesUtil.populate(bean, props, true);
+
+ }
+
+ private static class TestBeanA {
+ private String string;
+ private Boolean bool;
+ private int integer;
+ private long aLong;
+
+ public String getString() {
+ return string;
+ }
+
+ public void setString(String string) {
+ this.string = string;
+ }
+
+ public Boolean getBool() {
+ return bool;
+ }
+
+ public void setBool(Boolean bool) {
+ this.bool = bool;
+ }
+
+ public int getInteger() {
+ return integer;
+ }
+
+ public void setInteger(int integer) {
+ this.integer = integer;
+ }
+
+ public long getaLong() {
+ return aLong;
+ }
+
+ public void setaLong(long aLong) {
+ this.aLong = aLong;
+ }
+ }
+
+}
Propchange:
jackrabbit/oak/trunk/oak-commons/src/test/java/org/apache/jackrabbit/oak/commons/PropertiesUtilTest.java
------------------------------------------------------------------------------
svn:eol-style = native
Modified: jackrabbit/oak/trunk/oak-core/pom.xml
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/pom.xml?rev=1576589&r1=1576588&r2=1576589&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/pom.xml (original)
+++ jackrabbit/oak/trunk/oak-core/pom.xml Wed Mar 12 06:17:24 2014
@@ -206,11 +206,6 @@
<version>2.4</version>
</dependency>
<dependency>
- <groupId>commons-beanutils</groupId>
- <artifactId>commons-beanutils</artifactId>
- <version>1.9.1</version>
- </dependency>
- <dependency>
<groupId>com.googlecode.json-simple</groupId>
<artifactId>json-simple</artifactId>
<version>1.1.1</version>
Modified:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/blob/cloud/CloudBlobStoreBuilder.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/blob/cloud/CloudBlobStoreBuilder.java?rev=1576589&r1=1576588&r2=1576589&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/blob/cloud/CloudBlobStoreBuilder.java
(original)
+++
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/blob/cloud/CloudBlobStoreBuilder.java
Wed Mar 12 06:17:24 2014
@@ -16,7 +16,7 @@
*/
package org.apache.jackrabbit.oak.plugins.blob.cloud;
-import org.apache.commons.beanutils.BeanUtils;
+import org.apache.jackrabbit.oak.commons.PropertiesUtil;
import org.apache.jackrabbit.oak.spi.blob.BlobStore;
import org.apache.jackrabbit.oak.plugins.blob.BlobStoreBuilder;
import org.apache.jackrabbit.oak.plugins.blob.BlobStoreConfiguration;
@@ -52,7 +52,7 @@ public class CloudBlobStoreBuilder imple
BlobStore blobStore = null;
blobStore = new CloudBlobStore();
- BeanUtils.populate(blobStore, configuration.getConfigMap());
+ PropertiesUtil.populate(blobStore, configuration.getConfigMap(),
false);
((CloudBlobStore) blobStore).init();
return Optional.of(blobStore);
Modified:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/blob/datastore/DataStoreBlobStoreBuilder.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/blob/datastore/DataStoreBlobStoreBuilder.java?rev=1576589&r1=1576588&r2=1576589&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/blob/datastore/DataStoreBlobStoreBuilder.java
(original)
+++
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/blob/datastore/DataStoreBlobStoreBuilder.java
Wed Mar 12 06:17:24 2014
@@ -18,7 +18,6 @@ package org.apache.jackrabbit.oak.plugin
import javax.jcr.RepositoryException;
-import org.apache.commons.beanutils.BeanUtils;
import org.apache.jackrabbit.core.data.Backend;
import org.apache.jackrabbit.core.data.CachingDataStore;
import org.apache.jackrabbit.core.data.DataStore;
@@ -26,6 +25,7 @@ import org.apache.jackrabbit.core.data.F
import org.apache.jackrabbit.core.data.MultiDataStore;
import org.apache.jackrabbit.core.data.db.DbDataStore;
import org.apache.jackrabbit.core.util.db.ConnectionFactory;
+import org.apache.jackrabbit.oak.commons.PropertiesUtil;
import org.apache.jackrabbit.oak.spi.blob.BlobStore;
import org.apache.jackrabbit.oak.plugins.blob.BlobStoreBuilder;
import org.apache.jackrabbit.oak.plugins.blob.BlobStoreConfiguration;
@@ -62,7 +62,7 @@ public class DataStoreBlobStoreBuilder i
DataStore store = getDataStore(configuration);
if (store != null) {
blobStore = new DataStoreBlobStore();
- BeanUtils.populate(blobStore, configuration.getConfigMap());
+ PropertiesUtil.populate(blobStore, configuration.getConfigMap(),
false);
((DataStoreBlobStore) blobStore).init(store);
}
return Optional.fromNullable(blobStore);
@@ -71,22 +71,20 @@ public class DataStoreBlobStoreBuilder i
/**
* Gets the data store based on the DataStoreProvider.
*
- * @param dataStoreConfig
+ * @param config
* the data store config
- * @param dataStoreType
- * the data store type
* @return the data store
* @throws RepositoryException
* the repository exception
*/
private DataStore getDataStore(BlobStoreConfiguration config) throws
Exception {
return getDataStore(
- (String)
config.getProperty(BlobStoreConfiguration.PROP_DATA_STORE), config);
+ config.getProperty(BlobStoreConfiguration.PROP_DATA_STORE),
config);
}
private DataStore getDataStore(String dataStoreType,
BlobStoreConfiguration config) throws Exception {
DataStore dataStore = (DataStore)
Class.forName(dataStoreType).newInstance();
- BeanUtils.populate(dataStore, config.getConfigMap());
+ PropertiesUtil.populate(dataStore, config.getConfigMap(), false);
if (dataStore instanceof DbDataStore) {
((DbDataStore) dataStore)
@@ -130,7 +128,7 @@ public class DataStoreBlobStoreBuilder i
}
};
- BeanUtils.populate(cachingStore, config.getConfigMap());
+ PropertiesUtil.populate(cachingStore, config.getConfigMap(), false);
cachingStore.init(null);
return cachingStore;
Modified:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeStoreService.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeStoreService.java?rev=1576589&r1=1576588&r2=1576589&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeStoreService.java
(original)
+++
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeStoreService.java
Wed Mar 12 06:17:24 2014
@@ -32,6 +32,7 @@ import org.apache.felix.scr.annotations.
import org.apache.felix.scr.annotations.ConfigurationPolicy;
import org.apache.felix.scr.annotations.Deactivate;
import org.apache.felix.scr.annotations.Property;
+import org.apache.jackrabbit.oak.commons.PropertiesUtil;
import org.apache.jackrabbit.oak.spi.blob.BlobStore;
import org.apache.jackrabbit.oak.api.jmx.CacheStatsMBean;
import org.apache.jackrabbit.oak.kernel.KernelNodeStore;
Modified: jackrabbit/oak/trunk/oak-it/osgi/test-bundles.xml
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-it/osgi/test-bundles.xml?rev=1576589&r1=1576588&r2=1576589&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-it/osgi/test-bundles.xml (original)
+++ jackrabbit/oak/trunk/oak-it/osgi/test-bundles.xml Wed Mar 12 06:17:24 2014
@@ -30,9 +30,7 @@
<includes>
<include>javax.jcr:jcr</include>
<include>com.google.guava:guava</include>
- <include>commons-beanutils:commons-beanutils</include>
<include>commons-codec:commons-codec</include>
- <include>commons-collections:commons-collections</include>
<include>commons-io:commons-io</include>
<include>org.apache.jackrabbit:jackrabbit-api</include>
<include>org.apache.jackrabbit:jackrabbit-jcr-commons</include>