You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@aries.apache.org by mn...@apache.org on 2012/02/03 11:39:09 UTC

svn commit: r1240069 - in /aries/trunk/jndi/jndi-core/src: main/java/org/apache/aries/jndi/DirObjectFactoryHelper.java main/java/org/apache/aries/jndi/ObjectFactoryHelper.java test/java/org/apache/aries/jndi/ObjectFactoryTest.java

Author: mnuttall
Date: Fri Feb  3 10:39:09 2012
New Revision: 1240069

URL: http://svn.apache.org/viewvc?rev=1240069&view=rev
Log:
Aries-822: Add support for Context.OBJECT_FACTORIES to jndi.core

Modified:
    aries/trunk/jndi/jndi-core/src/main/java/org/apache/aries/jndi/DirObjectFactoryHelper.java
    aries/trunk/jndi/jndi-core/src/main/java/org/apache/aries/jndi/ObjectFactoryHelper.java
    aries/trunk/jndi/jndi-core/src/test/java/org/apache/aries/jndi/ObjectFactoryTest.java

Modified: aries/trunk/jndi/jndi-core/src/main/java/org/apache/aries/jndi/DirObjectFactoryHelper.java
URL: http://svn.apache.org/viewvc/aries/trunk/jndi/jndi-core/src/main/java/org/apache/aries/jndi/DirObjectFactoryHelper.java?rev=1240069&r1=1240068&r2=1240069&view=diff
==============================================================================
--- aries/trunk/jndi/jndi-core/src/main/java/org/apache/aries/jndi/DirObjectFactoryHelper.java (original)
+++ aries/trunk/jndi/jndi-core/src/main/java/org/apache/aries/jndi/DirObjectFactoryHelper.java Fri Feb  3 10:39:09 2012
@@ -77,6 +77,14 @@ public class DirObjectFactoryHelper exte
             }
         }
 
+		// Extra, non-standard, bonus step. If javax.naming.OBJECT_FACTORIES is set as 
+		// a property in the environment, use its value to construct additional object factories. 
+		// Added under Aries-822, with reference 
+		// to https://www.osgi.org/bugzilla/show_bug.cgi?id=138 
+		if (result == null || result == obj) {
+			result = getObjectInstanceViaContextDotObjectFactories(obj, name, nameCtx, environment);
+		} 
+		
         return (result == null) ? obj : result;
     }
 

Modified: aries/trunk/jndi/jndi-core/src/main/java/org/apache/aries/jndi/ObjectFactoryHelper.java
URL: http://svn.apache.org/viewvc/aries/trunk/jndi/jndi-core/src/main/java/org/apache/aries/jndi/ObjectFactoryHelper.java?rev=1240069&r1=1240068&r2=1240069&view=diff
==============================================================================
--- aries/trunk/jndi/jndi-core/src/main/java/org/apache/aries/jndi/ObjectFactoryHelper.java (original)
+++ aries/trunk/jndi/jndi-core/src/main/java/org/apache/aries/jndi/ObjectFactoryHelper.java Fri Feb  3 10:39:09 2012
@@ -23,6 +23,8 @@ import java.security.PrivilegedAction;
 import java.util.Arrays;
 import java.util.Enumeration;
 import java.util.Hashtable;
+import java.util.logging.Level;
+import java.util.logging.Logger;
 
 import javax.naming.Context;
 import javax.naming.Name;
@@ -43,6 +45,7 @@ public class ObjectFactoryHelper impleme
     
     protected BundleContext defaultContext;
     protected BundleContext callerContext;
+    private static final Logger logger = Logger.getLogger(ObjectFactoryHelper.class.getName());
 
     public ObjectFactoryHelper(BundleContext defaultContext, BundleContext callerContext) {
         this.defaultContext = defaultContext;
@@ -58,6 +61,8 @@ public class ObjectFactoryHelper impleme
         if (obj instanceof Referenceable) {
             obj = ((Referenceable) obj).getReference();
         }
+        
+        logger.log(Level.FINE, "obj = " + obj);
 
         Object result = obj;
 
@@ -74,22 +79,75 @@ public class ObjectFactoryHelper impleme
                 result = getObjectInstanceUsingRefAddress(ref.getAll(), obj, name, nameCtx, environment);
             }
         }
+        
+		logger.log(Level.FINE, "Step 4: result = " + result);
 
         // Step 5 - if we still don't have a resolved object goto the object factory builds in the SR.
         if (result == null || result == obj) {
             result = getObjectInstanceUsingObjectFactoryBuilders(obj, name, nameCtx, environment);
         }
 
-        // Step 6 - finally as a last ditch effort attempt to use all the registered ObjectFactories in the SR.
+		logger.log(Level.FINE, "Step 5: result = " + result);
+
+        // Step 6 - Attempt to use all the registered ObjectFactories in the SR.
         if (result == null || result == obj) {                
             if ((obj instanceof Reference && ((Reference) obj).getFactoryClassName() == null) ||
                 !(obj instanceof Reference)) {
                 result = getObjectInstanceUsingObjectFactories(obj, name, nameCtx, environment);
             }
         }
