You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@aries.apache.org by ga...@apache.org on 2010/05/14 20:15:58 UTC
svn commit: r944370 - in /incubator/aries/trunk: jndi/jndi-bundle/
jndi/jndi-core/src/main/java/org/apache/aries/jndi/
jndi/jndi-core/src/main/java/org/apache/aries/jndi/startup/
jndi/jndi-core/src/test/java/org/apache/aries/jndi/ jndi/jndi-url/src/mai...
Author: gawor
Date: Fri May 14 18:15:57 2010
New Revision: 944370
URL: http://svn.apache.org/viewvc?rev=944370&view=rev
Log:
ARIES-311: Security updates and updates in obtaining the callers bundle context and passing it around as per spec
Added:
incubator/aries/trunk/jndi/jndi-core/src/main/java/org/apache/aries/jndi/ProviderAdminServiceFactory.java (with props)
incubator/aries/trunk/jndi/jndi-core/src/main/java/org/apache/aries/jndi/Utils.java (with props)
incubator/aries/trunk/jndi/jndi-url/src/main/java/org/apache/aries/jndi/url/OsgiURLContextServiceFactory.java (with props)
Modified:
incubator/aries/trunk/jndi/jndi-bundle/pom.xml
incubator/aries/trunk/jndi/jndi-core/src/main/java/org/apache/aries/jndi/ContextHelper.java
incubator/aries/trunk/jndi/jndi-core/src/main/java/org/apache/aries/jndi/ContextManagerService.java
incubator/aries/trunk/jndi/jndi-core/src/main/java/org/apache/aries/jndi/ContextManagerServiceFactory.java
incubator/aries/trunk/jndi/jndi-core/src/main/java/org/apache/aries/jndi/DelegateContext.java
incubator/aries/trunk/jndi/jndi-core/src/main/java/org/apache/aries/jndi/DirObjectFactoryHelper.java
incubator/aries/trunk/jndi/jndi-core/src/main/java/org/apache/aries/jndi/OSGiInitialContextFactoryBuilder.java
incubator/aries/trunk/jndi/jndi-core/src/main/java/org/apache/aries/jndi/OSGiObjectFactoryBuilder.java
incubator/aries/trunk/jndi/jndi-core/src/main/java/org/apache/aries/jndi/ObjectFactoryHelper.java
incubator/aries/trunk/jndi/jndi-core/src/main/java/org/apache/aries/jndi/ProviderAdminService.java
incubator/aries/trunk/jndi/jndi-core/src/main/java/org/apache/aries/jndi/startup/Activator.java
incubator/aries/trunk/jndi/jndi-core/src/test/java/org/apache/aries/jndi/ObjectFactoryTest.java
incubator/aries/trunk/jndi/jndi-url/src/main/java/org/apache/aries/jndi/services/ServiceHelper.java
incubator/aries/trunk/jndi/jndi-url/src/main/java/org/apache/aries/jndi/url/AbstractServiceRegistryContext.java
incubator/aries/trunk/jndi/jndi-url/src/main/java/org/apache/aries/jndi/url/Activator.java
incubator/aries/trunk/jndi/jndi-url/src/main/java/org/apache/aries/jndi/url/OsgiURLContextFactory.java
incubator/aries/trunk/jndi/jndi-url/src/main/java/org/apache/aries/jndi/url/ServiceRegistryContext.java
incubator/aries/trunk/jndi/jndi-url/src/main/java/org/apache/aries/jndi/url/ServiceRegistryListContext.java
incubator/aries/trunk/jndi/jndi-url/src/test/java/org/apache/aries/jndi/url/ServiceRegistryContextTest.java
incubator/aries/trunk/testsupport/testsupport-unit/src/main/java/org/apache/aries/mocks/BundleContextMock.java
Modified: incubator/aries/trunk/jndi/jndi-bundle/pom.xml
URL: http://svn.apache.org/viewvc/incubator/aries/trunk/jndi/jndi-bundle/pom.xml?rev=944370&r1=944369&r2=944370&view=diff
==============================================================================
--- incubator/aries/trunk/jndi/jndi-bundle/pom.xml (original)
+++ incubator/aries/trunk/jndi/jndi-bundle/pom.xml Fri May 14 18:15:57 2010
@@ -31,9 +31,9 @@
</description>
<properties>
- <aries.osgi.export.pkg>
- org.osgi.service.jndi
- </aries.osgi.export.pkg>
+ <aries.osgi.export>
+ org.osgi.service.jndi;version="1.0"
+ </aries.osgi.export>
<aries.osgi.private.pkg>
org.apache.aries.jndi*
</aries.osgi.private.pkg>
Modified: incubator/aries/trunk/jndi/jndi-core/src/main/java/org/apache/aries/jndi/ContextHelper.java
URL: http://svn.apache.org/viewvc/incubator/aries/trunk/jndi/jndi-core/src/main/java/org/apache/aries/jndi/ContextHelper.java?rev=944370&r1=944369&r2=944370&view=diff
==============================================================================
--- incubator/aries/trunk/jndi/jndi-core/src/main/java/org/apache/aries/jndi/ContextHelper.java (original)
+++ incubator/aries/trunk/jndi/jndi-core/src/main/java/org/apache/aries/jndi/ContextHelper.java Fri May 14 18:15:57 2010
@@ -18,10 +18,9 @@
*/
package org.apache.aries.jndi;
+import java.security.PrivilegedExceptionAction;
import java.util.Arrays;
-import java.util.Comparator;
import java.util.Hashtable;
-import java.util.Map;
import javax.naming.Context;
import javax.naming.NamingException;
@@ -41,21 +40,22 @@ import org.osgi.service.jndi.JNDIConstan
*/
public final class ContextHelper {
- public static final Comparator<ServiceReference> SERVICE_REFERENCE_COMPARATOR =
- new ServiceReferenceComparator();
-
- /** The bundle context we use for accessing the SR */
- private static BundleContext context;
-
/** Ensure no one constructs us */
private ContextHelper() {
throw new RuntimeException();
}
- public static void setBundleContext(BundleContext ctx) {
- context = ctx;
+ public static Context createURLContext(final BundleContext context,
+ final String urlScheme,
+ final Hashtable<?, ?> env)
+ throws NamingException {
+ return Utils.doPrivilegedNaming(new PrivilegedExceptionAction<Context>() {
+ public Context run() throws Exception {
+ return doCreateURLContext(context, urlScheme, env);
+ }
+ });
}
-
+
/**
* This method is used to create a URL Context. It does this by looking for
* the URL context's ObjectFactory in the service registry.
@@ -65,12 +65,12 @@ public final class ContextHelper {
* @return a Context
* @throws NamingException
*/
- public static Context createURLContext(String urlScheme, Hashtable<?, ?> env)
+ private static Context doCreateURLContext(BundleContext context, String urlScheme, Hashtable<?, ?> env)
throws NamingException {
ServiceReference ref = null;
try {
ServiceReference[] services = context.getServiceReferences(ObjectFactory.class.getName(),
- "(" + JNDIConstants.JNDI_URLSCHEME + "=" + urlScheme + ")");
+ "(" + JNDIConstants.JNDI_URLSCHEME + "=" + urlScheme.trim() + ")");
if (services != null) {
ref = services[0];
@@ -86,7 +86,7 @@ public final class ContextHelper {
if (ref != null) {
ObjectFactory factory = (ObjectFactory) context.getService(ref);
try {
- ctx = (Context) factory.getObjectInstance(null, null, null, env);
+ return (Context) factory.getObjectInstance(null, null, null, env);
} catch (Exception e) {
NamingException e2 = new NamingException();
e2.initCause(e);
@@ -100,7 +100,7 @@ public final class ContextHelper {
return ctx;
}
-
+
public static Context getInitialContext(BundleContext context, Hashtable<?, ?> environment)
throws NamingException {
ContextProvider provider = getContextProvider(context, environment);
@@ -120,9 +120,19 @@ public final class ContextHelper {
}
}
- public static ContextProvider getContextProvider(BundleContext context,
- Hashtable<?, ?> environment)
- throws NamingException {
+ public static ContextProvider getContextProvider(final BundleContext context,
+ final Hashtable<?, ?> environment)
+ throws NamingException {
+ return Utils.doPrivilegedNaming(new PrivilegedExceptionAction<ContextProvider>() {
+ public ContextProvider run() throws Exception {
+ return doGetContextProvider(context, environment);
+ }
+ });
+ }
+
+ private static ContextProvider doGetContextProvider(BundleContext context,
+ Hashtable<?, ?> environment)
+ throws NamingException {
ContextProvider provider = null;
String contextFactoryClass = (String) environment.get(Context.INITIAL_CONTEXT_FACTORY);
if (contextFactoryClass == null) {
@@ -142,7 +152,7 @@ public final class ContextHelper {
}
if (references != null) {
Context initialContext = null;
- Arrays.sort(references, SERVICE_REFERENCE_COMPARATOR);
+ Arrays.sort(references, Utils.SERVICE_REFERENCE_COMPARATOR);
for (ServiceReference reference : references) {
InitialContextFactory factory = (InitialContextFactory) context.getService(reference);
try {
@@ -171,7 +181,7 @@ public final class ContextHelper {
if (references != null && references.length > 0) {
Context initialContext = null;
- Arrays.sort(references, SERVICE_REFERENCE_COMPARATOR);
+ Arrays.sort(references, Utils.SERVICE_REFERENCE_COMPARATOR);
ServiceReference reference = references[0];
InitialContextFactory factory = (InitialContextFactory) context.getService(reference);
try {
@@ -201,7 +211,7 @@ public final class ContextHelper {
ServiceReference[] refs = context.getAllServiceReferences(InitialContextFactoryBuilder.class.getName(), null);
if (refs != null) {
InitialContextFactory factory = null;
- Arrays.sort(refs, SERVICE_REFERENCE_COMPARATOR);
+ Arrays.sort(refs, Utils.SERVICE_REFERENCE_COMPARATOR);
for (ServiceReference ref : refs) {
InitialContextFactoryBuilder builder = (InitialContextFactoryBuilder) context.getService(ref);
try {
@@ -238,23 +248,5 @@ public final class ContextHelper {
return (reference.getBundle() != null);
}
}
-
- private static class ServiceReferenceComparator implements Comparator<ServiceReference> {
- public int compare(ServiceReference o1, ServiceReference o2) {
- return o2.compareTo(o1);
- }
- }
-
- public static Hashtable toHashtable(Map map) {
- Hashtable env;
- if (map instanceof Hashtable) {
- env = (Hashtable) map;
- } else {
- env = new Hashtable();
- if (map != null) {
- env.putAll(map);
- }
- }
- return env;
- }
+
}
Modified: incubator/aries/trunk/jndi/jndi-core/src/main/java/org/apache/aries/jndi/ContextManagerService.java
URL: http://svn.apache.org/viewvc/incubator/aries/trunk/jndi/jndi-core/src/main/java/org/apache/aries/jndi/ContextManagerService.java?rev=944370&r1=944369&r2=944370&view=diff
==============================================================================
--- incubator/aries/trunk/jndi/jndi-core/src/main/java/org/apache/aries/jndi/ContextManagerService.java (original)
+++ incubator/aries/trunk/jndi/jndi-core/src/main/java/org/apache/aries/jndi/ContextManagerService.java Fri May 14 18:15:57 2010
@@ -28,17 +28,18 @@ import javax.naming.Context;
import javax.naming.NamingException;
import javax.naming.directory.DirContext;
-import org.osgi.framework.Bundle;
import org.osgi.framework.BundleContext;
import org.osgi.service.jndi.JNDIContextManager;
public class ContextManagerService implements JNDIContextManager {
private Set<Context> contexts = Collections.synchronizedSet(new HashSet<Context>());
- private Bundle bundle;
+ private BundleContext defaultContext;
+ private BundleContext callerContext;
- public ContextManagerService(Bundle bundle) {
- this.bundle = bundle;
+ public ContextManagerService(BundleContext defaultContext, BundleContext callerContext) {
+ this.defaultContext = defaultContext;
+ this.callerContext = callerContext;
}
public void close() {
@@ -71,9 +72,8 @@ public class ContextManagerService imple
}
private Context getInitialContext(Map environment) throws NamingException {
- BundleContext bundleContext = bundle.getBundleContext();
- Hashtable env = ContextHelper.toHashtable(environment);
- Context context = ContextHelper.getInitialContext(bundleContext, env);
+ Hashtable env = Utils.toHashtable(environment);
+ Context context = ContextHelper.getInitialContext(callerContext, env);
contexts.add(context);
return context;
}
Modified: incubator/aries/trunk/jndi/jndi-core/src/main/java/org/apache/aries/jndi/ContextManagerServiceFactory.java
URL: http://svn.apache.org/viewvc/incubator/aries/trunk/jndi/jndi-core/src/main/java/org/apache/aries/jndi/ContextManagerServiceFactory.java?rev=944370&r1=944369&r2=944370&view=diff
==============================================================================
--- incubator/aries/trunk/jndi/jndi-core/src/main/java/org/apache/aries/jndi/ContextManagerServiceFactory.java (original)
+++ incubator/aries/trunk/jndi/jndi-core/src/main/java/org/apache/aries/jndi/ContextManagerServiceFactory.java Fri May 14 18:15:57 2010
@@ -19,13 +19,20 @@
package org.apache.aries.jndi;
import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
import org.osgi.framework.ServiceFactory;
import org.osgi.framework.ServiceRegistration;
public class ContextManagerServiceFactory implements ServiceFactory {
+ private BundleContext defaultContext;
+
+ public ContextManagerServiceFactory(BundleContext defaultContext) {
+ this.defaultContext = defaultContext;
+ }
+
public Object getService(Bundle bundle, ServiceRegistration registration) {
- return new ContextManagerService(bundle);
+ return new ContextManagerService(defaultContext, bundle.getBundleContext());
}
public void ungetService(Bundle bundle, ServiceRegistration registration, Object service) {
Modified: incubator/aries/trunk/jndi/jndi-core/src/main/java/org/apache/aries/jndi/DelegateContext.java
URL: http://svn.apache.org/viewvc/incubator/aries/trunk/jndi/jndi-core/src/main/java/org/apache/aries/jndi/DelegateContext.java?rev=944370&r1=944369&r2=944370&view=diff
==============================================================================
--- incubator/aries/trunk/jndi/jndi-core/src/main/java/org/apache/aries/jndi/DelegateContext.java (original)
+++ incubator/aries/trunk/jndi/jndi-core/src/main/java/org/apache/aries/jndi/DelegateContext.java Fri May 14 18:15:57 2010
@@ -204,7 +204,7 @@ public class DelegateContext implements
}
if (toReturn != null) {
- String packages = System.getProperty(Context.URL_PKG_PREFIXES, null);
+ String packages = Utils.getSystemProperty(Context.URL_PKG_PREFIXES, null);
if (packages != null) {
toReturn.addToEnvironment(Context.URL_PKG_PREFIXES, packages);
@@ -237,7 +237,7 @@ public class DelegateContext implements
if (index != -1) {
String scheme = name.substring(0, index);
- ctx = ContextHelper.createURLContext(scheme, env);
+ ctx = ContextHelper.createURLContext(bundleContext, scheme, env);
}
if (ctx == null) {
Modified: incubator/aries/trunk/jndi/jndi-core/src/main/java/org/apache/aries/jndi/DirObjectFactoryHelper.java
URL: http://svn.apache.org/viewvc/incubator/aries/trunk/jndi/jndi-core/src/main/java/org/apache/aries/jndi/DirObjectFactoryHelper.java?rev=944370&r1=944369&r2=944370&view=diff
==============================================================================
--- incubator/aries/trunk/jndi/jndi-core/src/main/java/org/apache/aries/jndi/DirObjectFactoryHelper.java (original)
+++ incubator/aries/trunk/jndi/jndi-core/src/main/java/org/apache/aries/jndi/DirObjectFactoryHelper.java Fri May 14 18:15:57 2010
@@ -18,6 +18,7 @@
*/
package org.apache.aries.jndi;
+import java.security.PrivilegedExceptionAction;
import java.util.Arrays;
import java.util.Enumeration;
import java.util.Hashtable;
@@ -34,17 +35,34 @@ import javax.naming.spi.DirObjectFactory
import javax.naming.spi.ObjectFactory;
import javax.naming.spi.ObjectFactoryBuilder;
+import org.osgi.framework.BundleContext;
import org.osgi.framework.InvalidSyntaxException;
import org.osgi.framework.ServiceReference;
import org.osgi.service.jndi.JNDIConstants;
public class DirObjectFactoryHelper extends ObjectFactoryHelper implements DirObjectFactory {
- public Object getObjectInstance(Object obj,
- Name name,
- Context nameCtx,
- Hashtable<?, ?> environment,
- Attributes attrs) throws Exception {
+ public DirObjectFactoryHelper(BundleContext defaultContext, BundleContext callerContext) {
+ super(defaultContext, callerContext);
+ }
+
+ public Object getObjectInstance(final Object obj,
+ final Name name,
+ final Context nameCtx,
+ final Hashtable<?, ?> environment,
+ final Attributes attrs) throws Exception {
+ return Utils.doPrivileged(new PrivilegedExceptionAction<Object>() {
+ public Object run() throws Exception {
+ return 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) {
@@ -91,16 +109,16 @@ public class DirObjectFactoryHelper exte
throws Exception {
Object result = null;
try {
- ServiceReference[] refs = context.getAllServiceReferences(DirObjectFactory.class.getName(), null);
+ ServiceReference[] refs = callerContext.getServiceReferences(DirObjectFactory.class.getName(), null);
if (refs != null) {
- Arrays.sort(refs, ContextHelper.SERVICE_REFERENCE_COMPARATOR);
+ Arrays.sort(refs, Utils.SERVICE_REFERENCE_COMPARATOR);
for (ServiceReference ref : refs) {
- DirObjectFactory factory = (DirObjectFactory) context.getService(ref);
+ DirObjectFactory factory = (DirObjectFactory) callerContext.getService(ref);
try {
result = factory.getObjectInstance(obj, name, nameCtx, environment, attrs);
} finally {
- context.ungetService(ref);
+ callerContext.ungetService(ref);
}
// if the result comes back and is not null and not the reference
@@ -138,7 +156,7 @@ public class DirObjectFactoryHelper exte
DirObjectFactory factory = null;
ServiceReference ref = null;
try {
- ServiceReference[] services = context.getServiceReferences(DirObjectFactory.class.getName(),
+ ServiceReference[] services = callerContext.getServiceReferences(DirObjectFactory.class.getName(),
"(&(" + JNDIConstants.JNDI_URLSCHEME + "=" + urlScheme + "))");
if (services != null && services.length > 0) {
@@ -150,13 +168,13 @@ public class DirObjectFactoryHelper exte
}
if (ref != null) {
- factory = (DirObjectFactory) context.getService(ref);
+ factory = (DirObjectFactory) callerContext.getService(ref);
String value = (String) address.getContent();
try {
result = factory.getObjectInstance(value, name, nameCtx, environment, attrs);
} finally {
- context.ungetService(ref);
+ callerContext.ungetService(ref);
}
// if the result comes back and is not null and not the reference
@@ -183,7 +201,7 @@ public class DirObjectFactoryHelper exte
ServiceReference serviceReference = null;
try {
- ServiceReference[] refs = context.getAllServiceReferences(className, null);
+ ServiceReference[] refs = defaultContext.getServiceReferences(className, null);
if (refs != null && refs.length > 0) {
serviceReference = refs[0];
}
@@ -195,11 +213,11 @@ public class DirObjectFactoryHelper exte
Object result = null;
if (serviceReference != null) {
- DirObjectFactory factory = (DirObjectFactory) context.getService(serviceReference);
+ DirObjectFactory factory = (DirObjectFactory) defaultContext.getService(serviceReference);
try {
result = factory.getObjectInstance(reference, name, nameCtx, environment, attrs);
} finally {
- context.ungetService(serviceReference);
+ defaultContext.ungetService(serviceReference);
}
}
@@ -214,17 +232,17 @@ public class DirObjectFactoryHelper exte
throws Exception {
ObjectFactory factory = null;
try {
- ServiceReference[] refs = context.getServiceReferences(ObjectFactoryBuilder.class.getName(), null);
+ ServiceReference[] refs = callerContext.getServiceReferences(ObjectFactoryBuilder.class.getName(), null);
if (refs != null) {
- Arrays.sort(refs, ContextHelper.SERVICE_REFERENCE_COMPARATOR);
+ Arrays.sort(refs, Utils.SERVICE_REFERENCE_COMPARATOR);
for (ServiceReference ref : refs) {
- ObjectFactoryBuilder builder = (ObjectFactoryBuilder) context.getService(ref);
+ ObjectFactoryBuilder builder = (ObjectFactoryBuilder) callerContext.getService(ref);
try {
factory = builder.createObjectFactory(obj, environment);
} catch (NamingException e) {
// TODO: log it
} finally {
- context.ungetService(ref);
+ callerContext.ungetService(ref);
}
if (factory != null) {
break;
Modified: incubator/aries/trunk/jndi/jndi-core/src/main/java/org/apache/aries/jndi/OSGiInitialContextFactoryBuilder.java
URL: http://svn.apache.org/viewvc/incubator/aries/trunk/jndi/jndi-core/src/main/java/org/apache/aries/jndi/OSGiInitialContextFactoryBuilder.java?rev=944370&r1=944369&r2=944370&view=diff
==============================================================================
--- incubator/aries/trunk/jndi/jndi-core/src/main/java/org/apache/aries/jndi/OSGiInitialContextFactoryBuilder.java (original)
+++ incubator/aries/trunk/jndi/jndi-core/src/main/java/org/apache/aries/jndi/OSGiInitialContextFactoryBuilder.java Fri May 14 18:15:57 2010
@@ -21,7 +21,10 @@ package org.apache.aries.jndi;
import java.util.Hashtable;
import javax.naming.Context;
+import javax.naming.InitialContext;
import javax.naming.NamingException;
+import javax.naming.NoInitialContextException;
+import javax.naming.directory.InitialDirContext;
import javax.naming.spi.InitialContextFactory;
import javax.naming.spi.InitialContextFactoryBuilder;
@@ -43,9 +46,15 @@ public class OSGiInitialContextFactoryBu
public Context getInitialContext(Hashtable<?, ?> environment)
throws NamingException {
- // TODO: use caller's bundle context
-
- return ContextHelper.getInitialContext(_context, environment);
+ BundleContext context = Utils.getBundleContext(environment, InitialContext.class.getName());
+ if (context == null) {
+ context = Utils.getBundleContext(environment, InitialDirContext.class.getName());
+ if (context == null) {
+ throw new NoInitialContextException("Unable to determine caller's BundleContext");
+ }
+ }
+
+ return ContextHelper.getInitialContext(context, environment);
}
}
Modified: incubator/aries/trunk/jndi/jndi-core/src/main/java/org/apache/aries/jndi/OSGiObjectFactoryBuilder.java
URL: http://svn.apache.org/viewvc/incubator/aries/trunk/jndi/jndi-core/src/main/java/org/apache/aries/jndi/OSGiObjectFactoryBuilder.java?rev=944370&r1=944369&r2=944370&view=diff
==============================================================================
--- incubator/aries/trunk/jndi/jndi-core/src/main/java/org/apache/aries/jndi/OSGiObjectFactoryBuilder.java (original)
+++ incubator/aries/trunk/jndi/jndi-core/src/main/java/org/apache/aries/jndi/OSGiObjectFactoryBuilder.java Fri May 14 18:15:57 2010
@@ -25,6 +25,8 @@ import javax.naming.Name;
import javax.naming.NamingException;
import javax.naming.directory.Attributes;
import javax.naming.spi.DirObjectFactory;
+import javax.naming.spi.DirectoryManager;
+import javax.naming.spi.NamingManager;
import javax.naming.spi.ObjectFactory;
import javax.naming.spi.ObjectFactoryBuilder;
@@ -32,10 +34,10 @@ import org.osgi.framework.BundleContext;
public class OSGiObjectFactoryBuilder implements ObjectFactoryBuilder, ObjectFactory, DirObjectFactory {
- private static DirObjectFactoryHelper helper = new DirObjectFactoryHelper();
+ private BundleContext defaultContext;
- public static void setBundleContext(BundleContext ctx) {
- helper.setBundleContext(ctx);
+ public OSGiObjectFactoryBuilder(BundleContext ctx) {
+ defaultContext = ctx;
}
public ObjectFactory createObjectFactory(Object obj, Hashtable<?, ?> environment)
@@ -47,6 +49,11 @@ public class OSGiObjectFactoryBuilder im
Name name,
Context nameCtx,
Hashtable<?, ?> environment) throws Exception {
+ BundleContext callerContext = getCallerBundleContext(environment);
+ if (callerContext == null) {
+ return obj;
+ }
+ DirObjectFactoryHelper helper = new DirObjectFactoryHelper(defaultContext, callerContext);
return helper.getObjectInstance(obj, name, nameCtx, environment);
}
@@ -55,7 +62,19 @@ public class OSGiObjectFactoryBuilder im
Context nameCtx,
Hashtable<?, ?> environment,
Attributes attrs) throws Exception {
+ BundleContext callerContext = getCallerBundleContext(environment);
+ if (callerContext == null) {
+ return obj;
+ }
+ DirObjectFactoryHelper helper = new DirObjectFactoryHelper(defaultContext, callerContext);
return helper.getObjectInstance(obj, name, nameCtx, environment, attrs);
}
+ private BundleContext getCallerBundleContext(Hashtable<?, ?> environment) throws NamingException {
+ BundleContext context = Utils.getBundleContext(environment, NamingManager.class.getName());
+ if (context == null) {
+ context = Utils.getBundleContext(environment, DirectoryManager.class.getName());
+ }
+ return context;
+ }
}
Modified: incubator/aries/trunk/jndi/jndi-core/src/main/java/org/apache/aries/jndi/ObjectFactoryHelper.java
URL: http://svn.apache.org/viewvc/incubator/aries/trunk/jndi/jndi-core/src/main/java/org/apache/aries/jndi/ObjectFactoryHelper.java?rev=944370&r1=944369&r2=944370&view=diff
==============================================================================
--- incubator/aries/trunk/jndi/jndi-core/src/main/java/org/apache/aries/jndi/ObjectFactoryHelper.java (original)
+++ incubator/aries/trunk/jndi/jndi-core/src/main/java/org/apache/aries/jndi/ObjectFactoryHelper.java Fri May 14 18:15:57 2010
@@ -18,6 +18,7 @@
*/
package org.apache.aries.jndi;
+import java.security.PrivilegedExceptionAction;
import java.util.Arrays;
import java.util.Enumeration;
import java.util.Hashtable;
@@ -38,17 +39,30 @@ import org.osgi.framework.ServiceReferen
import org.osgi.service.jndi.JNDIConstants;
public class ObjectFactoryHelper implements ObjectFactory {
-
- protected BundleContext context;
-
- public void setBundleContext(BundleContext ctx) {
- context = ctx;
- }
-
- public Object getObjectInstance(Object obj,
- Name name,
- Context nameCtx,
- Hashtable<?, ?> environment) throws Exception {
+
+ protected BundleContext defaultContext;
+ protected BundleContext callerContext;
+
+ public ObjectFactoryHelper(BundleContext defaultContext, BundleContext callerContext) {
+ this.defaultContext = defaultContext;
+ this.callerContext = callerContext;
+ }
+
+ public Object getObjectInstance(final Object obj,
+ final Name name,
+ final Context nameCtx,
+ final Hashtable<?, ?> environment) throws Exception {
+ return Utils.doPrivileged(new PrivilegedExceptionAction<Object>() {
+ public Object run() throws Exception {
+ return doGetObjectInstance(obj, name, nameCtx, environment);
+ }
+ });
+ }
+
+ private Object doGetObjectInstance(Object obj,
+ Name name,
+ Context nameCtx,
+ Hashtable<?, ?> environment) throws Exception {
// Step 1
if (obj instanceof Referenceable) {
@@ -94,16 +108,16 @@ public class ObjectFactoryHelper impleme
throws Exception {
Object result = null;
try {
- ServiceReference[] refs = context.getAllServiceReferences(ObjectFactory.class.getName(), null);
+ ServiceReference[] refs = callerContext.getServiceReferences(ObjectFactory.class.getName(), null);
if (refs != null) {
- Arrays.sort(refs, ContextHelper.SERVICE_REFERENCE_COMPARATOR);
+ Arrays.sort(refs, Utils.SERVICE_REFERENCE_COMPARATOR);
for (ServiceReference ref : refs) {
- ObjectFactory factory = (ObjectFactory) context.getService(ref);
+ ObjectFactory factory = (ObjectFactory) callerContext.getService(ref);
try {
result = factory.getObjectInstance(obj, name, nameCtx, environment);
} finally {
- context.ungetService(ref);
+ callerContext.ungetService(ref);
}
// if the result comes back and is not null and not the reference
@@ -145,7 +159,7 @@ public class ObjectFactoryHelper impleme
ObjectFactory factory = null;
ServiceReference ref = null;
try {
- ServiceReference[] services = context.getServiceReferences(ObjectFactory.class.getName(),
+ ServiceReference[] services = callerContext.getServiceReferences(ObjectFactory.class.getName(),
"(&(" + JNDIConstants.JNDI_URLSCHEME + "=" + urlScheme + "))");
if (services != null && services.length > 0) {
@@ -157,13 +171,13 @@ public class ObjectFactoryHelper impleme
}
if (ref != null) {
- factory = (ObjectFactory) context.getService(ref);
+ factory = (ObjectFactory) callerContext.getService(ref);
String value = (String) address.getContent();
try {
result = factory.getObjectInstance(value, name, nameCtx, environment);
} finally {
- context.ungetService(ref);
+ callerContext.ungetService(ref);
}
// if the result comes back and is not null and not the reference
@@ -189,7 +203,7 @@ public class ObjectFactoryHelper impleme
ServiceReference serviceReference = null;
try {
- ServiceReference[] refs = context.getAllServiceReferences(className, null);
+ ServiceReference[] refs = defaultContext.getServiceReferences(className, null);
if (refs != null && refs.length > 0) {
serviceReference = refs[0];
}
@@ -201,11 +215,11 @@ public class ObjectFactoryHelper impleme
Object result = null;
if (serviceReference != null) {
- ObjectFactory factory = (ObjectFactory) context.getService(serviceReference);
+ ObjectFactory factory = (ObjectFactory) defaultContext.getService(serviceReference);
try {
result = factory.getObjectInstance(reference, name, nameCtx, environment);
} finally {
- context.ungetService(serviceReference);
+ defaultContext.ungetService(serviceReference);
}
}
@@ -219,17 +233,17 @@ public class ObjectFactoryHelper impleme
throws Exception {
ObjectFactory factory = null;
try {
- ServiceReference[] refs = context.getServiceReferences(ObjectFactoryBuilder.class.getName(), null);
+ ServiceReference[] refs = callerContext.getServiceReferences(ObjectFactoryBuilder.class.getName(), null);
if (refs != null) {
- Arrays.sort(refs, ContextHelper.SERVICE_REFERENCE_COMPARATOR);
+ Arrays.sort(refs, Utils.SERVICE_REFERENCE_COMPARATOR);
for (ServiceReference ref : refs) {
- ObjectFactoryBuilder builder = (ObjectFactoryBuilder) context.getService(ref);
+ ObjectFactoryBuilder builder = (ObjectFactoryBuilder) callerContext.getService(ref);
try {
factory = builder.createObjectFactory(obj, environment);
} catch (NamingException e) {
// TODO: log it
} finally {
- context.ungetService(ref);
+ callerContext.ungetService(ref);
}
if (factory != null) {
break;
Modified: incubator/aries/trunk/jndi/jndi-core/src/main/java/org/apache/aries/jndi/ProviderAdminService.java
URL: http://svn.apache.org/viewvc/incubator/aries/trunk/jndi/jndi-core/src/main/java/org/apache/aries/jndi/ProviderAdminService.java?rev=944370&r1=944369&r2=944370&view=diff
==============================================================================
--- incubator/aries/trunk/jndi/jndi-core/src/main/java/org/apache/aries/jndi/ProviderAdminService.java (original)
+++ incubator/aries/trunk/jndi/jndi-core/src/main/java/org/apache/aries/jndi/ProviderAdminService.java Fri May 14 18:15:57 2010
@@ -32,9 +32,8 @@ public class ProviderAdminService implem
private DirObjectFactoryHelper helper;
- public ProviderAdminService(BundleContext context) {
- helper = new DirObjectFactoryHelper();
- helper.setBundleContext(context);
+ public ProviderAdminService(BundleContext defaultContext, BundleContext callerContext) {
+ helper = new DirObjectFactoryHelper(defaultContext, callerContext);
}
public Object getObjectInstance(Object obj,
@@ -42,7 +41,7 @@ public class ProviderAdminService implem
Context context,
Map environment)
throws Exception {
- Hashtable env = ContextHelper.toHashtable(environment);
+ Hashtable env = Utils.toHashtable(environment);
return helper.getObjectInstance(obj, name, context, env);
}
@@ -52,8 +51,10 @@ public class ProviderAdminService implem
Map environment,
Attributes attributes)
throws Exception {
- Hashtable env = ContextHelper.toHashtable(environment);
+ Hashtable env = Utils.toHashtable(environment);
return helper.getObjectInstance(obj, name, context, env, attributes);
}
+ public void close() {
+ }
}
Added: incubator/aries/trunk/jndi/jndi-core/src/main/java/org/apache/aries/jndi/ProviderAdminServiceFactory.java
URL: http://svn.apache.org/viewvc/incubator/aries/trunk/jndi/jndi-core/src/main/java/org/apache/aries/jndi/ProviderAdminServiceFactory.java?rev=944370&view=auto
==============================================================================
--- incubator/aries/trunk/jndi/jndi-core/src/main/java/org/apache/aries/jndi/ProviderAdminServiceFactory.java (added)
+++ incubator/aries/trunk/jndi/jndi-core/src/main/java/org/apache/aries/jndi/ProviderAdminServiceFactory.java Fri May 14 18:15:57 2010
@@ -0,0 +1,42 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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.aries.jndi;
+
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceFactory;
+import org.osgi.framework.ServiceRegistration;
+
+public class ProviderAdminServiceFactory implements ServiceFactory {
+
+ private BundleContext defaultContext;
+
+ public ProviderAdminServiceFactory(BundleContext defaultContext) {
+ this.defaultContext = defaultContext;
+ }
+
+ public Object getService(Bundle bundle, ServiceRegistration registration) {
+ return new ProviderAdminService(defaultContext, bundle.getBundleContext());
+ }
+
+ public void ungetService(Bundle bundle, ServiceRegistration registration, Object service) {
+ ((ProviderAdminService) service).close();
+ }
+
+}
Propchange: incubator/aries/trunk/jndi/jndi-core/src/main/java/org/apache/aries/jndi/ProviderAdminServiceFactory.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: incubator/aries/trunk/jndi/jndi-core/src/main/java/org/apache/aries/jndi/ProviderAdminServiceFactory.java
------------------------------------------------------------------------------
svn:keywords = Date Revision
Propchange: incubator/aries/trunk/jndi/jndi-core/src/main/java/org/apache/aries/jndi/ProviderAdminServiceFactory.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
Added: incubator/aries/trunk/jndi/jndi-core/src/main/java/org/apache/aries/jndi/Utils.java
URL: http://svn.apache.org/viewvc/incubator/aries/trunk/jndi/jndi-core/src/main/java/org/apache/aries/jndi/Utils.java?rev=944370&view=auto
==============================================================================
--- incubator/aries/trunk/jndi/jndi-core/src/main/java/org/apache/aries/jndi/Utils.java (added)
+++ incubator/aries/trunk/jndi/jndi-core/src/main/java/org/apache/aries/jndi/Utils.java Fri May 14 18:15:57 2010
@@ -0,0 +1,166 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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.aries.jndi;
+
+import java.security.AccessController;
+import java.security.PrivilegedAction;
+import java.security.PrivilegedActionException;
+import java.security.PrivilegedExceptionAction;
+import java.util.Comparator;
+import java.util.Hashtable;
+import java.util.Map;
+
+import javax.naming.NamingException;
+
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.BundleReference;
+import org.osgi.framework.ServiceReference;
+import org.osgi.service.jndi.JNDIConstants;
+
+/**
+ */
+public final class Utils {
+
+ public static final Comparator<ServiceReference> SERVICE_REFERENCE_COMPARATOR =
+ new ServiceReferenceComparator();
+
+ /** Ensure no one constructs us */
+ private Utils() {
+ throw new RuntimeException();
+ }
+
+ private static class StackFinder extends SecurityManager {
+ public Class<?>[] getClassContext() {
+ return super.getClassContext();
+ }
+ }
+
+ /**
+ * @param env
+ * @return the bundle context for the caller.
+ * @throws NamingException
+ */
+ public static BundleContext getBundleContext(final Map<?, ?> env,
+ final String namingClass) {
+ return AccessController.doPrivileged(new PrivilegedAction<BundleContext>() {
+ public BundleContext run() {
+ return doGetBundleContext(env, namingClass);
+ }
+ });
+ }
+
+ private static BundleContext doGetBundleContext(Map<?, ?> env, String namingClass) {
+ BundleContext result = null;
+
+ Object bc = (env == null) ? null : env.get(JNDIConstants.BUNDLE_CONTEXT);
+
+ if (bc != null && bc instanceof BundleContext) {
+ result = (BundleContext) bc;
+ } else {
+ ClassLoader cl = Thread.currentThread().getContextClassLoader();
+ result = getBundleContext(cl);
+ }
+
+ if (result == null) {
+ StackFinder finder = new StackFinder();
+ Class<?>[] classStack = finder.getClassContext();
+
+ // find constructor of given naming class
+ int indexOfConstructor = -1;
+ for (int i = 0 ; i < classStack.length; i++) {
+ if (classStack[i].getName().equals(namingClass)) {
+ indexOfConstructor = i;
+ }
+ }
+
+ // get the caller of the constructor
+ if (indexOfConstructor >= 0 && (indexOfConstructor + 1) < classStack.length) {
+ Class callerClass = classStack[indexOfConstructor + 1];
+ result = getBundleContext(callerClass.getClassLoader());
+ }
+ }
+
+ return result;
+ }
+
+ private static BundleContext getBundleContext(ClassLoader cl2) {
+ ClassLoader cl = cl2;
+ BundleContext result = null;
+ while (result == null && cl != null) {
+ if (cl instanceof BundleReference) {
+ result = ((BundleReference) cl).getBundle().getBundleContext();
+ } else if (cl != null) {
+ cl = cl.getParent();
+ }
+ }
+
+ return result;
+ }
+
+ private static class ServiceReferenceComparator implements Comparator<ServiceReference> {
+ public int compare(ServiceReference o1, ServiceReference o2) {
+ return o2.compareTo(o1);
+ }
+ }
+
+ public static String getSystemProperty(final String key, final String defaultValue) {
+ return AccessController.doPrivileged(new PrivilegedAction<String>() {
+ public String run() {
+ return System.getProperty(key, defaultValue);
+ }
+ });
+ }
+
+ public static Hashtable toHashtable(Map map) {
+ Hashtable env;
+ if (map instanceof Hashtable) {
+ env = (Hashtable) map;
+ } else {
+ env = new Hashtable();
+ if (map != null) {
+ env.putAll(map);
+ }
+ }
+ return env;
+ }
+
+ public static <T> T doPrivileged(PrivilegedExceptionAction<T> action) throws Exception {
+ try {
+ return AccessController.doPrivileged(action);
+ } catch (PrivilegedActionException e) {
+ Exception cause = e.getException();
+ throw cause;
+ }
+ }
+
+ public static <T> T doPrivilegedNaming(PrivilegedExceptionAction<T> action) throws NamingException {
+ try {
+ return AccessController.doPrivileged(action);
+ } catch (PrivilegedActionException e) {
+ Exception cause = e.getException();
+ if (cause instanceof NamingException) {
+ throw (NamingException) cause;
+ } else {
+ NamingException ex = new NamingException(cause.getMessage());
+ ex.initCause(cause);
+ throw ex;
+ }
+ }
+ }
+}
Propchange: incubator/aries/trunk/jndi/jndi-core/src/main/java/org/apache/aries/jndi/Utils.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: incubator/aries/trunk/jndi/jndi-core/src/main/java/org/apache/aries/jndi/Utils.java
------------------------------------------------------------------------------
svn:keywords = Date Revision
Propchange: incubator/aries/trunk/jndi/jndi-core/src/main/java/org/apache/aries/jndi/Utils.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
Modified: incubator/aries/trunk/jndi/jndi-core/src/main/java/org/apache/aries/jndi/startup/Activator.java
URL: http://svn.apache.org/viewvc/incubator/aries/trunk/jndi/jndi-core/src/main/java/org/apache/aries/jndi/startup/Activator.java?rev=944370&r1=944369&r2=944370&view=diff
==============================================================================
--- incubator/aries/trunk/jndi/jndi-core/src/main/java/org/apache/aries/jndi/startup/Activator.java (original)
+++ incubator/aries/trunk/jndi/jndi-core/src/main/java/org/apache/aries/jndi/startup/Activator.java Fri May 14 18:15:57 2010
@@ -36,7 +36,7 @@ import org.apache.aries.jndi.ContextMana
import org.apache.aries.jndi.JREInitialContextFactoryBuilder;
import org.apache.aries.jndi.OSGiInitialContextFactoryBuilder;
import org.apache.aries.jndi.OSGiObjectFactoryBuilder;
-import org.apache.aries.jndi.ProviderAdminService;
+import org.apache.aries.jndi.ProviderAdminServiceFactory;
/**
* The activator for this bundle makes sure the static classes in it are
@@ -47,23 +47,7 @@ public class Activator implements Bundle
private List<ServiceRegistration> registrations = new ArrayList<ServiceRegistration>();
public void start(BundleContext context) {
-
- registrations.add(context.registerService(JNDIProviderAdmin.class.getName(),
- new ProviderAdminService(context),
- null));
-
- registrations.add(context.registerService(InitialContextFactoryBuilder.class.getName(),
- new JREInitialContextFactoryBuilder(),
- null));
-
- ContextManagerServiceFactory contextManagerFactory = new ContextManagerServiceFactory();
- registrations.add(context.registerService(JNDIContextManager.class.getName(),
- contextManagerFactory,
- null));
-
- ContextHelper.setBundleContext(context);
- OSGiObjectFactoryBuilder.setBundleContext(context);
-
+
try {
if (!!!NamingManager.hasInitialContextFactoryBuilder()) {
NamingManager.setInitialContextFactoryBuilder(new OSGiInitialContextFactoryBuilder(context));
@@ -74,13 +58,25 @@ public class Activator implements Bundle
}
try {
- NamingManager.setObjectFactoryBuilder(new OSGiObjectFactoryBuilder());
+ NamingManager.setObjectFactoryBuilder(new OSGiObjectFactoryBuilder(context));
} catch (NamingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalStateException e) {
e.printStackTrace();
}
+
+ registrations.add(context.registerService(JNDIProviderAdmin.class.getName(),
+ new ProviderAdminServiceFactory(context),
+ null));
+
+ registrations.add(context.registerService(InitialContextFactoryBuilder.class.getName(),
+ new JREInitialContextFactoryBuilder(),
+ null));
+
+ registrations.add(context.registerService(JNDIContextManager.class.getName(),
+ new ContextManagerServiceFactory(context),
+ null));
}
public void stop(BundleContext context) {
Modified: incubator/aries/trunk/jndi/jndi-core/src/test/java/org/apache/aries/jndi/ObjectFactoryTest.java
URL: http://svn.apache.org/viewvc/incubator/aries/trunk/jndi/jndi-core/src/test/java/org/apache/aries/jndi/ObjectFactoryTest.java?rev=944370&r1=944369&r2=944370&view=diff
==============================================================================
--- incubator/aries/trunk/jndi/jndi-core/src/test/java/org/apache/aries/jndi/ObjectFactoryTest.java (original)
+++ incubator/aries/trunk/jndi/jndi-core/src/test/java/org/apache/aries/jndi/ObjectFactoryTest.java Fri May 14 18:15:57 2010
@@ -36,6 +36,7 @@ import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.osgi.framework.BundleContext;
+import org.osgi.service.jndi.JNDIConstants;
import org.apache.aries.unittest.mocks.MethodCall;
import org.apache.aries.unittest.mocks.Skeleton;
@@ -47,6 +48,7 @@ import org.apache.aries.mocks.BundleCont
public class ObjectFactoryTest
{
private BundleContext bc;
+ private Hashtable env;
/**
* This method does the setup .
@@ -60,11 +62,9 @@ public class ObjectFactoryTest
{
bc = Skeleton.newMock(new BundleContextMock(), BundleContext.class);
new Activator().start(bc);
-
- Field f = ContextHelper.class.getDeclaredField("context");
- f.setAccessible(true);
- f.set(null, bc);
- OSGiObjectFactoryBuilder.setBundleContext(bc);
+
+ env = new Hashtable();
+ env.put(JNDIConstants.BUNDLE_CONTEXT, bc);
}
/**
@@ -82,7 +82,7 @@ public class ObjectFactoryTest
{
Reference ref = new Reference(null);
ref.add(new StringRefAddr("URL", "wibble"));
- Object obj = NamingManager.getObjectInstance(ref, null, null, null);
+ Object obj = NamingManager.getObjectInstance(ref, null, null, env);
assertSame("The naming manager should have returned the reference object", ref, obj);
}
@@ -101,7 +101,7 @@ public class ObjectFactoryTest
Reference ref = new Reference(null);
ref.add(new StringRefAddr("URL", "wibble"));
- Object obj = NamingManager.getObjectInstance(ref, null, null, null);
+ Object obj = NamingManager.getObjectInstance(ref, null, null, env);
assertEquals("The naming manager should have returned the test object", testObject, obj);
}
@@ -116,7 +116,7 @@ public class ObjectFactoryTest
bc.registerService(ObjectFactory.class.getName(), factory, null);
Reference ref = new Reference(null);
- Object obj = NamingManager.getObjectInstance(ref, null, null, null);
+ Object obj = NamingManager.getObjectInstance(ref, null, null, env);
assertEquals("The naming manager should have returned the test object", testObject, obj);
}
@@ -133,7 +133,7 @@ public class ObjectFactoryTest
bc.registerService(new String[] {ObjectFactory.class.getName(), factory.getClass().getName()},
factory, null);
- Object obj = NamingManager.getObjectInstance(ref, null, null, null);
+ Object obj = NamingManager.getObjectInstance(ref, null, null, env);
assertEquals("The naming manager should have returned the test object", testObject, obj);
}
@@ -150,7 +150,7 @@ public class ObjectFactoryTest
bc.registerService(new String[] {ObjectFactory.class.getName(), factory.getClass().getName()},
factory, null);
- Object obj = NamingManager.getObjectInstance(ref, null, null, null);
+ Object obj = NamingManager.getObjectInstance(ref, null, null, env);
assertSame("The naming manager should have returned the reference object", ref, obj);
}
@@ -160,7 +160,7 @@ public class ObjectFactoryTest
{
Reference ref = new Reference("dummy.class.name");
- Object obj = NamingManager.getObjectInstance(ref, null, null, null);
+ Object obj = NamingManager.getObjectInstance(ref, null, null, env);
assertSame("The naming manager should have returned the reference object", ref, obj);
}
Modified: incubator/aries/trunk/jndi/jndi-url/src/main/java/org/apache/aries/jndi/services/ServiceHelper.java
URL: http://svn.apache.org/viewvc/incubator/aries/trunk/jndi/jndi-url/src/main/java/org/apache/aries/jndi/services/ServiceHelper.java?rev=944370&r1=944369&r2=944370&view=diff
==============================================================================
--- incubator/aries/trunk/jndi/jndi-url/src/main/java/org/apache/aries/jndi/services/ServiceHelper.java (original)
+++ incubator/aries/trunk/jndi/jndi-url/src/main/java/org/apache/aries/jndi/services/ServiceHelper.java Fri May 14 18:15:57 2010
@@ -22,15 +22,11 @@ import java.lang.reflect.InvocationHandl
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
-import java.security.AccessController;
-import java.security.PrivilegedAction;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
-import java.util.HashSet;
import java.util.List;
import java.util.Map;
-import java.util.Set;
import javax.naming.NamingException;
@@ -38,7 +34,6 @@ import org.apache.aries.jndi.url.OsgiNam
import org.apache.aries.util.BundleToClassLoaderAdapter;
import org.osgi.framework.Bundle;
import org.osgi.framework.BundleContext;
-import org.osgi.framework.BundleReference;
import org.osgi.framework.Constants;
import org.osgi.framework.InvalidSyntaxException;
import org.osgi.framework.ServiceException;
@@ -60,12 +55,6 @@ import org.osgi.service.jndi.JNDIConstan
*/
public final class ServiceHelper {
- public static class StackFinder extends SecurityManager {
- public Class<?>[] getClassContext() {
- return super.getClassContext();
- }
- }
-
private static class JNDIServiceDamper implements InvocationHandler {
private BundleContext ctx;
@@ -115,92 +104,8 @@ public final class ServiceHelper {
private Object service;
}
- /**
- * @param env
- * @return the bundle context for the caller.
- * @throws NamingException
- */
- public static BundleContext getBundleContext(Map<String, Object> env) throws NamingException {
- BundleContext result = null;
-
- Object bc = env.get(JNDIConstants.BUNDLE_CONTEXT);
-
- if (bc != null && bc instanceof BundleContext) {
- result = (BundleContext) bc;
- } else {
- ClassLoader cl = AccessController.doPrivileged(new PrivilegedAction<ClassLoader>() {
- public ClassLoader run() {
- return Thread.currentThread().getContextClassLoader();
- }
- });
-
- result = getBundleContext(cl);
- }
-
- if (result == null) {
- StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();
-
- StackFinder finder = new StackFinder();
- Class<?>[] classStack = finder.getClassContext();
-
- boolean found = false;
- boolean foundLookup = false;
- int i = 0;
- for (; i < stackTrace.length && !!!found; i++) {
- if (!!!foundLookup
- && ("lookup".equals(stackTrace[i].getMethodName())
- || "list".equals(stackTrace[i].getMethodName())
- || "listBindings".equals(stackTrace[i].getMethodName()))) {
- foundLookup = true;
- } else if (foundLookup
- && !!!(stackTrace[i].getClassName().startsWith("org.apache.aries.jndi")
- || stackTrace[i].getClassName().startsWith("javax.naming"))) {
- found = true;
- }
- }
-
- if (found) {
- i--; // we need to move back an item because the previous loop
- // leaves us one after where we wanted to be
- Set<Integer> classLoadersChecked = new HashSet<Integer>();
- for (; i < classStack.length && result == null; i++) {
- ClassLoader cl = classStack[i].getClassLoader();
- int hash = System.identityHashCode(cl);
- if (!!!classLoadersChecked.contains(hash)) {
- classLoadersChecked.add(hash);
- result = getBundleContext(cl);
- }
- }
- // Now we walk the stack looking for the BundleContext
- }
- }
-
- if (result == null) {
- throw new NamingException("Unable to find BundleContext");
- }
-
- return result;
- }
-
- private static BundleContext getBundleContext(final ClassLoader cl2) {
- return AccessController.doPrivileged(new PrivilegedAction<BundleContext>() {
- public BundleContext run() {
- ClassLoader cl = cl2;
- BundleContext result = null;
- while (result == null && cl != null) {
- if (cl instanceof BundleReference) {
- result = ((BundleReference) cl).getBundle().getBundleContext();
- } else if (cl != null) {
- cl = cl.getParent();
- }
- }
-
- return result;
- }
- });
- }
-
- public static Object getService(OsgiName lookupName,
+ public static Object getService(BundleContext ctx,
+ OsgiName lookupName,
String id,
boolean dynamicRebind,
Map<String, Object> env) throws NamingException {
@@ -210,8 +115,6 @@ public final class ServiceHelper {
String filter = lookupName.getFilter();
String serviceName = lookupName.getServiceName();
- BundleContext ctx = getBundleContext(env);
-
if (id != null) {
if (filter == null) {
filter = '(' + Constants.SERVICE_ID + '=' + id + ')';
@@ -243,23 +146,11 @@ public final class ServiceHelper {
return result;
}
- private static Object proxy(final String interface1,
- final String filter,
- final boolean rebind,
- final BundleContext ctx,
- final ServicePair pair) {
- return AccessController.doPrivileged(new PrivilegedAction<Object>() {
- public Object run() {
- return proxyPriviledged(interface1, filter, rebind, ctx, pair);
- }
- });
- }
-
- private static Object proxyPriviledged(String interface1,
- String filter,
- boolean dynamicRebind,
- BundleContext ctx,
- ServicePair pair) {
+ private static Object proxy(String interface1,
+ String filter,
+ boolean dynamicRebind,
+ BundleContext ctx,
+ ServicePair pair) {
String[] interfaces = null;
if (interface1 != null) {
interfaces = new String [] { interface1 };
@@ -358,12 +249,12 @@ public final class ServiceHelper {
return p;
}
- public static ServiceReference[] getServiceReferences(String interface1,
+ public static ServiceReference[] getServiceReferences(BundleContext ctx,
+ String interface1,
String filter,
String serviceName,
Map<String, Object> env)
throws NamingException {
- BundleContext ctx = getBundleContext(env);
ServiceReference[] refs = null;
try {
Modified: incubator/aries/trunk/jndi/jndi-url/src/main/java/org/apache/aries/jndi/url/AbstractServiceRegistryContext.java
URL: http://svn.apache.org/viewvc/incubator/aries/trunk/jndi/jndi-url/src/main/java/org/apache/aries/jndi/url/AbstractServiceRegistryContext.java?rev=944370&r1=944369&r2=944370&view=diff
==============================================================================
--- incubator/aries/trunk/jndi/jndi-url/src/main/java/org/apache/aries/jndi/url/AbstractServiceRegistryContext.java (original)
+++ incubator/aries/trunk/jndi/jndi-url/src/main/java/org/apache/aries/jndi/url/AbstractServiceRegistryContext.java Fri May 14 18:15:57 2010
@@ -28,9 +28,12 @@ import javax.naming.NameParser;
import javax.naming.NamingException;
import javax.naming.OperationNotSupportedException;
+import org.osgi.framework.BundleContext;
+
public abstract class AbstractServiceRegistryContext implements Context
{
+ protected BundleContext callerContext;
/** The environment for this context */
protected Map<String, Object> env;
/** The name parser for the service registry name space */
@@ -38,15 +41,17 @@ public abstract class AbstractServiceReg
private static final String ARIES_SERVICES = "aries:services/";
@SuppressWarnings("unchecked")
- public AbstractServiceRegistryContext(Hashtable<?, ?> environment)
+ public AbstractServiceRegistryContext(BundleContext callerContext, Hashtable<?, ?> environment)
{
+ this.callerContext = callerContext;
env = new HashMap<String, Object>();
env.putAll((Map<? extends String, ? extends Object>) environment);
}
@SuppressWarnings("unchecked")
- public AbstractServiceRegistryContext(Map<?, ?> environment)
+ public AbstractServiceRegistryContext(BundleContext callerContext, Map<?, ?> environment)
{
+ this.callerContext = callerContext;
env = new HashMap<String, Object>();
env.putAll((Map<? extends String, ? extends Object>) environment);
}
Modified: incubator/aries/trunk/jndi/jndi-url/src/main/java/org/apache/aries/jndi/url/Activator.java
URL: http://svn.apache.org/viewvc/incubator/aries/trunk/jndi/jndi-url/src/main/java/org/apache/aries/jndi/url/Activator.java?rev=944370&r1=944369&r2=944370&view=diff
==============================================================================
--- incubator/aries/trunk/jndi/jndi-url/src/main/java/org/apache/aries/jndi/url/Activator.java (original)
+++ incubator/aries/trunk/jndi/jndi-url/src/main/java/org/apache/aries/jndi/url/Activator.java Fri May 14 18:15:57 2010
@@ -29,19 +29,16 @@ import org.osgi.service.jndi.JNDIConstan
public class Activator implements BundleActivator {
- private ServiceRegistration reg;
-
- public void start(BundleContext context)
- {
- Hashtable<Object, Object> props = new Hashtable<Object, Object>();
- props.put(JNDIConstants.JNDI_URLSCHEME, new String[] {"osgi", "aries"} );
- reg = context.registerService(ObjectFactory.class.getName(), new OsgiURLContextFactory(), props);
- }
+ private ServiceRegistration reg;
+ public void start(BundleContext context) {
+ Hashtable<Object, Object> props = new Hashtable<Object, Object>();
+ props.put(JNDIConstants.JNDI_URLSCHEME, new String[] { "osgi", "aries" });
+ reg = context.registerService(ObjectFactory.class.getName(), new OsgiURLContextServiceFactory(), props);
+ }
- public void stop(BundleContext context)
- {
- reg.unregister();
- }
+ public void stop(BundleContext context) {
+ reg.unregister();
+ }
}
Modified: incubator/aries/trunk/jndi/jndi-url/src/main/java/org/apache/aries/jndi/url/OsgiURLContextFactory.java
URL: http://svn.apache.org/viewvc/incubator/aries/trunk/jndi/jndi-url/src/main/java/org/apache/aries/jndi/url/OsgiURLContextFactory.java?rev=944370&r1=944369&r2=944370&view=diff
==============================================================================
--- incubator/aries/trunk/jndi/jndi-url/src/main/java/org/apache/aries/jndi/url/OsgiURLContextFactory.java (original)
+++ incubator/aries/trunk/jndi/jndi-url/src/main/java/org/apache/aries/jndi/url/OsgiURLContextFactory.java Fri May 14 18:15:57 2010
@@ -26,55 +26,58 @@ import javax.naming.Name;
import javax.naming.NamingException;
import javax.naming.spi.ObjectFactory;
+import org.osgi.framework.BundleContext;
+
/**
* A factory for the aries JNDI context
*/
-public class OsgiURLContextFactory implements ObjectFactory
-{
- public Object getObjectInstance(Object obj, Name name, Context nameCtx,
- Hashtable<?, ?> environment) throws Exception
- {
- if (obj == null) {
- return new ServiceRegistryContext(environment);
- } else if (obj instanceof String) {
- Context ctx = null;
- try {
-
- ctx = new ServiceRegistryContext(environment);
-
- return ctx.lookup((String)obj);
- } finally {
- if (ctx != null) ctx.close();
- }
- } else if (obj instanceof String[]) {
- // Try each URL until either lookup succeeds or they all fail
- String[] urls = (String[])obj;
- if (urls.length == 0) throw new ConfigurationException("0");
- Context context = new ServiceRegistryContext(environment);
- try
- {
- NamingException ne = null;
- for(int i=0; i< urls.length; i++)
- {
- try
- {
- return context.lookup(urls[i]);
- }
- catch(NamingException e)
- {
- ne = e;
- }
- }
- throw ne;
- }
- finally
- {
- context.close();
- }
-
+public class OsgiURLContextFactory implements ObjectFactory {
+
+ private BundleContext callerContext;
+
+ public OsgiURLContextFactory(BundleContext callerContext) {
+ this.callerContext = callerContext;
}
+
+ public Object getObjectInstance(Object obj,
+ Name name,
+ Context nameCtx,
+ Hashtable<?, ?> environment) throws Exception {
+ if (obj == null) {
+ return new ServiceRegistryContext(callerContext, environment);
+ } else if (obj instanceof String) {
+ Context ctx = null;
+ try {
+ ctx = new ServiceRegistryContext(callerContext, environment);
- return null;
- }
+ return ctx.lookup((String) obj);
+ } finally {
+ if (ctx != null)
+ ctx.close();
+ }
+ } else if (obj instanceof String[]) {
+ // Try each URL until either lookup succeeds or they all fail
+ String[] urls = (String[]) obj;
+ if (urls.length == 0) {
+ throw new ConfigurationException("0");
+ }
+ Context context = new ServiceRegistryContext(callerContext, environment);
+ try {
+ NamingException ne = null;
+ for (int i = 0; i < urls.length; i++) {
+ try {
+ return context.lookup(urls[i]);
+ } catch (NamingException e) {
+ ne = e;
+ }
+ }
+ throw ne;
+ } finally {
+ context.close();
+ }
+ }
+
+ return null;
+ }
}
Added: incubator/aries/trunk/jndi/jndi-url/src/main/java/org/apache/aries/jndi/url/OsgiURLContextServiceFactory.java
URL: http://svn.apache.org/viewvc/incubator/aries/trunk/jndi/jndi-url/src/main/java/org/apache/aries/jndi/url/OsgiURLContextServiceFactory.java?rev=944370&view=auto
==============================================================================
--- incubator/aries/trunk/jndi/jndi-url/src/main/java/org/apache/aries/jndi/url/OsgiURLContextServiceFactory.java (added)
+++ incubator/aries/trunk/jndi/jndi-url/src/main/java/org/apache/aries/jndi/url/OsgiURLContextServiceFactory.java Fri May 14 18:15:57 2010
@@ -0,0 +1,37 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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.aries.jndi.url;
+
+import org.osgi.framework.Bundle;
+import org.osgi.framework.ServiceFactory;
+import org.osgi.framework.ServiceRegistration;
+
+/**
+ * A factory for the aries JNDI context
+ */
+public class OsgiURLContextServiceFactory implements ServiceFactory {
+
+ public Object getService(Bundle bundle, ServiceRegistration registration) {
+ return new OsgiURLContextFactory(bundle.getBundleContext());
+ }
+
+ public void ungetService(Bundle bundle, ServiceRegistration registration, Object service) {
+ }
+
+}
Propchange: incubator/aries/trunk/jndi/jndi-url/src/main/java/org/apache/aries/jndi/url/OsgiURLContextServiceFactory.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: incubator/aries/trunk/jndi/jndi-url/src/main/java/org/apache/aries/jndi/url/OsgiURLContextServiceFactory.java
------------------------------------------------------------------------------
svn:keywords = Date Revision
Propchange: incubator/aries/trunk/jndi/jndi-url/src/main/java/org/apache/aries/jndi/url/OsgiURLContextServiceFactory.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
Modified: incubator/aries/trunk/jndi/jndi-url/src/main/java/org/apache/aries/jndi/url/ServiceRegistryContext.java
URL: http://svn.apache.org/viewvc/incubator/aries/trunk/jndi/jndi-url/src/main/java/org/apache/aries/jndi/url/ServiceRegistryContext.java?rev=944370&r1=944369&r2=944370&view=diff
==============================================================================
--- incubator/aries/trunk/jndi/jndi-url/src/main/java/org/apache/aries/jndi/url/ServiceRegistryContext.java (original)
+++ incubator/aries/trunk/jndi/jndi-url/src/main/java/org/apache/aries/jndi/url/ServiceRegistryContext.java Fri May 14 18:15:57 2010
@@ -18,6 +18,8 @@
*/
package org.apache.aries.jndi.url;
+import java.security.AccessControlException;
+import java.security.AccessController;
import java.util.Hashtable;
import java.util.Map;
@@ -30,112 +32,112 @@ import javax.naming.NamingEnumeration;
import javax.naming.NamingException;
import org.apache.aries.jndi.services.ServiceHelper;
+import org.osgi.framework.AdminPermission;
+import org.osgi.framework.BundleContext;
/**
* A JNDI context for looking stuff up from the service registry.
*/
-public class ServiceRegistryContext extends AbstractServiceRegistryContext implements Context
-{
- /** The parent name, if one is provided, of this context */
- private OsgiName parentName;
-
- /**
- * Why Mr Java this class does indeed take a fine copy of the provided
- * environment. One might imagine that it is worried that the provider is
- * not to be trusted.
- *
- * @param environment
- */
- public ServiceRegistryContext(Hashtable<?, ?> environment)
- {
- super(environment);
- }
-
- public ServiceRegistryContext(OsgiName validName, Map<String, Object> env)
- {
- super(env);
- parentName = validName;
- }
-
- public NamingEnumeration<NameClassPair> list(final Name name) throws NamingException
- {
- return new ServiceRegistryListContext(env, convert(name)).list("");
- }
-
- public NamingEnumeration<NameClassPair> list(String name) throws NamingException
- {
- return list(parse(name));
- }
-
- public NamingEnumeration<Binding> listBindings(final Name name) throws NamingException
- {
- return new ServiceRegistryListContext(env, convert(name)).listBindings("");
- }
-
- public NamingEnumeration<Binding> listBindings(String name) throws NamingException
- {
- return listBindings(parse(name));
- }
-
- public Object lookup(Name name) throws NamingException
- {
- Object result;
-
- OsgiName validName = convert(name);
-
- String pathFragment = validName.getSchemePath();
- String schemeName = validName.getScheme();
-
- if (validName.hasInterface()) {
- if (OsgiName.FRAMEWORK_PATH.equals(pathFragment) && "bundleContext".equals(validName.getServiceName())) {
- result = ServiceHelper.getBundleContext(env);
- } else if ((OsgiName.SERVICE_PATH.equals(pathFragment) && OsgiName.OSGI_SCHEME.equals(schemeName)) ||
- (OsgiName.SERVICES_PATH.equals(pathFragment) && OsgiName.ARIES_SCHEME.equals(schemeName))) {
- result = ServiceHelper.getService(validName, null, true, env);
- } else if (OsgiName.SERVICE_LIST_PATH.equals(pathFragment)) {
- result = new ServiceRegistryListContext(env, validName);
- } else {
- result = null;
- }
- } else {
- result = new ServiceRegistryContext(validName, env);
- }
-
- if (result == null) {
- throw new NameNotFoundException(name.toString());
- }
-
- return result;
- }
-
- private OsgiName convert(Name name) throws NamingException
- {
- OsgiName result;
-
- if (name instanceof OsgiName) {
- result = (OsgiName) name;
- } else {
- if (parentName != null) {
- result = new OsgiName(parentName.toString() + "/" + name.toString());
- } else {
- result = (OsgiName)parser.parse(name.toString());
- }
- }
-
- return result;
- }
-
- private Name parse(String name) throws NamingException
- {
- if (parentName != null) {
- name = parentName.toString() + "/" + name;
- }
-
- return parser.parse(name);
- }
-
- public Object lookup(String name) throws NamingException
- {
- return lookup(parse(name));
- }
+public class ServiceRegistryContext extends AbstractServiceRegistryContext implements Context {
+ /** The parent name, if one is provided, of this context */
+ private OsgiName parentName;
+
+ /**
+ * Why Mr Java this class does indeed take a fine copy of the provided
+ * environment. One might imagine that it is worried that the provider is
+ * not to be trusted.
+ *
+ * @param environment
+ */
+ public ServiceRegistryContext(BundleContext callerContext, Hashtable<?, ?> environment) {
+ super(callerContext, environment);
+ }
+
+ public ServiceRegistryContext(BundleContext callerContext, OsgiName validName, Map<String, Object> env) {
+ super(callerContext, env);
+ parentName = validName;
+ }
+
+ public NamingEnumeration<NameClassPair> list(final Name name) throws NamingException {
+ return new ServiceRegistryListContext(callerContext, env, convert(name)).list("");
+ }
+
+ public NamingEnumeration<NameClassPair> list(String name) throws NamingException {
+ return list(parse(name));
+ }
+
+ public NamingEnumeration<Binding> listBindings(final Name name) throws NamingException {
+ return new ServiceRegistryListContext(callerContext, env, convert(name)).listBindings("");
+ }
+
+ public NamingEnumeration<Binding> listBindings(String name) throws NamingException {
+ return listBindings(parse(name));
+ }
+
+ public Object lookup(Name name) throws NamingException {
+ Object result;
+
+ OsgiName validName = convert(name);
+
+ String pathFragment = validName.getSchemePath();
+ String schemeName = validName.getScheme();
+
+ if (validName.hasInterface()) {
+ if (OsgiName.FRAMEWORK_PATH.equals(pathFragment) && "bundleContext".equals(validName.getServiceName())) {
+ AdminPermission adminPermission =
+ new AdminPermission(callerContext.getBundle(), AdminPermission.CONTEXT);
+ try {
+ AccessController.checkPermission(adminPermission);
+ return callerContext;
+ } catch (AccessControlException accessControlException) {
+ NamingException namingException = new NameNotFoundException("Caller does not have permissions to get BundleContext.");
+ namingException.setRootCause(accessControlException);
+ throw namingException;
+ }
+ } else if ((OsgiName.SERVICE_PATH.equals(pathFragment) && OsgiName.OSGI_SCHEME.equals(schemeName))
+ || (OsgiName.SERVICES_PATH.equals(pathFragment) && OsgiName.ARIES_SCHEME.equals(schemeName))) {
+ result = ServiceHelper.getService(callerContext, validName, null, true, env);
+ } else if (OsgiName.SERVICE_LIST_PATH.equals(pathFragment)) {
+ result = new ServiceRegistryListContext(callerContext, env, validName);
+ } else {
+ result = null;
+ }
+ } else {
+ result = new ServiceRegistryContext(callerContext, validName, env);
+ }
+
+ if (result == null) {
+ throw new NameNotFoundException(name.toString());
+ }
+
+ return result;
+ }
+
+ private OsgiName convert(Name name) throws NamingException {
+ OsgiName result;
+
+ if (name instanceof OsgiName) {
+ result = (OsgiName) name;
+ } else {
+ if (parentName != null) {
+ result = new OsgiName(parentName.toString() + "/" + name.toString());
+ } else {
+ result = (OsgiName) parser.parse(name.toString());
+ }
+ }
+
+ return result;
+ }
+
+ private Name parse(String name) throws NamingException {
+ if (parentName != null) {
+ name = parentName.toString() + "/" + name;
+ }
+
+ return parser.parse(name);
+ }
+
+ public Object lookup(String name) throws NamingException {
+ return lookup(parse(name));
+ }
}
Modified: incubator/aries/trunk/jndi/jndi-url/src/main/java/org/apache/aries/jndi/url/ServiceRegistryListContext.java
URL: http://svn.apache.org/viewvc/incubator/aries/trunk/jndi/jndi-url/src/main/java/org/apache/aries/jndi/url/ServiceRegistryListContext.java?rev=944370&r1=944369&r2=944370&view=diff
==============================================================================
--- incubator/aries/trunk/jndi/jndi-url/src/main/java/org/apache/aries/jndi/url/ServiceRegistryListContext.java (original)
+++ incubator/aries/trunk/jndi/jndi-url/src/main/java/org/apache/aries/jndi/url/ServiceRegistryListContext.java Fri May 14 18:15:57 2010
@@ -94,9 +94,9 @@ public class ServiceRegistryListContext
}
- public ServiceRegistryListContext(Map<String, Object> env, OsgiName validName)
+ public ServiceRegistryListContext(BundleContext callerContext, Map<String, Object> env, OsgiName validName)
{
- super(env);
+ super(callerContext, env);
parentName = validName;
}
@@ -109,10 +109,9 @@ public class ServiceRegistryListContext
{
if (!!!"".equals(name)) throw new NameNotFoundException(name);
- final BundleContext ctx = ServiceHelper.getBundleContext(env);
- final ServiceReference[] refs = ServiceHelper.getServiceReferences(parentName.getInterface(), parentName.getFilter(), parentName.getServiceName(), env);
+ final ServiceReference[] refs = ServiceHelper.getServiceReferences(callerContext, parentName.getInterface(), parentName.getFilter(), parentName.getServiceName(), env);
- return new ServiceNamingEnumeration<NameClassPair>(ctx, refs, new ThingManager<NameClassPair>() {
+ return new ServiceNamingEnumeration<NameClassPair>(callerContext, refs, new ThingManager<NameClassPair>() {
public NameClassPair get(BundleContext ctx, ServiceReference ref)
{
String serviceId = String.valueOf(ref.getProperty(Constants.SERVICE_ID));
@@ -142,10 +141,9 @@ public class ServiceRegistryListContext
{
if (!!!"".equals(name)) throw new NameNotFoundException(name);
- final BundleContext ctx = ServiceHelper.getBundleContext(env);
- final ServiceReference[] refs = ServiceHelper.getServiceReferences(parentName.getInterface(), parentName.getFilter(), parentName.getServiceName(), env);
+ final ServiceReference[] refs = ServiceHelper.getServiceReferences(callerContext, parentName.getInterface(), parentName.getFilter(), parentName.getServiceName(), env);
- return new ServiceNamingEnumeration<Binding>(ctx, refs, new ThingManager<Binding>() {
+ return new ServiceNamingEnumeration<Binding>(callerContext, refs, new ThingManager<Binding>() {
public Binding get(BundleContext ctx, ServiceReference ref)
{
String serviceId = String.valueOf(ref.getProperty(Constants.SERVICE_ID));
@@ -171,7 +169,7 @@ public class ServiceRegistryListContext
{
Object result = null;
- result = ServiceHelper.getService(parentName, name, false, env);
+ result = ServiceHelper.getService(callerContext, parentName, name, false, env);
if (result == null) {
throw new NameNotFoundException(name.toString());
Modified: incubator/aries/trunk/jndi/jndi-url/src/test/java/org/apache/aries/jndi/url/ServiceRegistryContextTest.java
URL: http://svn.apache.org/viewvc/incubator/aries/trunk/jndi/jndi-url/src/test/java/org/apache/aries/jndi/url/ServiceRegistryContextTest.java?rev=944370&r1=944369&r2=944370&view=diff
==============================================================================
--- incubator/aries/trunk/jndi/jndi-url/src/test/java/org/apache/aries/jndi/url/ServiceRegistryContextTest.java (original)
+++ incubator/aries/trunk/jndi/jndi-url/src/test/java/org/apache/aries/jndi/url/ServiceRegistryContextTest.java Fri May 14 18:15:57 2010
@@ -55,6 +55,7 @@ import org.osgi.framework.ServiceExcepti
import org.osgi.framework.ServiceFactory;
import org.osgi.framework.ServiceReference;
import org.osgi.framework.ServiceRegistration;
+import org.osgi.service.jndi.JNDIConstants;
/**
* Tests for our JNDI implementation for the service registry.
@@ -80,14 +81,9 @@ public class ServiceRegistryContextTest
public void registerService() throws NamingException, SecurityException, NoSuchFieldException, IllegalArgumentException, IllegalAccessException
{
bc = Skeleton.newMock(new BundleContextMock(), BundleContext.class);
- new Activator().start(bc);
new org.apache.aries.jndi.startup.Activator().start(bc);
-
- Field f = ContextHelper.class.getDeclaredField("context");
- f.setAccessible(true);
- f.set(null, bc);
- OSGiObjectFactoryBuilder.setBundleContext(bc);
-
+ new Activator().start(bc);
+
service = Skeleton.newMock(Runnable.class);
registerService(service);
@@ -200,7 +196,7 @@ public class ServiceRegistryContextTest
InitialContext ctx = new InitialContext(new Hashtable<Object, Object>());
- BundleMock mock = new BundleMock("scooby.doo", new Properties());
+ BundleMock mock = new BundleMock("scooby.doo.1", new Properties());
Thread.currentThread().setContextClassLoader(mock.getClassLoader());
@@ -216,7 +212,9 @@ public class ServiceRegistryContextTest
skel.assertCalled(new MethodCall(BundleContext.class, "getServiceReferences", "java.lang.Runnable", null));
- mock = new BundleMock("scooby.doo", new Properties());
+ ctx = new InitialContext(new Hashtable<Object, Object>());
+
+ mock = new BundleMock("scooby.doo.2", new Properties());
Thread.currentThread().setContextClassLoader(mock.getClassLoader());
@@ -233,7 +231,7 @@ public class ServiceRegistryContextTest
s.run();
Skeleton.getSkeleton(service).assertCalledExactNumberOfTimes(new MethodCall(Runnable.class, "run"), 2);
-
+
skel = Skeleton.getSkeleton(mock.getBundleContext());
skel.assertCalled(new MethodCall(BundleContext.class, "getServiceReferences", "java.lang.Runnable", null));
}
Modified: incubator/aries/trunk/testsupport/testsupport-unit/src/main/java/org/apache/aries/mocks/BundleContextMock.java
URL: http://svn.apache.org/viewvc/incubator/aries/trunk/testsupport/testsupport-unit/src/main/java/org/apache/aries/mocks/BundleContextMock.java?rev=944370&r1=944369&r2=944370&view=diff
==============================================================================
--- incubator/aries/trunk/testsupport/testsupport-unit/src/main/java/org/apache/aries/mocks/BundleContextMock.java (original)
+++ incubator/aries/trunk/testsupport/testsupport-unit/src/main/java/org/apache/aries/mocks/BundleContextMock.java Fri May 14 18:15:57 2010
@@ -412,8 +412,7 @@ public class BundleContextMock
e.printStackTrace();
}
- ServiceFactory factory = new MockServiceFactory(service);
- return registerService(new String[] {interFace}, factory, properties);
+ return registerService(new String[] {interFace}, service, properties);
}
/**