Author: rmannibucau
Date: Thu Dec 22 20:02:54 2011
New Revision: 1222416

URL: http://svn.apache.org/viewvc?rev=1222416&view=rev
Log:
some more work about OSGi and the tries to avoid the ejbmodule to know too much 
about the container and openejb to know too much about its jpa provider and 
jdbc drivers

Added:
    
openejb/trunk/openejb/examples/simple-osgi/simple-osgi-core/src/main/java/org/superbiz/osgi/calculator/impl/
    
openejb/trunk/openejb/examples/simple-osgi/simple-osgi-core/src/main/java/org/superbiz/osgi/calculator/impl/CalculatorBean.java
Removed:
    
openejb/trunk/openejb/examples/simple-osgi/simple-osgi-core/src/main/java/org/superbiz/osgi/calculator/CalculatorBean.java
Modified:
    openejb/trunk/openejb/container/openejb-core/pom.xml
    
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/ReloadableEntityManagerFactory.java
    
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/DeploymentLoader.java
    openejb/trunk/openejb/container/openejb-osgi/pom.xml
    
openejb/trunk/openejb/container/openejb-osgi/src/main/filtered-resources/features.xml
    
openejb/trunk/openejb/container/openejb-osgi/src/main/java/org/apache/openejb/core/osgi/impl/Activator.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-client/pom.xml
    openejb/trunk/openejb/pom.xml

Modified: openejb/trunk/openejb/container/openejb-core/pom.xml
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/pom.xml?rev=1222416&r1=1222415&r2=1222416&view=diff
==============================================================================
--- openejb/trunk/openejb/container/openejb-core/pom.xml (original)
+++ openejb/trunk/openejb/container/openejb-core/pom.xml Thu Dec 22 20:02:54 
2011
@@ -137,6 +137,7 @@
       org.apache.kahadb.util;resolution:=optional;version="[5.4,6)",
       org.apache.log4j;resolution:=optional,
       org.apache.openejb.api;version="[4.0,5)",
+      org.apache.openejb.javaagent;version="[4.0,5)",
       org.apache.openejb.jee;version="[4.0,5)",
       org.apache.openejb.jee.bval;version="[4.0,5)",
       org.apache.openejb.jee.jba;version="[4.0,5)",
@@ -149,6 +150,8 @@
       org.apache.openejb.jee.wls;version="[4.0,5)",
       org.apache.openejb.loader;version="[4.0,5)",
       
org.apache.openejb.client;bundle-version="[4.0,5.0)";resolution:=optional,
+      
org.apache.openejb.client.proxy;bundle-version="[4.0,5.0)";resolution:=optional,
+      
org.apache.openejb.client.java;bundle-version="[4.0,5.0)";resolution:=optional,
       org.openejb.client;bundle-version="[4.0,5.0)";resolution:=optional,
       org.apache.openjpa.event;resolution:=optional;version="[2.1,3)",
       org.apache.openjpa.persistence;resolution:=optional;version="[2.1,3)",

Modified: 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/ReloadableEntityManagerFactory.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/ReloadableEntityManagerFactory.java?rev=1222416&r1=1222415&r2=1222416&view=diff
==============================================================================
--- 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/ReloadableEntityManagerFactory.java
 (original)
+++ 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/ReloadableEntityManagerFactory.java
 Thu Dec 22 20:02:54 2011
