You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@aries.apache.org by gn...@apache.org on 2018/02/21 09:05:27 UTC

svn commit: r1824947 - in /aries/trunk/jndi/jndi-core/src/main/java/org/apache/aries/jndi: ObjectFactoryHelper.java Utils.java

Author: gnodet
Date: Wed Feb 21 09:05:26 2018
New Revision: 1824947

URL: http://svn.apache.org/viewvc?rev=1824947&view=rev
Log:
[jndi] add a Utils.doPriviledged throwing an exception, factor code

Modified:
    aries/trunk/jndi/jndi-core/src/main/java/org/apache/aries/jndi/ObjectFactoryHelper.java
    aries/trunk/jndi/jndi-core/src/main/java/org/apache/aries/jndi/Utils.java

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=1824947&r1=1824946&r2=1824947&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 Wed Feb 21 09:05:26 2018
@@ -59,7 +59,14 @@ public class ObjectFactoryHelper impleme
                                     Context nameCtx,
                                     Hashtable<?, ?> environment,
                                     Attributes attrs) throws Exception {
+        return Utils.doPrivilegedE(() -> doGetObjectInstance(obj, name, nameCtx, environment, attrs));
+    }
 
+    private Object doGetObjectInstance(Object obj,
+                                    Name name,
+                                    Context nameCtx,
+                                    Hashtable<?, ?> environment,
+                                    Attributes attrs) throws Exception {
         // Step 1
         if (obj instanceof Referenceable) {
             obj = ((Referenceable) obj).getReference();
@@ -113,12 +120,7 @@ public class ObjectFactoryHelper impleme
             if (canCallObjectFactory(obj, ref)) {
                 ObjectFactory factory = Activator.getService(callerContext, ref);
                 if (factory != null) {
-                    Object result;
-                    if (factory instanceof DirObjectFactory) {
-                        result = ((DirObjectFactory) factory).getObjectInstance(obj, name, nameCtx, environment, attrs);
-                    } else {
-                        result = factory.getObjectInstance(obj, name, nameCtx, environment);
-                    }
+                    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.
@@ -150,11 +152,7 @@ public class ObjectFactoryHelper impleme
 
         ObjectFactory factory = ObjectFactoryHelper.findObjectFactoryByClassName(defaultContext, className);
         if (factory != null) {
-            if (factory instanceof DirObjectFactory) {
-                result = ((DirObjectFactory) factory).getObjectInstance(reference, name, nameCtx, environment, attrs);
-            } else {
-                result = factory.getObjectInstance(reference, name, nameCtx, environment);
-            }
+            result = getObjectFromFactory(reference, name, nameCtx, environment, attrs, factory);
         }
 
         return (result == null) ? obj : result;
@@ -181,11 +179,7 @@ public class ObjectFactoryHelper impleme
         Object result = null;
 
         if (factory != null) {
-            if (factory instanceof DirObjectFactory) {
-                result = ((DirObjectFactory) factory).getObjectInstance(obj, name, nameCtx, environment, attrs);
-            } else {
-                result = factory.getObjectInstance(obj, name, nameCtx, environment);
-            }
+            result = getObjectFromFactory(obj, name, nameCtx, environment, attrs, factory);
         }
 
         return (result == null) ? obj : result;
@@ -216,11 +210,7 @@ public class ObjectFactoryHelper impleme
                 }
                 if (logger.isLoggable(Level.FINE)) logger.log(Level.FINE, "cand=" + cand + " factory=" + factory);
                 if (factory != null) {
-                    if (factory instanceof DirObjectFactory) {
-                        result = ((DirObjectFactory) factory).getObjectInstance(obj, name, nameCtx, environment, attrs);
-                    } else {
-                        result = factory.getObjectInstance(obj, name, nameCtx, environment);
-                    }
+                    result = getObjectFromFactory(obj, name, nameCtx, environment, attrs, factory);
                 }
                 if (result != null && result != obj) break;
             }
@@ -246,14 +236,8 @@ public class ObjectFactoryHelper impleme
                 if (factoryService != null) {
                     ObjectFactory factory = factoryService.get();
 
-                    Object result;
-
                     String value = (String) address.getContent();
-                    if (factory instanceof DirObjectFactory) {
-                        result = ((DirObjectFactory) factory).getObjectInstance(value, name, nameCtx, environment, attrs);
-                    } else {
-                        result = factory.getObjectInstance(value, name, nameCtx, environment);
-                    }
+                    Object result = getObjectFromFactory(value, 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
@@ -268,6 +252,16 @@ public class ObjectFactoryHelper impleme
         return obj;
     }
 
+    private Object getObjectFromFactory(Object obj, Name name, Context nameCtx, Hashtable<?, ?> environment, Attributes attrs, ObjectFactory factory) throws Exception {
+        Object result;
+        if (factory instanceof DirObjectFactory) {
+            result = ((DirObjectFactory) factory).getObjectInstance(obj, name, nameCtx, environment, attrs);
+        } else {
+            result = factory.getObjectInstance(obj, name, nameCtx, environment);
+        }
+        return result;
+    }
+
     private static String getUrlScheme(String name) {
         String scheme = name;
         int index = name.indexOf(':');

Modified: aries/trunk/jndi/jndi-core/src/main/java/org/apache/aries/jndi/Utils.java
URL: http://svn.apache.org/viewvc/aries/trunk/jndi/jndi-core/src/main/java/org/apache/aries/jndi/Utils.java?rev=1824947&r1=1824946&r2=1824947&view=diff
==============================================================================
--- aries/trunk/jndi/jndi-core/src/main/java/org/apache/aries/jndi/Utils.java (original)
+++ aries/trunk/jndi/jndi-core/src/main/java/org/apache/aries/jndi/Utils.java Wed Feb 21 09:05:26 2018
@@ -28,10 +28,13 @@ import org.osgi.service.jndi.JNDIConstan
 import javax.naming.NamingException;
 import java.security.AccessController;
 import java.security.PrivilegedAction;
+import java.security.PrivilegedActionException;
+import java.security.PrivilegedExceptionAction;
 import java.util.Hashtable;
 import java.util.Iterator;
 import java.util.Map;
 import java.util.NoSuchElementException;
+import java.util.concurrent.Callable;
 import java.util.function.Function;
 import java.util.function.Supplier;
 
@@ -133,6 +136,24 @@ public final class Utils {
         return AccessController.doPrivileged((PrivilegedAction<T>) action::get);
     }
 
+    public interface Callable<V, E extends Exception> {
+        /**
+         * Computes a result, or throws an exception if unable to do so.
+         *
+         * @return computed result
+         * @throws Exception if unable to compute a result
+         */
+        V call() throws E;
+    }
+
+    public static <T, E extends Exception> T doPrivilegedE(Callable<T, E> action) throws E {
+        try {
+            return AccessController.doPrivileged((PrivilegedExceptionAction<T>) action::call);
+        } catch (PrivilegedActionException e) {
+            throw (E) e.getException();
+        }
+    }
+
     private static class StackFinder extends SecurityManager {
         public Class<?>[] getClassContext() {
             return super.getClassContext();