You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@aries.apache.org by no...@apache.org on 2012/02/04 23:29:00 UTC
svn commit: r1240631 - 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: not
Date: Sat Feb 4 22:28:17 2012
New Revision: 1240631
URL: http://svn.apache.org/viewvc?rev=1240631&view=rev
Log:
ARIES-823 Suppress calls to ObjectFactorys that can't cope with a non Reference being passed to getObjectInstance.
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=1240631&r1=1240630&r2=1240631&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 Sat Feb 4 22:28:17 2012
@@ -77,14 +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);
- }
-
+ // 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;
}
@@ -94,27 +94,30 @@ public class DirObjectFactoryHelper exte
Hashtable<?, ?> environment,
Attributes attrs)
throws Exception {
-
+
Object result = null;
ServiceReference[] refs = Utils.getReferencesPrivileged(callerContext, DirObjectFactory.class);
if (refs != null) {
- Arrays.sort(refs, Utils.SERVICE_REFERENCE_COMPARATOR);
- for (ServiceReference ref : refs) {
- DirObjectFactory factory = (DirObjectFactory) Utils.getServicePrivileged(callerContext, ref);
-
- try {
- result = factory.getObjectInstance(obj, name, nameCtx, environment, attrs);
- } finally {
- callerContext.ungetService(ref);
- }
-
- // if the result comes back and is not null and not the reference
- // object then we should return the result, so break out of the
- // loop we are in.
- if (result != null && result != obj) {
- break;
- }
- }
+ Arrays.sort(refs, Utils.SERVICE_REFERENCE_COMPARATOR);
+ for (ServiceReference ref : refs) {
+
+ if (canCallObjectFactory(obj, ref)) {
+ DirObjectFactory factory = (DirObjectFactory) Utils.getServicePrivileged(callerContext, ref);
+
+ try {
+ result = factory.getObjectInstance(obj, name, nameCtx, environment, attrs);
+ } finally {
+ callerContext.ungetService(ref);
+ }
+
+ // if the result comes back and is not null and not the reference
+ // object then we should return the result, so break out of the
+ // loop we are in.
+ if (result != null && result != obj) {
+ break;
+ }
+ }
+ }
}
if (result == null) {
@@ -124,6 +127,19 @@ public class DirObjectFactoryHelper exte
return (result == null) ? obj : result;
}
+ private boolean canCallObjectFactory(Object obj, ServiceReference ref)
+ {
+ if (obj instanceof Reference) return true;
+
+ Object prop = ref.getProperty("aries.object.factory.requires.reference");
+
+ if (prop == null) return true;
+
+ if (prop instanceof Boolean) return !!!(Boolean) prop; // if set to true we don't call.
+
+ return true;
+ }
+
private Object getObjectInstanceUsingClassName(Object reference,
String className,
Object obj,
@@ -137,8 +153,8 @@ public class DirObjectFactoryHelper exte
Object result = null;
if (tuple.second != null) {
- try {
- result = ((DirObjectFactory) tuple.second).getObjectInstance(reference, name, nameCtx, environment, attrs);
+ try {
+ result = ((DirObjectFactory) tuple.second).getObjectInstance(reference, name, nameCtx, environment, attrs);
} finally {
defaultContext.ungetService(tuple.first);
}
@@ -156,20 +172,20 @@ public class DirObjectFactoryHelper exte
ObjectFactory factory = null;
ServiceReference[] refs = Utils.getReferencesPrivileged(callerContext, ObjectFactoryBuilder.class);
if (refs != null) {
- Arrays.sort(refs, Utils.SERVICE_REFERENCE_COMPARATOR);
- for (ServiceReference ref : refs) {
- ObjectFactoryBuilder builder = (ObjectFactoryBuilder) Utils.getServicePrivileged(callerContext, ref);
- try {
- factory = builder.createObjectFactory(obj, environment);
- } catch (NamingException e) {
- // TODO: log it
- } finally {
- callerContext.ungetService(ref);
- }
- if (factory != null) {
- break;
- }
- }
+ Arrays.sort(refs, Utils.SERVICE_REFERENCE_COMPARATOR);
+ for (ServiceReference ref : refs) {
+ ObjectFactoryBuilder builder = (ObjectFactoryBuilder) Utils.getServicePrivileged(callerContext, ref);
+ try {
+ factory = builder.createObjectFactory(obj, environment);
+ } catch (NamingException e) {
+ // TODO: log it
+ } finally {
+ callerContext.ungetService(ref);
+ }
+ if (factory != null) {
+ break;
+ }
+ }
}
Object result = null;
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=1240631&r1=1240630&r2=1240631&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 Sat Feb 4 22:28:17 2012
@@ -161,6 +161,7 @@ public class ObjectFactoryHelper impleme
Arrays.sort(refs, Utils.SERVICE_REFERENCE_COMPARATOR);
for (ServiceReference ref : refs) {
+ if (canCallObjectFactory(obj, ref)) {
ObjectFactory factory = (ObjectFactory) Utils.getServicePrivileged(callerContext, ref);
try {
@@ -177,12 +178,26 @@ public class ObjectFactoryHelper impleme
if (result != null && result != obj) {
break;
}
+ }
}
}
return (result == null) ? obj : result;
}
+ private boolean canCallObjectFactory(Object obj, ServiceReference ref)
+ {
+ if (obj instanceof Reference) return true;
+
+ Object prop = ref.getProperty("aries.object.factory.requires.reference");
+
+ if (prop == null) return true;
+
+ if (prop instanceof Boolean) return !!!(Boolean) prop; // if set to true we don't call.
+
+ return true;
+ }
+
protected static String getUrlScheme(String name) {
String scheme = name;
int index = name.indexOf(':');
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=1240631&r1=1240630&r2=1240631&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 Sat Feb 4 22:28:17 2012
@@ -26,16 +26,12 @@ 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;
@@ -185,23 +181,39 @@ public class ObjectFactoryTest
assertSame("The naming manager should have returned the reference object", ref, obj);
}
+ @Test
+ public void testFactoriesThatDoUnsafeCastsAreIgnored() throws Exception {
+ Hashtable<String, Object> props = new Hashtable<String, Object>();
+ props.put("aries.object.factory.requires.reference", Boolean.TRUE);
+ bc.registerService(ObjectFactory.class.getName(), new ObjectFactory() {
+
+ public Object getObjectInstance(Object arg0, Name arg1, Context arg2, Hashtable<?, ?> arg3)
+ throws Exception
+ {
+ return (Reference)arg0;
+ }
+ }, props);
+
+ NamingManager.getObjectInstance("Some dummy data", null, null, env);
+ }
+
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");
- }
+ 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);
+ 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