@@ -119,6 +119,9 @@ public class ReloadableEntityManagerFact
             server.registerMBean(mBeanify(), generateObjectName());
         } catch (Exception e) {
             throw new OpenEJBException("can't register the mbean for the 
entity manager factory " + getPUname(), e);
+        } catch (NoClassDefFoundError ncdfe) {
+            objectName = null;
+            LOGGER.error("can't register the mbean for the entity manager 
factory {}", getPUname());
         }
     }
 

Modified: 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/DeploymentLoader.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/DeploymentLoader.java?rev=1222416&r1=1222415&r2=1222416&view=diff
==============================================================================
--- 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/DeploymentLoader.java
 (original)
+++ 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/DeploymentLoader.java
 Thu Dec 22 20:02:54 2011
@@ -126,13 +126,13 @@ public class DeploymentLoader implements
                         JarExtractor.copy(URLs.toFile(baseUrl), tmpFile);
                         tempURL = tmpFile.toURI().toURL();
 
-                        doNotUseClassLoader = 
ClassLoaderUtil.createClassLoader(tmpFile.getCanonicalPath(), new 
URL[]{baseUrl}, OpenEJB.class.getClassLoader());
+                        doNotUseClassLoader = 
ClassLoaderUtil.createClassLoader(tmpFile.getCanonicalPath(), new 
URL[]{baseUrl}, getOpenEJBClassLoader(baseUrl));
 
                     } catch (Exception e) {
                         throw new OpenEJBException(e);
                     }
                 } else {
-                    doNotUseClassLoader = 
ClassLoaderUtil.createClassLoader(jarPath, new URL[]{baseUrl}, 
OpenEJB.class.getClassLoader());
+                    doNotUseClassLoader = 
ClassLoaderUtil.createClassLoader(jarPath, new URL[]{baseUrl}, 
getOpenEJBClassLoader(baseUrl));
                 }
 
                 moduleClass = discoverModuleType(tempURL, 
ClassLoaderUtil.createTempClassLoader(doNotUseClassLoader), true);
@@ -152,7 +152,7 @@ public class DeploymentLoader implements
             }
 
             if (EjbModule.class.equals(moduleClass)) {
-                ClassLoader classLoader = 
ClassLoaderUtil.createTempClassLoader(jarPath, new URL[]{baseUrl}, 
OpenEJB.class.getClassLoader());
+                ClassLoader classLoader = 
ClassLoaderUtil.createTempClassLoader(jarPath, new URL[]{baseUrl}, 
getOpenEJBClassLoader(baseUrl));
 
                 AppModule appModule;
                 Class<? extends DeploymentModule> o = EjbModule.class;
@@ -168,7 +168,7 @@ public class DeploymentLoader implements
 
             if (ClientModule.class.equals(moduleClass)) {
                 String jarLocation = URLs.toFilePath(baseUrl);
-                ClientModule clientModule = createClientModule(baseUrl, 
jarLocation, OpenEJB.class.getClassLoader(), getModuleId(jarFile));
+                ClientModule clientModule = createClientModule(baseUrl, 
jarLocation, getOpenEJBClassLoader(baseUrl), getModuleId(jarFile));
 
                 // Wrap the resource module with an Application Module
                 return new AppModule(clientModule);
@@ -176,7 +176,7 @@ public class DeploymentLoader implements
 
             if (ConnectorModule.class.equals(moduleClass)) {
                 String jarLocation = URLs.toFilePath(baseUrl);
-                ConnectorModule connectorModule = 
createConnectorModule(jarLocation, jarLocation, OpenEJB.class.getClassLoader(), 
getModuleId(jarFile));
+                ConnectorModule connectorModule = 
createConnectorModule(jarLocation, jarLocation, getOpenEJBClassLoader(baseUrl), 
getModuleId(jarFile));
 
                 // Wrap the resource module with an Application Module
                 return new AppModule(connectorModule);
@@ -187,8 +187,8 @@ public class DeploymentLoader implements
 
                 // Standalone Web Module
 
-                AppModule appModule = new 
AppModule(OpenEJB.class.getClassLoader(), file.getAbsolutePath(), new 
Application(), true);
-                addWebModule(appModule, baseUrl, 
OpenEJB.class.getClassLoader(), getContextRoot(), getModuleName());
+                AppModule appModule = new 
AppModule(getOpenEJBClassLoader(baseUrl), file.getAbsolutePath(), new 
Application(), true);
+                addWebModule(appModule, baseUrl, 
getOpenEJBClassLoader(baseUrl), getContextRoot(), getModuleName());
 
                 final Map<String, URL> otherDD;
                 if (Boolean.getBoolean(OPENEJB_READ_ALL_PERSISTENCE_XML)) {
@@ -265,7 +265,7 @@ public class DeploymentLoader implements
             
             if (PersistenceModule.class.equals(moduleClass)) {
                 String jarLocation = URLs.toFilePath(baseUrl);
-                ClassLoader classLoader = 
ClassLoaderUtil.createTempClassLoader(jarPath, new URL[]{baseUrl}, 
OpenEJB.class.getClassLoader());
+                ClassLoader classLoader = 
ClassLoaderUtil.createTempClassLoader(jarPath, new URL[]{baseUrl}, 
getOpenEJBClassLoader(baseUrl));
 
                 // wrap the EJB Module with an Application Module
                 AppModule appModule = new AppModule(classLoader, jarLocation);
@@ -296,6 +296,10 @@ public class DeploymentLoader implements
         }
     }
 
+    protected ClassLoader getOpenEJBClassLoader(final URL url) {
+        return OpenEJB.class.getClassLoader();
+    }
+
     private String getModuleId(File file) {
        String filename = file.getName();
        return System.getProperty(filename + ".moduleId");
@@ -312,7 +316,7 @@ public class DeploymentLoader implements
         URL appUrl = getFileUrl(appDir);
 
         String appId = appDir.getAbsolutePath();
-        ClassLoader tmpClassLoader = 
ClassLoaderUtil.createTempClassLoader(appId, new URL[]{appUrl}, 
OpenEJB.class.getClassLoader());
+        ClassLoader tmpClassLoader = 
ClassLoaderUtil.createTempClassLoader(appId, new URL[]{appUrl}, 
getOpenEJBClassLoader(appUrl));
 
         ResourceFinder finder = new ResourceFinder("", tmpClassLoader, appUrl);
         Map<String, URL> appDescriptors = getDescriptors(finder);
@@ -450,7 +454,7 @@ public class DeploymentLoader implements
             classPath.addAll(rarLibs.values());
             classPath.addAll(extraLibs);
             URL[] urls = classPath.toArray(new URL[classPath.size()]);
-            ClassLoader appClassLoader = 
ClassLoaderUtil.createTempClassLoader(appId, urls, 
OpenEJB.class.getClassLoader());
+            ClassLoader appClassLoader = 
ClassLoaderUtil.createTempClassLoader(appId, urls, 
getOpenEJBClassLoader(appUrl));
 
             //
             // Create the AppModule and all nested module objects

Modified: openejb/trunk/openejb/container/openejb-osgi/pom.xml
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-osgi/pom.xml?rev=1222416&r1=1222415&r2=1222416&view=diff
==============================================================================
--- openejb/trunk/openejb/container/openejb-osgi/pom.xml (original)
+++ openejb/trunk/openejb/container/openejb-osgi/pom.xml Thu Dec 22 20:02:54 
2011
@@ -164,6 +164,9 @@
               org.apache.openejb.cdi;version="[4.0,5.0)",
               org.apache.openejb.config;version="[4.0,5.0)",
               
org.apache.openejb.client;bundle-version="[4.0,5.0)";resolution:=optional,
+              
org.apache.openejb.client.proxy;bundle-version="[4.0,5.0)";resolution:=optional,
+              
org.apache.openejb.client.java;bundle-version="[4.0,5.0)";resolution:=optional,
+              
org.openejb.client;bundle-version="[4.0,5.0)";resolution:=optional,
               
org.apache.openejb.localclient;bundle-version="[4.0,5.0)";resolution:=optional,
               org.apache.openejb.core;resolution:=optional;version="[4.0,5.0)",
               org.apache.openejb.core.ivm;version="[4.0,5.0)",

Modified: 
openejb/trunk/openejb/container/openejb-osgi/src/main/filtered-resources/features.xml
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-osgi/src/main/filtered-resources/features.xml?rev=1222416&r1=1222415&r2=1222416&view=diff
==============================================================================
--- 
openejb/trunk/openejb/container/openejb-osgi/src/main/filtered-resources/features.xml
 (original)
+++ 
openejb/trunk/openejb/container/openejb-osgi/src/main/filtered-resources/features.xml
 Thu Dec 22 20:02:54 2011
@@ -67,7 +67,12 @@
     
<bundle>mvn:org.apache.activemq/activemq-ra/${org.apache.activemq.version}</bundle>
   </feature>
 
-  <feature name="openejb-core" version="${project.version}">
+  <feature name="openjpa" version="${openjpa.version}">
+    <bundle>wrap:mvn:net.sourceforge.serp/serp/1.13.1</bundle>
+    <bundle>mvn:org.apache.openjpa/openjpa/${openjpa.version}</bundle>
+  </feature>
+
+  <feature name="openejb-core-dep" version="${project.version}">
     <feature version="${javaee-api.version}">javaee-api</feature>
 
     <!-- that shoudn't be necessary as we already have a stax bundle in 
javaee-api,
@@ -90,6 +95,7 @@
     <feature version="${xbeanVersion}">xbean</feature>
     <feature version="${geronimo-osgi.version}">geronimo-osgi</feature>
     <feature 
version="${org.apache.openwebbeans.version}">org.apache.openwebbeans</feature>
+    <feature version="${openjpa.version}">openjpa</feature>
 
     <!-- the activemq feature from activemq-karaf seems broken. Let's use our 
in the mid time -->
     <!--<feature version="${org.apache.activemq.version}">activemq</feature>-->
@@ -97,20 +103,27 @@
 
     <bundle>mvn:org.apache.commons/commons-lang3/3.1</bundle>
     <bundle>mvn:org.apache.bval/org.apache.bval.bundle/${bval.version}</bundle>
+    <bundle>mvn:org.hsqldb/hsqldb/${hsqldb.version}</bundle>
 
+    
<bundle>mvn:org.apache.openejb/mbean-annotation-api/${project.version}</bundle>
     <bundle>mvn:org.apache.openejb/openejb-api/${project.version}</bundle>
-    <bundle>mvn:org.apache.openejb/openejb-core/${project.version}</bundle>
     
<bundle>mvn:org.apache.openejb/openejb-javaagent/${project.version}</bundle>
     <bundle>mvn:org.apache.openejb/openejb-jee/${project.version}</bundle>
     <bundle>mvn:org.apache.openejb/openejb-loader/${project.version}</bundle>
     
<bundle>mvn:org.apache.openejb/openejb-core-osgi/${project.version}</bundle>
+  </feature>
 
+  <feature name="openejb-core" version="${project.version}">
+    <feature version="${project.version}">openejb-core-dep</feature>
+    <bundle>mvn:org.apache.openejb/openejb-core/${project.version}</bundle>
   </feature>
 
+
   <feature name="openejb-server" version="${project.version}">
-    <feature version="${project.version}">openejb-core</feature>
+    <feature version="${project.version}">openejb-core-dep</feature>
     <bundle>mvn:org.apache.openejb/openejb-ejbd/${project.version}</bundle>
     <bundle>mvn:org.apache.openejb/openejb-server/${project.version}</bundle>
     <bundle>mvn:org.apache.openejb/openejb-client/${project.version}</bundle>
+    <bundle>mvn:org.apache.openejb/openejb-core/${project.version}</bundle> 
<!-- after openejb-client -->
   </feature>
 </features>

Modified: 
openejb/trunk/openejb/container/openejb-osgi/src/main/java/org/apache/openejb/core/osgi/impl/Activator.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-osgi/src/main/java/org/apache/openejb/core/osgi/impl/Activator.java?rev=1222416&r1=1222415&r2=1222416&view=diff
==============================================================================
--- 
openejb/trunk/openejb/container/openejb-osgi/src/main/java/org/apache/openejb/core/osgi/impl/Activator.java
 (original)
+++ 
openejb/trunk/openejb/container/openejb-osgi/src/main/java/org/apache/openejb/core/osgi/impl/Activator.java
 Thu Dec 22 20:02:54 2011
@@ -107,7 +107,7 @@ public class Activator implements Bundle
     }
 
     public void stop(BundleContext context) throws Exception {
-        LOGGER.info("Stopping OpenEJB; openejb.isInitialized(): " + 
openejb.isInitialized());
+        LOGGER.info("Stopping OpenEJB");
 
         try {
             invoke(serviceManager, "stop");
@@ -116,7 +116,8 @@ public class Activator implements Bundle
         }
 
         openejb = null;
-        OpenEJB.destroy(); // todo: should it be static?
+        SystemInstance.reset();
+        OpenEJB.destroy();
     }
 
     private static void invoke(Object serviceManager, String name) throws 
OpenEJBException, InvocationTargetException, IllegalAccessException {

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=1222416&r1=1222415&r2=1222416&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
 Thu Dec 22 20:02:54 2011
@@ -112,7 +112,7 @@ public class Deployer implements BundleL
                     }
 
                     LOGGER.info("looking bundle {} in {}", 
bundle.getBundleId(), bundleDump);
-                    final AppModule appModule = new 
DeploymentLoader().load(bundleDump);
+                    final AppModule appModule = new 
OSGiDeploymentLoader(bundle).load(bundleDump);
                     LOGGER.info("deploying bundle #" + bundle.getBundleId() + 
" as an EJBModule");
 
                     final ConfigurationFactory configurationFactory = new 
ConfigurationFactory();
@@ -286,6 +286,12 @@ public class Deployer implements BundleL
             try {
                 return this.backingBundle.loadClass(name);
             } catch (ClassNotFoundException cnfe) {
+                if (isJdbcDriver(name) || isJPAProvider(name)) {
+                    final Class<?> forced = forceLoadClass(name);
+                    if (forced != null) {
+                        return forced;
+                    }
+                }
                 throw new ClassNotFoundException(name + " not found from 
bundle [" + backingBundle.getSymbolicName() + "]", cnfe);
             } catch (NoClassDefFoundError ncdfe) {
                 NoClassDefFoundError e = new NoClassDefFoundError(name + " not 
found from bundle [" + backingBundle + "]");
@@ -330,4 +336,54 @@ public class Deployer implements BundleL
             return "OSGIClassLoader for [" + backingBundle + "]";
         }
     }
+
+    public class OSGiDeploymentLoader extends DeploymentLoader {
+        private final Bundle bundle;
+
+        public OSGiDeploymentLoader(Bundle bdl) {
+            bundle = bdl;
+        }
+
+        @Override protected ClassLoader getOpenEJBClassLoader(URL url) {
+            return new OSGIClassLoader(bundle, 
OpenEJBBundleContextHolder.get().getBundle());
+        }
+    }
+
+    private static Class<?> forceLoadClass(String name) {
+        final Bundle[] bundles = OpenEJBBundleContextHolder.get().getBundles();
+        for (Bundle bundle : bundles) {
+            try {
+                return bundle.loadClass(name);
+            } catch (ClassNotFoundException e) {
+                // ignored
+            }
+        }
+        return null;
+    }
+
+    private static URL forceLoadResource(String name) {
+        final Bundle[] bundles = OpenEJBBundleContextHolder.get().getBundles();
+        for (Bundle bundle : bundles) {
+            URL url = bundle.getResource(name);
+            if (url != null) {
+                return url;
+            }
+        }
+        return null;
+    }
+
+    private static String className(final String name) {
+        return name.replace('/', '.');
+    }
+
+    private static boolean isJdbcDriver(final String rawName) {
+        final String name = className(rawName);
+        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
+                || name.startsWith("org.hibernate") || 
name.startsWith("oracle.toplink") || 
name.startsWith("org.eclipse.persistence.jpa");
+    }
 }

Modified: openejb/trunk/openejb/examples/simple-osgi/simple-osgi-client/pom.xml
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb/examples/simple-osgi/simple-osgi-client/pom.xml?rev=1222416&r1=1222415&r2=1222416&view=diff
==============================================================================
--- openejb/trunk/openejb/examples/simple-osgi/simple-osgi-client/pom.xml 
(original)
+++ openejb/trunk/openejb/examples/simple-osgi/simple-osgi-client/pom.xml Thu 
Dec 22 20:02:54 2011
@@ -56,6 +56,18 @@
       <artifactId>simple-osgi-api</artifactId>
       <version>${project.version}</version>
     </dependency>
+    <dependency> <!-- just to keep in mind camel and camel-osgi should be 
installed -->
+      <groupId>org.apache.camel</groupId>
+      <artifactId>camel-core</artifactId>
+      <version>2.8.3</version>
+      <scope>provided</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.springframework.osgi</groupId>
+      <artifactId>spring-osgi-core</artifactId>
+      <version>1.2.1</version>
+      <scope>provided</scope>
+    </dependency>
   </dependencies>
 
 </project>
\ No newline at end of file

Added: 
openejb/trunk/openejb/examples/simple-osgi/simple-osgi-core/src/main/java/org/superbiz/osgi/calculator/impl/CalculatorBean.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb/examples/simple-osgi/simple-osgi-core/src/main/java/org/superbiz/osgi/calculator/impl/CalculatorBean.java?rev=1222416&view=auto
==============================================================================
--- 
openejb/trunk/openejb/examples/simple-osgi/simple-osgi-core/src/main/java/org/superbiz/osgi/calculator/impl/CalculatorBean.java
 (added)
+++ 
openejb/trunk/openejb/examples/simple-osgi/simple-osgi-core/src/main/java/org/superbiz/osgi/calculator/impl/CalculatorBean.java
 Thu Dec 22 20:02:54 2011
@@ -0,0 +1,51 @@
+/**
+ * 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.superbiz.osgi.calculator.impl;
+
+import org.superbiz.osgi.calculator.CalculatorLocal;
+import org.superbiz.osgi.calculator.CalculatorRemote;
+
+import javax.ejb.Stateless;
+
+@Stateless
+public class CalculatorBean implements CalculatorLocal, CalculatorRemote {
+
+    public int add(int a, int b) {
+        return a + b;
+    }
+
+    public int subtract(int a, int b) {
+        return a - b;
+    }
+
+    public int multiply(int a, int b) {
+        return a * b;
+    }
+
+    public int divide(int a, int b) {
+        return a / b;
+    }
+
+    public int remainder(int a, int b) {
+        return a % b;
+    }
+
+    public String sayHello() {
+        return "Hello World!";
+    }
+
+}
\ No newline at end of file

Modified: openejb/trunk/openejb/pom.xml
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb/pom.xml?rev=1222416&r1=1222415&r2=1222416&view=diff
==============================================================================
--- openejb/trunk/openejb/pom.xml (original)
+++ openejb/trunk/openejb/pom.xml Thu Dec 22 20:02:54 2011
@@ -137,6 +137,8 @@
     <slf4j.version>1.6.1</slf4j.version>
     <log4j.version>1.2.16</log4j.version>
     <osgi.framework.version>4.2.0</osgi.framework.version>
+    <hsqldb.version>2.2.4</hsqldb.version>
+    <openjpa.version>2.1.1</openjpa.version>
 
     <!-- Apache Commons -->
     <commons-cli.version>1.2</commons-cli.version>
@@ -802,7 +804,7 @@
       <dependency>
         <groupId>org.hsqldb</groupId>
         <artifactId>hsqldb</artifactId>
-        <version>2.2.4</version>
+        <version>${hsqldb.version}</version>
       </dependency>
       <dependency>
         <groupId>idb</groupId>
@@ -1035,7 +1037,7 @@
       <dependency>
         <groupId>org.apache.openjpa</groupId>
         <artifactId>openjpa</artifactId>
-        <version>2.1.1</version>
+        <version>${openjpa.version}</version>
         <exclusions>
           <exclusion>
             <groupId>org.apache.geronimo.specs</groupId>


Reply via email to