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 2014/06/15 19:40:32 UTC

svn commit: r1602743 - in /tomee/tomee/trunk/container/openejb-core/src: main/java/org/apache/openejb/assembler/classic/util/ test/java/org/apache/openejb/assembler/classic/util/

Author: rmannibucau
Date: Sun Jun 15 17:40:32 2014
New Revision: 1602743

URL: http://svn.apache.org/r1602743
Log:
TOMEE-1250 allowing to use @xxx to reference a resource as $ allows to reference another service in Service definition

Added:
    tomee/tomee/trunk/container/openejb-core/src/test/java/org/apache/openejb/assembler/classic/util/
    tomee/tomee/trunk/container/openejb-core/src/test/java/org/apache/openejb/assembler/classic/util/ServiceInfosTest.java
Modified:
    tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/util/ServiceInfos.java

Modified: tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/util/ServiceInfos.java
URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/util/ServiceInfos.java?rev=1602743&r1=1602742&r2=1602743&view=diff
==============================================================================
--- tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/util/ServiceInfos.java (original)
+++ tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/util/ServiceInfos.java Sun Jun 15 17:40:32 2014
@@ -17,16 +17,22 @@
 
 package org.apache.openejb.assembler.classic.util;
 
+import org.apache.openejb.JndiConstants;
 import org.apache.openejb.OpenEJBException;
 import org.apache.openejb.OpenEJBRuntimeException;
 import org.apache.openejb.assembler.classic.Assembler;
 import org.apache.openejb.assembler.classic.OpenEjbConfiguration;
 import org.apache.openejb.assembler.classic.ServiceInfo;
 import org.apache.openejb.loader.SystemInstance;
+import org.apache.openejb.spi.ContainerSystem;
+import org.apache.openejb.util.LogCategory;
+import org.apache.openejb.util.Logger;
 import org.apache.xbean.recipe.ObjectRecipe;
 import org.apache.xbean.recipe.Option;
 import org.apache.xbean.recipe.UnsetPropertiesRecipe;
 
+import javax.naming.Context;
+import javax.naming.NamingException;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.List;
@@ -140,11 +146,29 @@ public final class ServiceInfos {
             serviceRecipe.setProperty("prop", info.properties);
         } else {
             for (final Map.Entry<Object, Object> entry : info.properties.entrySet()) { // manage links
+                final String key = entry.getKey().toString();
                 final Object value = entry.getValue();
-                if (value instanceof String && value.toString().startsWith("$")) {
-                    serviceRecipe.setProperty(entry.getKey().toString(), resolve(services, value.toString().substring(1)));
+                if (value instanceof String) {
+                    final String valueStr = value.toString();
+                    if (valueStr.startsWith("$")){
+                        serviceRecipe.setProperty(key, resolve(services, valueStr.substring(1)));
+                    } else if (valueStr.startsWith("@")){
+                        final Context jndiContext = SystemInstance.get().getComponent(ContainerSystem.class).getJNDIContext();
+                        try {
+                            serviceRecipe.setProperty(key, jndiContext.lookup(JndiConstants.OPENEJB_RESOURCE_JNDI_PREFIX + valueStr.substring(1)));
+                        } catch (final NamingException e) {
+                            try {
+                                serviceRecipe.setProperty(key, jndiContext.lookup(valueStr.substring(1)));
+                            } catch (final NamingException e1) {
+                                Logger.getInstance(LogCategory.OPENEJB, ServiceInfos.class).warning("Value " + valueStr + " starting with @ but doesn't point to an existing resource, using raw value");
+                                serviceRecipe.setProperty(key, value);
+                            }
+                        }
+                    } else {
+                        serviceRecipe.setProperty(key, value);
+                    }
                 } else {
-                    serviceRecipe.setProperty(entry.getKey().toString(), entry.getValue());
+                    serviceRecipe.setProperty(key, entry.getValue());
                 }
             }
         }

Added: tomee/tomee/trunk/container/openejb-core/src/test/java/org/apache/openejb/assembler/classic/util/ServiceInfosTest.java
URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/test/java/org/apache/openejb/assembler/classic/util/ServiceInfosTest.java?rev=1602743&view=auto
==============================================================================
--- tomee/tomee/trunk/container/openejb-core/src/test/java/org/apache/openejb/assembler/classic/util/ServiceInfosTest.java (added)
+++ tomee/tomee/trunk/container/openejb-core/src/test/java/org/apache/openejb/assembler/classic/util/ServiceInfosTest.java Sun Jun 15 17:40:32 2014
@@ -0,0 +1,67 @@
+/*
+ * 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.apache.openejb.assembler.classic.util;
+
+import org.apache.openejb.assembler.classic.ServiceInfo;
+import org.apache.openejb.config.EjbModule;
+import org.apache.openejb.jee.EjbJar;
+import org.apache.openejb.jee.oejb3.OpenejbJar;
+import org.apache.openejb.jee.oejb3.PojoDeployment;
+import org.apache.openejb.junit.ApplicationComposer;
+import org.apache.openejb.testing.Configuration;
+import org.apache.openejb.testing.Module;
+import org.apache.openejb.testng.PropertiesBuilder;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import javax.sql.DataSource;
+import java.util.Properties;
+
+import static java.util.Arrays.asList;
+import static org.junit.Assert.assertNotNull;
+
+@RunWith(ApplicationComposer.class)
+public class ServiceInfosTest {
+    @Configuration
+    public Properties config() {
+        return new PropertiesBuilder().p("ds", "new://Resource?type=DataSource").build();
+    }
+
+    @Module
+    public EjbJar module() {
+        return new EjbJar();
+    }
+
+    @Test
+    public void createServiceWithResourceAttribute() {
+        final ServiceInfo serviceInfo = new ServiceInfo();
+        serviceInfo.id = "the-id";
+        serviceInfo.className = TheService.class.getName();
+        serviceInfo.properties = new Properties();
+        serviceInfo.properties.setProperty("dataSource", "@ds");
+        final TheService instance = TheService.class.cast(ServiceInfos.resolve(asList(serviceInfo), serviceInfo.id));
+        assertNotNull(instance.dataSource);
+    }
+
+    public static class TheService {
+        private DataSource dataSource;
+
+        public void setDataSource(final DataSource ds) {
+            this.dataSource = ds;
+        }
+    }
+}