Using RepositoryAccessor inside a bundle
----------------------------------------
Key: SLING-2018
URL: https://issues.apache.org/jira/browse/SLING-2018
Project: Sling
Issue Type: Bug
Components: JCR
Affects Versions: 3
Environment: org.apache.sling.jcr.base 1065652 revision
Reporter: Luca Stancapiano
I install a bundle with a Felix activator inside the Sling/Felix version
builded from the trunk.
Here the code inside the activate method:
RepositoryAccessor repositoryAccessor = new
RepositoryAccessor();
Repository repository =
repositoryAccessor.getRepositoryFromURL("jndi://jackrabbit:java.naming.factory.initial=org.apache.jackrabbit.core.jndi.provider.DummyInitialContextFactory,java.naming.provider.url=localhost");
I get this Exception:
javax.naming.NoInitialContextException: Cannot instantiate class:
org.apache.jackrabbit.core.jndi.provider.DummyInitialContextFactory [Root
exception is java.lang.ClassNotFoundException:
org.apache.jackrabbit.core.jndi.provider.DummyInitialContextFactory]
at
javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:657)
at
javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:288)
at javax.naming.InitialContext.init(InitialContext.java:223)
at javax.naming.InitialContext.<init>(InitialContext.java:197)
at
org.apache.sling.jcr.base.util.RepositoryAccessor.getRepository(RepositoryAccessor.java:75)
at
org.apache.sling.jcr.base.util.RepositoryAccessor.getRepositoryFromURL(RepositoryAccessor.java:171)
at com.sourcesense.stone.jcr.base.Activator.start(Activator.java:32)
at
org.apache.felix.framework.util.SecureAction.startActivator(SecureAction.java:629)
at org.apache.felix.framework.Felix.activateBundle(Felix.java:1827)
at org.apache.felix.framework.Felix.startBundle(Felix.java:1744)
at org.apache.felix.framework.Felix.setActiveStartLevel(Felix.java:1148)
at
org.apache.felix.framework.StartLevelImpl.run(StartLevelImpl.java:264)
at java.lang.Thread.run(Thread.java:680)
Caused by: java.lang.ClassNotFoundException:
org.apache.jackrabbit.core.jndi.provider.DummyInitialContextFactory
at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
at
org.apache.sling.launchpad.base.shared.LauncherClassLoader.loadClass(LauncherClassLoader.java:133)
at java.lang.ClassLoader.loadClass(ClassLoader.java:248)
at
org.apache.felix.framework.ModuleImpl.doImplicitBootDelegation(ModuleImpl.java:1535)
at
org.apache.felix.framework.ModuleImpl.searchDynamicImports(ModuleImpl.java:1472)
at
org.apache.felix.framework.ModuleImpl.findClassOrResourceByDelegation(ModuleImpl.java:734)
at org.apache.felix.framework.ModuleImpl.access$400(ModuleImpl.java:71)
at
org.apache.felix.framework.ModuleImpl$ModuleClassLoader.loadClass(ModuleImpl.java:1768)
at java.lang.ClassLoader.loadClass(ClassLoader.java:248)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:247)
at
com.sun.naming.internal.VersionHelper12.loadClass(VersionHelper12.java:46)
at
javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:654)
... 12 more
I suppose JNDI doesn't work inside a local environment. I see this code in
org.apache.sling.jcr.base.util.RepositoryAccessor: row 73:
Thread.currentThread().setContextClassLoader(
this.getClass().getClassLoader());
InitialContext initialContext = new InitialContext(jndiContext);
that ClassLoader contains only the packages:
{org.apache.sling.jcr.base.util=package org.apache.sling.jcr.base.util,
org.apache.sling.jcr.base.internal.loader=package
org.apache.sling.jcr.base.internal.loader, org.apache.sling.jcr.base=package
org.apache.sling.jcr.base}
If I delete the Thread.currentThread().setContextClassLoader and I use the
default ClassLoader, the InitialContext is loaded correctly
--
This message is automatically generated by JIRA.
For more information on JIRA, see: http://www.atlassian.com/software/jira