Author: rmannibucau
Date: Fri Dec 23 19:07:36 2011
New Revision: 1222805
URL: http://svn.apache.org/viewvc?rev=1222805&view=rev
Log:
making openjpa working in OSGi (with built time enhancement)
Added:
openejb/trunk/openejb/examples/simple-osgi/simple-osgi-core/src/main/java/org/superbiz/osgi/moviefun/Bootstrap.java
Modified:
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/BasicDataSourceUtil.java
openejb/trunk/openejb/container/openejb-osgi/src/main/java/org/apache/openejb/core/osgi/impl/Deployer.java
openejb/trunk/openejb/examples/simple-osgi/simple-osgi-core/pom.xml
openejb/trunk/openejb/examples/simple-osgi/simple-osgi-core/src/main/java/org/superbiz/osgi/moviefun/Movie.java
openejb/trunk/openejb/examples/simple-osgi/simple-osgi-core/src/main/java/org/superbiz/osgi/moviefun/Movies.java
openejb/trunk/openejb/examples/simple-osgi/simple-osgi-core/src/main/resources/META-INF/persistence.xml
Modified:
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/BasicDataSourceUtil.java
URL:
http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/BasicDataSourceUtil.java?rev=1222805&r1=1222804&r2=1222805&view=diff
==============================================================================
---
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/BasicDataSourceUtil.java
(original)
+++
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/BasicDataSourceUtil.java
Fri Dec 23 19:07:36 2011
@@ -19,9 +19,12 @@ package org.apache.openejb.resource.jdbc
import org.apache.commons.dbcp.SQLNestedException;
import org.apache.xbean.finder.ResourceFinder;
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.net.URL;
import java.sql.SQLException;
import java.util.Map;
-import java.io.IOException;
public final class BasicDataSourceUtil {
private BasicDataSourceUtil() {
@@ -110,6 +113,18 @@ public final class BasicDataSourceUtil {
}
pwdCipher = impls.get(passwordCipherClass);
+ //
+ final ClassLoader tccl =
Thread.currentThread().getContextClassLoader();
+ final URL url =
tccl.getResource("META-INF/org.apache.openejb.resource.jdbc.PasswordCipher/" +
passwordCipherClass);
+ if (url != null) {
+ try {
+ final String clazz = new BufferedReader(new
InputStreamReader(url.openStream())).readLine().trim();
+ pwdCipher =
tccl.loadClass(clazz).asSubclass(PasswordCipher.class);
+ } catch (Exception e) {
+ // ignored
+ }
+ }
+
// if not found in
META-INF/org.apache.openejb.resource.jdbc.PasswordCipher
// we can try to load the class.
if (null == pwdCipher) {
@@ -118,7 +133,7 @@ public final class BasicDataSourceUtil {
pwdCipher =
Class.forName(passwordCipherClass).asSubclass(PasswordCipher.class);
} catch (ClassNotFoundException cnfe) {
- pwdCipher =
Thread.currentThread().getContextClassLoader().loadClass(passwordCipherClass).asSubclass(PasswordCipher.class);
+ pwdCipher =
tccl.loadClass(passwordCipherClass).asSubclass(PasswordCipher.class);
}
} catch (Throwable t) {
String message = "Cannot load password cipher class '" +
passwordCipherClass + "'";
Modified:
openejb/trunk/openejb/container/openejb-osgi/src/main/java/org/apache/openejb/core/osgi/impl/Deployer.java
URL:
http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-osgi/src/main/java/org/apache/openejb/core/osgi/impl/Deployer.java?rev=1222805&r1=1222804&r2=1222805&view=diff
==============================================================================
---
openejb/trunk/openejb/container/openejb-osgi/src/main/java/org/apache/openejb/core/osgi/impl/Deployer.java
(original)
+++
openejb/trunk/openejb/container/openejb-osgi/src/main/java/org/apache/openejb/core/osgi/impl/Deployer.java
Fri Dec 23 19:07:36 2011
@@ -49,6 +49,7 @@ import java.util.Arrays;
import java.util.Enumeration;
import java.util.List;
import java.util.Map;
+import java.util.NoSuchElementException;
import java.util.Properties;
import java.util.concurrent.ConcurrentHashMap;
@@ -57,6 +58,8 @@ import java.util.concurrent.ConcurrentHa
*/
public class Deployer implements BundleListener {
private static final Logger LOGGER =
LoggerFactory.getLogger(Deployer.class);
+ public static final String META_INF_NAME = "META-INF.";
+ public static final String SERVICES_NAME = "services.";
private final Map<Bundle, List<ServiceRegistration>> registrations = new
ConcurrentHashMap<Bundle, List<ServiceRegistration>>();
private final Map<Bundle, String> paths = new ConcurrentHashMap<Bundle,
String>();
@@ -288,7 +291,7 @@ public class Deployer implements BundleL
try {
return this.backingBundle.loadClass(name);
} catch (ClassNotFoundException cnfe) {
- if (isJdbcDriver(name) || isJPAProvider(name)) {
+ if (isInterestingClass(name)) {
final Class<?> forced = forceLoadClass(name);
if (forced != null) {
return forced;
@@ -307,19 +310,41 @@ public class Deployer implements BundleL
if (url != null) {
return url;
}
- return backingBundle.getResource(name);
+ url = backingBundle.getResource(name);
+ if (url != null) {
+ return url;
+ }
+ if (isInterestingClass(name)) {
+ return forceLoadResource(name);
+ }
+ return null;
+ }
+
+ public Enumeration<URL> getResources(String name) throws IOException {
+ return findResources(name);
}
protected Enumeration findResources(String name) throws IOException {
+ Enumeration<URL> urls;
try {
- Enumeration<URL> urls = fallbackBundle.getResources(name);
+ urls = fallbackBundle.getResources(name);
if (urls != null && urls.hasMoreElements()) {
return urls;
}
} catch (IOException ignored) {
// no-op
}
- return backingBundle.getResources(name);
+ urls = backingBundle.getResources(name);
+ if (urls != null && urls.hasMoreElements()) {
+ return urls;
+ }
+ if (isInterestingClass(name)) {
+ urls = forceLoadResources(name);
+ }
+ if (urls != null && urls.hasMoreElements()) {
+ return urls;
+ }
+ return new EmptyEnumeration<URL>();
}
public URL getResource(String name) {
@@ -339,6 +364,18 @@ public class Deployer implements BundleL
}
}
+ private static class EmptyEnumeration<T> implements Enumeration<T> {
+ @Override
+ public boolean hasMoreElements() {
+ return false;
+ }
+
+ @Override
+ public T nextElement() {
+ throw new NoSuchElementException();
+ }
+ }
+
public class OSGiDeploymentLoader extends DeploymentLoader {
private final Bundle bundle;
@@ -374,18 +411,38 @@ public class Deployer implements BundleL
return null;
}
+ private static Enumeration<URL> forceLoadResources(String name) {
+ final Bundle[] bundles = OpenEJBBundleContextHolder.get().getBundles();
+ for (Bundle bundle : bundles) {
+ Enumeration<URL> url = null;
+ try {
+ url = bundle.getResources(name);
+ } catch (IOException e) {
+ // ignored
+ }
+ if (url != null && url.hasMoreElements()) {
+ return url;
+ }
+ }
+ return null;
+ }
+
private static String className(final String name) {
return name.replace('/', '.');
}
- private static boolean isJdbcDriver(final String rawName) {
+ private static boolean isInterestingClass(final String rawName) {
final String name = className(rawName);
+ return isJdbcDriver(name) || isJPAProvider(name)
+ || name.contains("org.apache.openejb"); // fallback mainly for
META-INF resources
+ }
+
+ private static boolean isJdbcDriver(final String name) {
return name.startsWith("org.hsqldb") || name.startsWith("com.mysql")
|| name.startsWith("com.h2") || name.startsWith("oracle.jdbc");
}
- private static boolean isJPAProvider(String rawName) {
- final String name = className(rawName);
- return name.startsWith("org.apache.openjpa") ||
name.startsWith("serp.") // openjpa && its dep
+ private static boolean isJPAProvider(String name) {
+ return name.contains("openjpa") || name.startsWith("serp.") // openjpa
&& its dep
|| name.startsWith("org.hibernate") ||
name.startsWith("oracle.toplink") ||
name.startsWith("org.eclipse.persistence.jpa");
}
}
Modified: openejb/trunk/openejb/examples/simple-osgi/simple-osgi-core/pom.xml
URL:
http://svn.apache.org/viewvc/openejb/trunk/openejb/examples/simple-osgi/simple-osgi-core/pom.xml?rev=1222805&r1=1222804&r2=1222805&view=diff
==============================================================================
--- openejb/trunk/openejb/examples/simple-osgi/simple-osgi-core/pom.xml
(original)
+++ openejb/trunk/openejb/examples/simple-osgi/simple-osgi-core/pom.xml Fri Dec
23 19:07:36 2011
@@ -42,6 +42,32 @@
</instructions>
</configuration>
</plugin>
+ <plugin> <!-- needed otherwise it will not work at runtime -->
+ <groupId>org.apache.openjpa</groupId>
+ <artifactId>openjpa-maven-plugin</artifactId>
+ <version>2.2.0-SNAPSHOT</version>
+ <configuration>
+ <includes>org/superbiz/osgi/moviefun/Movie.class</includes>
+ <addDefaultConstructor>true</addDefaultConstructor>
+ <enforcePropertyRestrictions>true</enforcePropertyRestrictions>
+ </configuration>
+ <executions>
+ <execution>
+ <id>enhancer</id>
+ <phase>process-classes</phase>
+ <goals>
+ <goal>enhance</goal>
+ </goals>
+ </execution>
+ </executions>
+ <dependencies>
+ <dependency>
+ <groupId>org.apache.openjpa</groupId>
+ <artifactId>openjpa</artifactId>
+ <version>2.1.1</version>
+ </dependency>
+ </dependencies>
+ </plugin>
</plugins>
</build>
Added:
openejb/trunk/openejb/examples/simple-osgi/simple-osgi-core/src/main/java/org/superbiz/osgi/moviefun/Bootstrap.java
URL:
http://svn.apache.org/viewvc/openejb/trunk/openejb/examples/simple-osgi/simple-osgi-core/src/main/java/org/superbiz/osgi/moviefun/Bootstrap.java?rev=1222805&view=auto
==============================================================================
---
openejb/trunk/openejb/examples/simple-osgi/simple-osgi-core/src/main/java/org/superbiz/osgi/moviefun/Bootstrap.java
(added)
+++
openejb/trunk/openejb/examples/simple-osgi/simple-osgi-core/src/main/java/org/superbiz/osgi/moviefun/Bootstrap.java
Fri Dec 23 19:07:36 2011
@@ -0,0 +1,23 @@
+package org.superbiz.osgi.moviefun;
+
+import javax.annotation.PostConstruct;
+import javax.ejb.EJB;
+import javax.ejb.Singleton;
+import javax.ejb.Startup;
+
+@Singleton
+@Startup
+public class Bootstrap {
+ @EJB
+ private Movies movies;
+
+ @PostConstruct
+ public void init() {
+ try {
+ movies.addMovie(new Movie("OpenEJB", "OpenEJB in OSGi", 2011));
+ System.out.println("found " + movies.getMovies().size() + "
movies.");
+ } catch (Exception e) {
+ System.out.println("exception: " + e.getMessage());
+ }
+ }
+}
Modified:
openejb/trunk/openejb/examples/simple-osgi/simple-osgi-core/src/main/java/org/superbiz/osgi/moviefun/Movie.java
URL:
http://svn.apache.org/viewvc/openejb/trunk/openejb/examples/simple-osgi/simple-osgi-core/src/main/java/org/superbiz/osgi/moviefun/Movie.java?rev=1222805&r1=1222804&r2=1222805&view=diff
==============================================================================
---
openejb/trunk/openejb/examples/simple-osgi/simple-osgi-core/src/main/java/org/superbiz/osgi/moviefun/Movie.java
(original)
+++
openejb/trunk/openejb/examples/simple-osgi/simple-osgi-core/src/main/java/org/superbiz/osgi/moviefun/Movie.java
Fri Dec 23 19:07:36 2011
@@ -17,10 +17,13 @@
package org.superbiz.osgi.moviefun;
import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
@Entity
public class Movie {
-
+ @Id @GeneratedValue
+ private long id;
private String director;
private String title;
private int year;
@@ -34,6 +37,10 @@ public class Movie {
this.year = year;
}
+ public long getId() {
+ return id;
+ }
+
public String getDirector() {
return director;
}
Modified:
openejb/trunk/openejb/examples/simple-osgi/simple-osgi-core/src/main/java/org/superbiz/osgi/moviefun/Movies.java
URL:
http://svn.apache.org/viewvc/openejb/trunk/openejb/examples/simple-osgi/simple-osgi-core/src/main/java/org/superbiz/osgi/moviefun/Movies.java?rev=1222805&r1=1222804&r2=1222805&view=diff
==============================================================================
---
openejb/trunk/openejb/examples/simple-osgi/simple-osgi-core/src/main/java/org/superbiz/osgi/moviefun/Movies.java
(original)
+++
openejb/trunk/openejb/examples/simple-osgi/simple-osgi-core/src/main/java/org/superbiz/osgi/moviefun/Movies.java
Fri Dec 23 19:07:36 2011
@@ -17,8 +17,8 @@
package org.superbiz.osgi.moviefun;
import javax.annotation.security.PermitAll;
-import javax.annotation.security.RolesAllowed;
import javax.ejb.Stateful;
+import javax.ejb.Stateless;
import javax.ejb.TransactionAttribute;
import javax.ejb.TransactionAttributeType;
import javax.interceptor.Interceptors;
@@ -29,21 +29,17 @@ import javax.persistence.Query;
import java.util.List;
//START SNIPPET: code
-@Stateful
+@Stateless
public class Movies {
- @PersistenceContext(unitName = "movie-unit", type =
PersistenceContextType.TRANSACTION)
+ @PersistenceContext(unitName = "movie-unit")
private EntityManager entityManager;
- @RolesAllowed({"Employee", "Manager"})
- @TransactionAttribute(TransactionAttributeType.REQUIRED)
@Interceptors(AddInterceptor.class)
public void addMovie(Movie movie) throws Exception {
entityManager.persist(movie);
}
- @RolesAllowed({"Manager"})
- @TransactionAttribute(TransactionAttributeType.MANDATORY)
@Interceptors(DeleteInterceptor.class)
public void deleteMovie(Movie movie) throws Exception {
entityManager.remove(movie);
Modified:
openejb/trunk/openejb/examples/simple-osgi/simple-osgi-core/src/main/resources/META-INF/persistence.xml
URL:
http://svn.apache.org/viewvc/openejb/trunk/openejb/examples/simple-osgi/simple-osgi-core/src/main/resources/META-INF/persistence.xml?rev=1222805&r1=1222804&r2=1222805&view=diff
==============================================================================
---
openejb/trunk/openejb/examples/simple-osgi/simple-osgi-core/src/main/resources/META-INF/persistence.xml
(original)
+++
openejb/trunk/openejb/examples/simple-osgi/simple-osgi-core/src/main/resources/META-INF/persistence.xml
Fri Dec 23 19:07:36 2011
@@ -22,7 +22,6 @@
<jta-data-source>movieDatabase</jta-data-source>
<non-jta-data-source>movieDatabaseUnmanaged</non-jta-data-source>
<class>org.superbiz.osgi.moviefun.Movie</class>
-
<properties>
<property name="openjpa.jdbc.SynchronizeMappings"
value="buildSchema(ForeignKeys=true)"/>
</properties>