Author: jboynes
Date: Sat Apr  8 11:00:45 2006
New Revision: 392565

URL: http://svn.apache.org/viewcvs?rev=392565&view=rev
Log:
add support for setting properties by JNDI lookup

Added:
    
incubator/tuscany/java/sca/core/src/main/java/org/apache/tuscany/core/injection/JNDIObjectFactory.java
   (with props)
    
incubator/tuscany/java/sca/core/src/main/java/org/apache/tuscany/core/loader/impl/JNDIPropertyFactory.java
   (with props)
    
incubator/tuscany/java/sca/core/src/test/java/org/apache/tuscany/core/loader/JNDIPropertyFactoryTestCase.java
   (with props)

Added: 
incubator/tuscany/java/sca/core/src/main/java/org/apache/tuscany/core/injection/JNDIObjectFactory.java
URL: 
http://svn.apache.org/viewcvs/incubator/tuscany/java/sca/core/src/main/java/org/apache/tuscany/core/injection/JNDIObjectFactory.java?rev=392565&view=auto
==============================================================================
--- 
incubator/tuscany/java/sca/core/src/main/java/org/apache/tuscany/core/injection/JNDIObjectFactory.java
 (added)
+++ 
incubator/tuscany/java/sca/core/src/main/java/org/apache/tuscany/core/injection/JNDIObjectFactory.java
 Sat Apr  8 11:00:45 2006
@@ -0,0 +1,46 @@
+/**
+ *
+ * Copyright 2006 The Apache Software Foundation
+ *
+ *  Licensed 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.tuscany.core.injection;
+
+import javax.naming.Context;
+import javax.naming.NamingException;
+
+import org.apache.tuscany.core.builder.ObjectFactory;
+
+/**
+ * An implementation of ObjectFactory that creates instances
+ * by looking them up in a JNDI context.
+ *
+ * @version $Rev$ $Date$
+ */
+public class JNDIObjectFactory<T> implements ObjectFactory<T> {
+    private final Context context;
+    private final String name;
+
+    public JNDIObjectFactory(Context context, String name) {
+        this.context = context;
+        this.name = name;
+    }
+
+    public T getInstance() throws ObjectCreationException {
+        try {
+            return (T) context.lookup(name);
+        } catch (NamingException e) {
+            throw new ObjectCreationException(e);
+        }
+    }
+}

Propchange: 
incubator/tuscany/java/sca/core/src/main/java/org/apache/tuscany/core/injection/JNDIObjectFactory.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
incubator/tuscany/java/sca/core/src/main/java/org/apache/tuscany/core/injection/JNDIObjectFactory.java
------------------------------------------------------------------------------
    svn:keywords = Rev,Date

Added: 
incubator/tuscany/java/sca/core/src/main/java/org/apache/tuscany/core/loader/impl/JNDIPropertyFactory.java
URL: 
http://svn.apache.org/viewcvs/incubator/tuscany/java/sca/core/src/main/java/org/apache/tuscany/core/loader/impl/JNDIPropertyFactory.java?rev=392565&view=auto
==============================================================================
--- 
incubator/tuscany/java/sca/core/src/main/java/org/apache/tuscany/core/loader/impl/JNDIPropertyFactory.java
 (added)
+++ 
incubator/tuscany/java/sca/core/src/main/java/org/apache/tuscany/core/loader/impl/JNDIPropertyFactory.java
 Sat Apr  8 11:00:45 2006
@@ -0,0 +1,62 @@
+/**
+ *
+ * Copyright 2006 The Apache Software Foundation
+ *
+ *  Licensed 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.tuscany.core.loader.impl;
+
+import javax.xml.stream.XMLStreamReader;
+import javax.xml.stream.XMLStreamException;
+import javax.naming.Context;
+import javax.naming.InitialContext;
+import javax.naming.NamingException;
+
+import org.apache.tuscany.core.loader.StAXPropertyFactory;
+import org.apache.tuscany.core.builder.ObjectFactory;
+import org.apache.tuscany.core.config.ConfigurationLoadException;
+import org.apache.tuscany.core.injection.JNDIObjectFactory;
+import org.apache.tuscany.model.assembly.Property;
+
+/**
+ * A StAXPropertyFactory that creates property values by looking them
+ * up in the default JNDI InitialContext.
+ *
+ * This can be used to locate resources in a J2EE environment and inject
+ * them as configuration properties. For example, to access a database
+ * a component could write:
+ * <code>
+ *     &at;Property DataSource myDB;
+ * </code>
+ * and configure with
+ * <code>
+ *     &lt;properties&gt;
+ *       &lt;v:myDb&gt;java:comp/env/jdbc/MyDatabase&lt;/v:myDB&gt;
+ *     &lt;/properties&gt;
+ * </code>
+ *
+ * @version $Rev$ $Date$
+ */
+public class JNDIPropertyFactory implements StAXPropertyFactory {
+    public ObjectFactory<?> createObjectFactory(XMLStreamReader reader, 
Property property) throws XMLStreamException, ConfigurationLoadException {
+        Class<?> type = property.getType();
+        assert type != null : "property type is null";
+        String text = reader.getElementText();
+        try {
+            Context context = new InitialContext();
+            return new JNDIObjectFactory(context, text);
+        } catch (NamingException e) {
+            throw (ConfigurationLoadException) new 
ConfigurationLoadException(e.getMessage()).initCause(e);
+        }
+    }
+}

