You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tomee.apache.org by rm...@apache.org on 2011/12/22 21:02:55 UTC

svn commit: r1222416 - in /openejb/trunk/openejb: ./ container/openejb-core/ container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/ container/openejb-core/src/main/java/org/apache/openejb/config/ container/openejb-osgi/ container/op...

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>