This is an automated email from the ASF dual-hosted git repository.
sbratton pushed a commit to branch trunk
in repository https://gitbox.apache.org/repos/asf/aries.git
The following commit(s) were added to refs/heads/trunk by this push:
new 34a60ab [jndi][ARIES-2000] Swallow exceptions when trying every
ObjectFactory from NamingManager.getObjectInstance()
new eb912a8 Merge pull request #113 from chackoj/ARIES-2000
34a60ab is described below
commit 34a60abeb4e574c3e0cf0f61d4955ae07f48e027
Author: Joe Chacko <[email protected]>
AuthorDate: Tue Sep 15 11:12:20 2020 +0100
[jndi][ARIES-2000] Swallow exceptions when trying every ObjectFactory from
NamingManager.getObjectInstance()
---
.../org/apache/aries/jndi/ObjectFactoryHelper.java | 28 ++++++++++++++--------
.../org/apache/aries/jndi/ObjectFactoryTest.java | 14 ++++++++++-
2 files changed, 31 insertions(+), 11 deletions(-)
diff --git
a/jndi/jndi-core/src/main/java/org/apache/aries/jndi/ObjectFactoryHelper.java
b/jndi/jndi-core/src/main/java/org/apache/aries/jndi/ObjectFactoryHelper.java
index 9f82ddf..9146640 100644
---
a/jndi/jndi-core/src/main/java/org/apache/aries/jndi/ObjectFactoryHelper.java
+++
b/jndi/jndi-core/src/main/java/org/apache/aries/jndi/ObjectFactoryHelper.java
@@ -27,13 +27,13 @@ import javax.naming.directory.Attributes;
import javax.naming.spi.DirObjectFactory;
import javax.naming.spi.ObjectFactory;
import javax.naming.spi.ObjectFactoryBuilder;
-import java.security.AccessController;
-import java.security.PrivilegedAction;
import java.util.Enumeration;
import java.util.Hashtable;
import java.util.logging.Level;
import java.util.logging.Logger;
+import static org.osgi.service.jndi.JNDIConstants.JNDI_URLSCHEME;
+
public class ObjectFactoryHelper implements ObjectFactory {
private static final Logger logger =
Logger.getLogger(ObjectFactoryHelper.class.getName());
@@ -120,13 +120,15 @@ public class ObjectFactoryHelper implements ObjectFactory
{
if (canCallObjectFactory(obj, ref)) {
ObjectFactory factory = Activator.getService(callerContext,
ref);
if (factory != null) {
- Object result = getObjectFromFactory(obj, name, nameCtx,
environment, attrs, factory);
- // 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) {
- return result;
- }
+ try {
+ Object result = getObjectFromFactory(obj, name,
nameCtx, environment, attrs, factory);
+ // 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) {
+ return result;
+ }
+ } catch (Exception ignored) {} // only care about
factories that CAN transform this object
}
}
}
@@ -136,7 +138,13 @@ public class ObjectFactoryHelper implements ObjectFactory {
private boolean canCallObjectFactory(Object obj, ServiceReference ref) {
if (obj instanceof Reference) return true;
Object prop =
ref.getProperty("aries.object.factory.requires.reference");
- return (prop == null) || !(prop instanceof Boolean) || !(Boolean) prop;
+ // if the ObjectFactory needs a reference, then give up straight away
+ if (Boolean.TRUE.equals(prop)) return false;
+ // ObjectFactory services with an osgi.jndi.url.scheme property are
only for converting URLs
+ if (ref.getProperty(JNDI_URLSCHEME) != null) return false;
+ // TODO: ObjectFactory services registered with their implementation
class names are for References that specify the ObjectFactory class
+ // We've eliminated all other possibilities, so this factory IS
callable.
+ return true;
}
private Object getObjectInstanceUsingClassName(Object reference,
diff --git
a/jndi/jndi-core/src/test/java/org/apache/aries/jndi/ObjectFactoryTest.java
b/jndi/jndi-core/src/test/java/org/apache/aries/jndi/ObjectFactoryTest.java
index 378a4bf..f2aae06 100644
--- a/jndi/jndi-core/src/test/java/org/apache/aries/jndi/ObjectFactoryTest.java
+++ b/jndi/jndi-core/src/test/java/org/apache/aries/jndi/ObjectFactoryTest.java
@@ -198,6 +198,19 @@ public class ObjectFactoryTest {
env.remove(Context.OBJECT_FACTORIES);
}
+ @Test
+ public void testObjectFactoryThatThrowsIsIgnored() throws Exception {
+ final ObjectFactory factory = Skeleton.newMock(ObjectFactory.class);
+ bc.registerService(ObjectFactory.class.getName(), factory, null);
+ final Skeleton skeleton = Skeleton.getSkeleton(factory);
+ final MethodCall getObjectInstance = new
MethodCall(ObjectFactory.class, "getObjectInstance", Object.class, Name.class,
Context.class, Hashtable.class);
+ skeleton.setThrows(getObjectInstance, new Exception());
+ Object original = new Object(){};
+ Object processed = NamingManager.getObjectInstance(original, null,
null, env);
+ skeleton.assertCalled(getObjectInstance);
+ assertEquals("The original object should be returned despite the
object factory throwing an exception", original, processed);
+ }
+
public static class DummyObjectFactory implements ObjectFactory {
public Object getObjectInstance(Object obj, Name name, Context nameCtx,
@@ -206,5 +219,4 @@ public class ObjectFactoryTest {
return new String("pass");
}
}
-
}
\ No newline at end of file