Propchange: 
incubator/tuscany/java/sca/core/src/main/java/org/apache/tuscany/core/loader/impl/JNDIPropertyFactory.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
incubator/tuscany/java/sca/core/src/main/java/org/apache/tuscany/core/loader/impl/JNDIPropertyFactory.java
------------------------------------------------------------------------------
    svn:keywords = Rev,Date

Added: 
incubator/tuscany/java/sca/core/src/test/java/org/apache/tuscany/core/loader/JNDIPropertyFactoryTestCase.java
URL: 
http://svn.apache.org/viewcvs/incubator/tuscany/java/sca/core/src/test/java/org/apache/tuscany/core/loader/JNDIPropertyFactoryTestCase.java?rev=392565&view=auto
==============================================================================
--- 
incubator/tuscany/java/sca/core/src/test/java/org/apache/tuscany/core/loader/JNDIPropertyFactoryTestCase.java
 (added)
+++ 
incubator/tuscany/java/sca/core/src/test/java/org/apache/tuscany/core/loader/JNDIPropertyFactoryTestCase.java
 Sat Apr  8 11:00:45 2006
@@ -0,0 +1,210 @@
+/**
+ *
+ * Copyright 2006 The Apache Software Foundation
+ *
+ *  Licensed 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.tuscany.core.loader;
+
+import static javax.naming.Context.INITIAL_CONTEXT_FACTORY;
+import java.io.StringReader;
+import java.util.Hashtable;
+import javax.xml.stream.XMLInputFactory;
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamReader;
+import javax.naming.Context;
+import javax.naming.NamingException;
+import javax.naming.Name;
+import javax.naming.NameClassPair;
+import javax.naming.NamingEnumeration;
+import javax.naming.Binding;
+import javax.naming.NameParser;
+import javax.naming.spi.InitialContextFactory;
+
+import junit.framework.TestCase;
+
+import org.apache.tuscany.core.builder.ObjectFactory;
+import org.apache.tuscany.core.config.ConfigurationLoadException;
+import org.apache.tuscany.core.loader.impl.JNDIPropertyFactory;
+import org.apache.tuscany.model.assembly.AssemblyFactory;
+import org.apache.tuscany.model.assembly.Property;
+import org.apache.tuscany.model.assembly.impl.AssemblyFactoryImpl;
+
+/**
+ * @version $Rev$ $Date$
+ */
[EMAIL PROTECTED]({"AccessOfSystemProperties"})
+public class JNDIPropertyFactoryTestCase extends TestCase {
+    private JNDIPropertyFactory factory;
+    private XMLInputFactory xmlFactory;
+    private Property property;
+    private String oldICF;
+
+    public void testLookup() throws XMLStreamException, 
ConfigurationLoadException {
+        String instance = getInstance(String.class, "<foo>foo:/hello</foo>");
+        assertEquals("Hello World", instance);
+    }
+
+    private <T> T getInstance(Class<T> type, String xml) throws 
XMLStreamException, ConfigurationLoadException {
+        property.setType(type);
+        XMLStreamReader reader = xmlFactory.createXMLStreamReader(new 
StringReader(xml));
+        reader.next();
+        ObjectFactory<T> objectFactory = (ObjectFactory<T>) 
factory.createObjectFactory(reader, property);
+        return objectFactory.getInstance();
+    }
+
+    protected void setUp() throws Exception {
+        super.setUp();
+        factory = new JNDIPropertyFactory();
+        xmlFactory = XMLInputFactory.newInstance();
+        AssemblyFactory assemblyFactory = new AssemblyFactoryImpl();
+        property = assemblyFactory.createProperty();
+
+        oldICF = System.getProperty(INITIAL_CONTEXT_FACTORY);
+        System.setProperty(INITIAL_CONTEXT_FACTORY, 
MockContextFactory.class.getName());
+    }
+
+    protected void tearDown() throws Exception {
+        if (oldICF != null) {
+            System.getProperty(INITIAL_CONTEXT_FACTORY, oldICF);
+        }
+        super.tearDown();
+    }
+
+    public static class MockContextFactory implements InitialContextFactory {
+        public Context getInitialContext(Hashtable<?, ?> environment) throws 
NamingException {
+            return new MockContext();
+        }
+    }
+
+    public static class MockContext implements Context {
+        public Object lookup(String name) throws NamingException {
+            if ("foo:/hello".equals(name)) {
+                return "Hello World";
+            }
+            throw new AssertionError();
+        }
+
+        public Object lookup(Name name) throws NamingException {
+            throw new UnsupportedOperationException();
+        }
+
+        public void bind(Name name, Object obj) throws NamingException {
+            throw new UnsupportedOperationException();
+        }
+
+        public void bind(String name, Object obj) throws NamingException {
+            throw new UnsupportedOperationException();
+        }
+
+        public void rebind(Name name, Object obj) throws NamingException {
+            throw new UnsupportedOperationException();
+        }
+
+        public void rebind(String name, Object obj) throws NamingException {
+            throw new UnsupportedOperationException();
+        }
+
+        public void unbind(Name name) throws NamingException {
+            throw new UnsupportedOperationException();
+        }
+
+        public void unbind(String name) throws NamingException {
+            throw new UnsupportedOperationException();
+        }
+
+        public void rename(Name oldName, Name newName) throws NamingException {
+            throw new UnsupportedOperationException();
+        }
+
+        public void rename(String oldName, String newName) throws 
NamingException {
+            throw new UnsupportedOperationException();
+        }
+
+        public NamingEnumeration<NameClassPair> list(Name name) throws 
NamingException {
+            throw new UnsupportedOperationException();
+        }
+
+        public NamingEnumeration<NameClassPair> list(String name) throws 
NamingException {
+            throw new UnsupportedOperationException();
+        }
+
+        public NamingEnumeration<Binding> listBindings(Name name) throws 
NamingException {
+            throw new UnsupportedOperationException();
+        }
+
+        public NamingEnumeration<Binding> listBindings(String name) throws 
NamingException {
+            throw new UnsupportedOperationException();
+        }
+
+        public void destroySubcontext(Name name) throws NamingException {
+            throw new UnsupportedOperationException();
+        }
+
+        public void destroySubcontext(String name) throws NamingException {
+            throw new UnsupportedOperationException();
+        }
+
+        public Context createSubcontext(Name name) throws NamingException {
+            throw new UnsupportedOperationException();
+        }
+
+        public Context createSubcontext(String name) throws NamingException {
+            throw new UnsupportedOperationException();
+        }
+
+        public Object lookupLink(Name name) throws NamingException {
+            throw new UnsupportedOperationException();
+        }
+
+        public Object lookupLink(String name) throws NamingException {
+            throw new UnsupportedOperationException();
+        }
+
+        public NameParser getNameParser(Name name) throws NamingException {
+            throw new UnsupportedOperationException();
+        }
+
+        public NameParser getNameParser(String name) throws NamingException {
+            throw new UnsupportedOperationException();
+        }
+
+        public Name composeName(Name name, Name prefix) throws NamingException 
{
+            throw new UnsupportedOperationException();
+        }
+
+        public String composeName(String name, String prefix) throws 
NamingException {
+            throw new UnsupportedOperationException();
+        }
+
+        public Object addToEnvironment(String propName, Object propVal) throws 
NamingException {
+            throw new UnsupportedOperationException();
+        }
+
+        public Object removeFromEnvironment(String propName) throws 
NamingException {
+            throw new UnsupportedOperationException();
+        }
+
+        public Hashtable<?, ?> getEnvironment() throws NamingException {
+            throw new UnsupportedOperationException();
+        }
+
+        public void close() throws NamingException {
+            throw new UnsupportedOperationException();
+        }
+
+        public String getNameInNamespace() throws NamingException {
+            throw new UnsupportedOperationException();
+        }
+    }
+}

Propchange: 
incubator/tuscany/java/sca/core/src/test/java/org/apache/tuscany/core/loader/JNDIPropertyFactoryTestCase.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
incubator/tuscany/java/sca/core/src/test/java/org/apache/tuscany/core/loader/JNDIPropertyFactoryTestCase.java
------------------------------------------------------------------------------
    svn:keywords = Rev,Date


Reply via email to