diff --git a/gora-cassandra/pom.xml b/gora-cassandra/pom.xml
index 03d097d..31dcdb1 100644
--- a/gora-cassandra/pom.xml
+++ b/gora-cassandra/pom.xml
@@ -27,10 +27,15 @@
../
gora-cassandra
- jar
+ bundle
Apache Gora :: Cassandra
+
+ *
+ org.apache.gora.cassandra*;version="${project.version}";-noimport:=true
+
+
target
target/classes
diff --git a/gora-core/pom.xml b/gora-core/pom.xml
index 4d58ec2..be3414f 100644
--- a/gora-core/pom.xml
+++ b/gora-core/pom.xml
@@ -25,10 +25,15 @@
../
gora-core
- jar
+ bundle
Apache Gora :: Core
+
+ *
+ org.apache.gora*;version="${project.version}";-noimport:=true
+
+
target
target/classes
diff --git a/gora-core/src/examples/java/org/apache/gora/examples/mapreduce/QueryCounter.java b/gora-core/src/examples/java/org/apache/gora/examples/mapreduce/QueryCounter.java
index 03c0a8d..d82ddfd 100644
--- a/gora-core/src/examples/java/org/apache/gora/examples/mapreduce/QueryCounter.java
+++ b/gora-core/src/examples/java/org/apache/gora/examples/mapreduce/QueryCounter.java
@@ -32,6 +32,7 @@
import org.apache.hadoop.mapreduce.lib.output.NullOutputFormat;
import org.apache.hadoop.util.Tool;
import org.apache.hadoop.util.ToolRunner;
+import org.apache.gora.util.ClassLoadingUtils;
/**
* Example Hadoop job to count the row of a gora {@link Query}.
@@ -120,8 +121,8 @@ public int run(String[] args) throws Exception {
return 1;
}
- Class keyClass = (Class) Class.forName(args[0]);
- Class persistentClass = (Class) Class.forName(args[1]);
+ Class keyClass = (Class) ClassLoadingUtils.loadClass(args[0]);
+ Class persistentClass = (Class) ClassLoadingUtils.loadClass(args[1]);
DataStore dataStore;
Configuration conf = new Configuration();
diff --git a/gora-core/src/main/java/org/apache/gora/query/impl/QueryBase.java b/gora-core/src/main/java/org/apache/gora/query/impl/QueryBase.java
index 3f1c98c..c04e089 100644
--- a/gora-core/src/main/java/org/apache/gora/query/impl/QueryBase.java
+++ b/gora-core/src/main/java/org/apache/gora/query/impl/QueryBase.java
@@ -29,6 +29,7 @@
import org.apache.gora.query.Query;
import org.apache.gora.query.Result;
import org.apache.gora.store.DataStore;
+import org.apache.gora.util.ClassLoadingUtils;
import org.apache.gora.util.IOUtils;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.io.Text;
@@ -217,8 +218,7 @@ public void setConf(Configuration conf) {
public void readFields(DataInput in) throws IOException {
String dataStoreClass = Text.readString(in);
try {
- dataStore = (DataStore) ReflectionUtils.newInstance(
- Class.forName(dataStoreClass), conf);
+ dataStore = (DataStore) ReflectionUtils.newInstance(ClassLoadingUtils.loadClass(dataStoreClass), conf);
dataStore.readFields(in);
} catch (ClassNotFoundException ex) {
throw new IOException(ex);
diff --git a/gora-core/src/main/java/org/apache/gora/store/DataStoreFactory.java b/gora-core/src/main/java/org/apache/gora/store/DataStoreFactory.java
index 60c8e6c..6cddccd 100644
--- a/gora-core/src/main/java/org/apache/gora/store/DataStoreFactory.java
+++ b/gora-core/src/main/java/org/apache/gora/store/DataStoreFactory.java
@@ -26,6 +26,7 @@
import org.apache.commons.logging.LogFactory;
import org.apache.gora.persistency.Persistent;
import org.apache.gora.store.impl.DataStoreBase;
+import org.apache.gora.util.ClassLoadingUtils;
import org.apache.gora.util.GoraException;
import org.apache.gora.util.ReflectionUtils;
import org.apache.hadoop.conf.Configurable;
@@ -159,8 +160,8 @@ public static synchronized DataStore getDataStore(
throws GoraException {
try {
- Class k = Class.forName(keyClass);
- Class p = Class.forName(persistentClass);
+ Class k = ClassLoadingUtils.loadClass(keyClass);
+ Class p = ClassLoadingUtils.loadClass(persistentClass);
return getDataStore(dataStoreClass, k, p, conf);
} catch(GoraException ex) {
throw ex;
diff --git a/gora-core/src/main/java/org/apache/gora/store/impl/DataStoreBase.java b/gora-core/src/main/java/org/apache/gora/store/impl/DataStoreBase.java
index d54f159..045c567 100644
--- a/gora-core/src/main/java/org/apache/gora/store/impl/DataStoreBase.java
+++ b/gora-core/src/main/java/org/apache/gora/store/impl/DataStoreBase.java
@@ -35,6 +35,7 @@
import org.apache.gora.store.DataStore;
import org.apache.gora.store.DataStoreFactory;
import org.apache.gora.util.AvroUtils;
+import org.apache.gora.util.ClassLoadingUtils;
import org.apache.gora.util.StringUtils;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.io.Text;
@@ -173,8 +174,8 @@ protected Configuration getOrCreateConf() {
@SuppressWarnings("unchecked")
public void readFields(DataInput in) throws IOException {
try {
- Class keyClass = (Class) Class.forName(Text.readString(in));
- Class persistentClass = (Class)Class.forName(Text.readString(in));
+ Class keyClass = (Class) ClassLoadingUtils.loadClass(Text.readString(in));
+ Class persistentClass = (Class)ClassLoadingUtils.loadClass(Text.readString(in));
initialize(keyClass, persistentClass, DataStoreFactory.properties);
} catch (ClassNotFoundException ex) {
diff --git a/gora-core/src/main/java/org/apache/gora/util/ClassLoadingUtils.java b/gora-core/src/main/java/org/apache/gora/util/ClassLoadingUtils.java
new file mode 100644
index 0000000..ea77c1a
--- /dev/null
+++ b/gora-core/src/main/java/org/apache/gora/util/ClassLoadingUtils.java
@@ -0,0 +1,64 @@
+package org.apache.gora.util;
+
+public class ClassLoadingUtils {
+
+ private ClassLoadingUtils() {
+ //Utility Class
+ }
+
+ /**
+ * Loads a class using the class loader.
+ * 1. The class loader of the current class is being used.
+ * 2. The thread context class loader is being used.
+ * If both approaches fail, returns null.
+ *
+ * @param className The name of the class to load.
+ * @return The class or null if no class loader could load the class.
+ */
+ public static Class> loadClass(String className) throws ClassNotFoundException {
+ return ClassLoadingUtils.loadClass(ClassLoadingUtils.class,className);
+ }
+
+ /**
+ * Loads a class using the class loader.
+ * 1. The class loader of the context class is being used.
+ * 2. The thread context class loader is being used.
+ * If both approaches fail, returns null.
+ *
+ * @param contextClass The name of a context class to use.
+ * @param className The name of the class to load
+ * @return The class or null if no class loader could load the class.
+ */
+ public static Class> loadClass(Class> contextClass, String className) throws ClassNotFoundException {
+ Class> clazz = null;
+ if (contextClass.getClassLoader() != null) {
+ clazz = loadClass(className, contextClass.getClassLoader());
+ }
+ if (clazz == null && Thread.currentThread().getContextClassLoader() != null) {
+ clazz = loadClass(className, Thread.currentThread().getContextClassLoader());
+ }
+ if (clazz == null) {
+ throw new ClassNotFoundException("Failed to load class" + className);
+ }
+ return clazz;
+ }
+
+ /**
+ * Loads a {@link Class} from the specified {@link ClassLoader} without throwing {@ClassNotFoundException}.
+ *
+ * @param className
+ * @param classLoader
+ * @return
+ */
+ private static Class> loadClass(String className, ClassLoader classLoader) {
+ Class> clazz = null;
+ if (classLoader != null && className != null) {
+ try {
+ clazz = classLoader.loadClass(className);
+ } catch (ClassNotFoundException e) {
+ //Ignore and return null
+ }
+ }
+ return clazz;
+ }
+}
diff --git a/gora-core/src/main/java/org/apache/gora/util/IOUtils.java b/gora-core/src/main/java/org/apache/gora/util/IOUtils.java
index 508cbc5..62c93d0 100644
--- a/gora-core/src/main/java/org/apache/gora/util/IOUtils.java
+++ b/gora-core/src/main/java/org/apache/gora/util/IOUtils.java
@@ -189,7 +189,7 @@ public static byte[] serialize(PersistentDatumWriter da
public static T deserialize(Configuration conf, DataInput in
, T obj , String objClass) throws IOException, ClassNotFoundException {
- Class c = (Class) Class.forName(objClass);
+ Class c = (Class) ClassLoadingUtils.loadClass(objClass);
return deserialize(conf, in, obj, c);
}
@@ -233,7 +233,7 @@ public static T deserialize(Configuration conf, DataInput in
public static T deserialize(Configuration conf, DataInput in
, T obj) throws IOException, ClassNotFoundException {
String clazz = Text.readString(in);
- Class c = (Class)Class.forName(clazz);
+ Class c = (Class)ClassLoadingUtils.loadClass(clazz);
return deserialize(conf, in, obj, c);
}
@@ -477,7 +477,7 @@ public static T loadFromConf(Configuration conf, String dataKey)
String classKey = dataKey + "._class";
String className = conf.get(classKey);
try {
- T obj = (T) DefaultStringifier.load(conf, dataKey, Class.forName(className));
+ T obj = (T) DefaultStringifier.load(conf, dataKey, ClassLoadingUtils.loadClass(className));
return obj;
} catch (Exception ex) {
throw new IOException(ex);
diff --git a/gora-core/src/main/java/org/apache/gora/util/ReflectionUtils.java b/gora-core/src/main/java/org/apache/gora/util/ReflectionUtils.java
index 7f52e58..fd8c498 100644
--- a/gora-core/src/main/java/org/apache/gora/util/ReflectionUtils.java
+++ b/gora-core/src/main/java/org/apache/gora/util/ReflectionUtils.java
@@ -87,7 +87,7 @@ public static Object newInstance(String classStr) throws InstantiationException
if(classStr == null) {
throw new IllegalArgumentException("class cannot be null");
}
- Class> clazz = Class.forName(classStr);
+ Class> clazz = ClassLoadingUtils.loadClass(classStr);
return newInstance(clazz);
}
diff --git a/gora-sql/pom.xml b/gora-sql/pom.xml
index dcd9405..0ba6000 100644
--- a/gora-sql/pom.xml
+++ b/gora-sql/pom.xml
@@ -24,10 +24,15 @@
0.2-SNAPSHOT
gora-sql
- jar
+ bundle
Apache Gora :: SQL
+
+ *
+ org.apache.gora.sql*;version="${project.version}";-noimport:=true
+
+
target
target/classes
@@ -116,10 +121,10 @@
jdom
-
+
diff --git a/gora-sql/src/main/java/org/apache/gora/sql/store/SqlStore.java b/gora-sql/src/main/java/org/apache/gora/sql/store/SqlStore.java
index 8c021f2..3366a91 100644
--- a/gora-sql/src/main/java/org/apache/gora/sql/store/SqlStore.java
+++ b/gora-sql/src/main/java/org/apache/gora/sql/store/SqlStore.java
@@ -65,6 +65,7 @@
import org.apache.gora.store.DataStoreFactory;
import org.apache.gora.store.impl.DataStoreBase;
import org.apache.gora.util.AvroUtils;
+import org.apache.gora.util.ClassLoadingUtils;
import org.apache.gora.util.IOUtils;
import org.apache.gora.util.StringUtils;
import org.jdom.Document;
@@ -732,7 +733,7 @@ protected Connection getConnection() throws IOException {
try {
Connection connection = null;
- Class.forName(jdbcDriverClass);
+ ClassLoadingUtils.loadClass(jdbcDriverClass);
if(jdbcUsername == null || jdbcUsername.length() == 0) {
connection = DriverManager.getConnection(jdbcUrl);
} else {
diff --git a/gora-sql/src/test/java/org/apache/gora/sql/GoraSqlTestDriver.java b/gora-sql/src/test/java/org/apache/gora/sql/GoraSqlTestDriver.java
index 04261c2..f59253e 100644
--- a/gora-sql/src/test/java/org/apache/gora/sql/GoraSqlTestDriver.java
+++ b/gora-sql/src/test/java/org/apache/gora/sql/GoraSqlTestDriver.java
@@ -24,6 +24,7 @@
import org.apache.gora.GoraTestDriver;
import org.apache.gora.sql.store.SqlStore;
+import org.apache.gora.util.ClassLoadingUtils;
import org.apache.hadoop.util.StringUtils;
import org.hsqldb.Server;
@@ -99,7 +100,7 @@ public void tearDown() throws Exception {
private Connection createConnection(String driverClassName
, String url) throws Exception {
- Class.forName(driverClassName);
+ ClassLoadingUtils.loadClass(driverClassName);
Connection connection = DriverManager.getConnection(url);
connection.setAutoCommit(false);
return connection;
diff --git a/pom.xml b/pom.xml
index a7699b4..6d0039b 100644
--- a/pom.xml
+++ b/pom.xml
@@ -21,7 +21,6 @@
org.apache
apache
9
-
org.apache.gora
@@ -107,6 +106,40 @@
https://svn.apache.org/repos/asf/incubator/gora/tags/
+
+ org.apache.felix
+ maven-bundle-plugin
+ ${maven-bundle-plugin.version}
+ true
+ true
+
+
+ ${project.name}
+ ${project.artifactId}
+ ${osgi.export}
+ ${osgi.import}
+ ${osgi.dynamic.import}
+ ${osgi.private}
+ ${osgi.bundles}
+ ${osgi.activator}
+
+
+ jar
+ war
+ bundle
+
+ true
+
+
+
+ bundle-manifest
+ process-classes
+
+ manifest
+
+
+
+
@@ -153,6 +186,7 @@
1.5
2.11
2.1
+ 2.3.6