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>


Reply via email to