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