+ 
+		logger.log(Level.FINE, "Step 6: result = " + result);
+
+		// Extra, non-standard, bonus step 7. If javax.naming.OBJECT_FACTORIES is set as 
+		// a property in the environment, use its value to construct additional object factories. 
+		// Added under Aries-822, with reference 
+		// to https://www.osgi.org/bugzilla/show_bug.cgi?id=138 
+		if (result == null || result == obj) {
+			result = getObjectInstanceViaContextDotObjectFactories(obj, name, nameCtx, environment);
+		} 
+		
+		logger.log(Level.FINE, "Step 7: result = " + result);
 
         return (result == null) ? obj : result;
     }
+    
+    /*
+     * Attempt to obtain an Object instance via the java.naming.factory.object property
+     */
+    protected Object getObjectInstanceViaContextDotObjectFactories(Object obj,
+            Name name,
+            Context nameCtx,
+            Hashtable<?, ?> environment) throws Exception
+    {
+    	Object result = null;
+    	String factories = (String) environment.get(Context.OBJECT_FACTORIES);
+		if (factories != null && factories.length() > 0) {
+			String[] candidates = factories.split(":");
+			ClassLoader cl = AccessController.doPrivileged(new PrivilegedAction<ClassLoader>() {
+				public ClassLoader run() {
+					return Thread.currentThread().getContextClassLoader();
+				}
+			});
+			for (String cand : candidates) {
+				ObjectFactory factory = null;
+				try {
+					@SuppressWarnings("unchecked")
+					Class<ObjectFactory> clz = (Class<ObjectFactory>) cl.loadClass(cand);
+					factory = clz.newInstance();
+				} catch (Exception e) {
+					logger.log(Level.FINE, "Exception instantiating factory: " + e);
+					continue;
+				}
+				logger.log(Level.FINE, "cand=" + cand + " factory=" + factory);
+				if (factory != null) {
+					result = factory.getObjectInstance(obj, name, nameCtx, environment);
+				}
+				if (result != null && result != obj) break;
+			}
+		}
+		return (result == null) ? obj : result;
+    }
 
     protected Object getObjectInstanceUsingObjectFactories(Object obj,
                                                            Name name,

Modified: aries/trunk/jndi/jndi-core/src/test/java/org/apache/aries/jndi/ObjectFactoryTest.java
URL: http://svn.apache.org/viewvc/aries/trunk/jndi/jndi-core/src/test/java/org/apache/aries/jndi/ObjectFactoryTest.java?rev=1240069&r1=1240068&r2=1240069&view=diff
==============================================================================
--- aries/trunk/jndi/jndi-core/src/test/java/org/apache/aries/jndi/ObjectFactoryTest.java (original)
+++ aries/trunk/jndi/jndi-core/src/test/java/org/apache/aries/jndi/ObjectFactoryTest.java Fri Feb  3 10:39:09 2012
@@ -20,17 +20,22 @@ package org.apache.aries.jndi;
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertSame;
+import static org.junit.Assert.assertTrue;
 
 import java.util.Hashtable;
 import java.util.Properties;
 
 import javax.naming.Context;
+import javax.naming.InitialContext;
 import javax.naming.Name;
+import javax.naming.NamingException;
 import javax.naming.Reference;
 import javax.naming.StringRefAddr;
 import javax.naming.spi.NamingManager;
 import javax.naming.spi.ObjectFactory;
 
+import junit.framework.Assert;
+
 import org.apache.aries.jndi.startup.Activator;
 import org.apache.aries.jndi.urls.URLObjectFactoryFinder;
 import org.apache.aries.mocks.BundleContextMock;
@@ -179,4 +184,24 @@ public class ObjectFactoryTest
 
     assertSame("The naming manager should have returned the reference object", ref, obj);
   }
+  
+  public static class DummyObjectFactory implements ObjectFactory {
+
+		public Object getObjectInstance(Object obj, Name name, Context nameCtx,
+				Hashtable<?, ?> environment) throws Exception {
+			// TODO Auto-generated method stub
+			return new String ("pass");
+		}
+  }
+	  
+  @Test
+  public void testContextDotObjectFactories() throws Exception { 
+	  env.put(Context.OBJECT_FACTORIES, "org.apache.aries.jndi.ObjectFactoryTest$DummyObjectFactory");
+	  Reference ref = new Reference("anything");
+	  Object obj = NamingManager.getObjectInstance(ref, null, null, env);
+	  assertTrue (obj instanceof String);
+	  assertEquals ((String)obj, "pass");
+	  env.remove(Context.OBJECT_FACTORIES);
+  }
+
 }
\ No newline at end of file