tangyong / glassfish-obr-builder

Implementing http://java.net/jira/browse/GLASSFISH-19395 and as a basic of glassfish provisioning stories
1 stars 1 forks source link

Supporting Rest Access from client #31

Open tangyong opened 11 years ago

tangyong commented 11 years ago

A way to implement remote provisioning , and make provisioning apis to support Rest Access from client.

Implementing Priority: P1

tangyong commented 11 years ago

Currently, I am investigating publishing rest service from an OSGi bundle using jersey 2.x . A sample1 can be referrenced.

And while putting obr builder module into autostart, there will be the following exception:

[#|2013-02-04T16:45:37.062+0900|INFO|glassfish 4.0|javax.enterprise.logging.stdout|_ThreadID=74;_ThreadName=pool-17-thread-1;_TimeMillis=1359963937062;_LevelValue=800;|ERROR: Bundle org.glassfish.jersey.examples.osgi-http-service.bundle [272] EventDispatcher: Error during dispatch. (java.lang.RuntimeException: javax.servlet.ServletException: javax.servlet.ServletException: [failed to localize] resource.config.unable.to.load(org.glassfish.jersey.examples.osgihttpservice.JerseyApplication))|#]

[#|2013-02-04T16:45:37.078+0900|SEVERE|glassfish 4.0|javax.enterprise.logging.stderr|_ThreadID=74;_ThreadName=pool-17-thread-1;_TimeMillis=1359963937078;_LevelValue=1000;|java.lang.RuntimeException: javax.servlet.ServletException: javax.servlet.ServletException: [failed to localize] resource.config.unable.to.load(org.glassfish.jersey.examples.osgihttpservice.JerseyApplication) at org.glassfish.jersey.examples.osgihttpservice.Activator.registerServlets(Activator.java:109) at org.glassfish.jersey.examples.osgihttpservice.Activator.access$100(Activator.java:60) at org.glassfish.jersey.examples.osgihttpservice.Activator$1.addingService(Activator.java:78) at org.osgi.util.tracker.ServiceTracker$Tracked.customizerAdding(ServiceTracker.java:980) at org.osgi.util.tracker.ServiceTracker$Tracked.customizerAdding(ServiceTracker.java:906) at org.osgi.util.tracker.AbstractTracked.trackAdding(AbstractTracked.java:262) at org.osgi.util.tracker.AbstractTracked.track(AbstractTracked.java:234) at org.osgi.util.tracker.ServiceTracker$Tracked.serviceChanged(ServiceTracker.java:941) at org.apache.felix.framework.util.EventDispatcher.invokeServiceListenerCallback(EventDispatcher.java:932) at org.apache.felix.framework.util.EventDispatcher.fireEventImmediately(EventDispatcher.java:793) at org.apache.felix.framework.util.EventDispatcher.fireServiceEvent(EventDispatcher.java:543) at org.apache.felix.framework.Felix.fireServiceEvent(Felix.java:4260) at org.apache.felix.framework.Felix.registerService(Felix.java:3275) at org.apache.felix.framework.BundleContextImpl.registerService(BundleContextImpl.java:346) at org.apache.felix.framework.BundleContextImpl.registerService(BundleContextImpl.java:320) at org.glassfish.osgihttp.Activator.doActualWork(Activator.java:137) at org.glassfish.osgihttp.Activator.access$300(Activator.java:84) at org.glassfish.osgihttp.Activator$OSGiHtttpExtender.start(Activator.java:332) at org.glassfish.osgijavaeebase.ExtenderManager$ExtenderTracker.addingService(ExtenderManager.java:144) at org.osgi.util.tracker.ServiceTracker$Tracked.customizerAdding(ServiceTracker.java:980) at org.osgi.util.tracker.ServiceTracker$Tracked.customizerAdding(ServiceTracker.java:906) at org.osgi.util.tracker.AbstractTracked.trackAdding(AbstractTracked.java:262) at org.osgi.util.tracker.AbstractTracked.trackInitial(AbstractTracked.java:185) at org.osgi.util.tracker.ServiceTracker.open(ServiceTracker.java:348) at org.osgi.util.tracker.ServiceTracker.open(ServiceTracker.java:283) at org.glassfish.osgijavaeebase.ExtenderManager.startExtenders(ExtenderManager.java:109) at org.glassfish.osgijavaeebase.ExtenderManager.access$100(ExtenderManager.java:67) at org.glassfish.osgijavaeebase.ExtenderManager$GlassFishServerTracker$1.run(ExtenderManager.java:192) at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471) at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334) at java.util.concurrent.FutureTask.run(FutureTask.java:166) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603) at java.lang.Thread.run(Thread.java:722) Caused by: javax.servlet.ServletException: javax.servlet.ServletException: [failed to localize] resource.config.unable.to.load(org.glassfish.jersey.examples.osgihttpservice.JerseyApplication) at org.glassfish.osgihttp.GlassFishHttpService.registerServlet(GlassFishHttpService.java:105) at org.glassfish.osgihttp.HttpServiceWrapper.registerServlet(HttpServiceWrapper.java:93) at org.glassfish.jersey.examples.osgihttpservice.Activator.rawRegisterServlets(Activator.java:119) at org.glassfish.jersey.examples.osgihttpservice.Activator.registerServlets(Activator.java:105) ... 33 more Caused by: javax.servlet.ServletException: [failed to localize] resource.config.unable.to.load(org.glassfish.jersey.examples.osgihttpservice.JerseyApplication) at org.glassfish.jersey.servlet.WebComponent.createResourceConfig(WebComponent.java:378) at org.glassfish.jersey.servlet.WebComponent.(WebComponent.java:251) at org.glassfish.jersey.servlet.ServletContainer.init(ServletContainer.java:144) at org.glassfish.jersey.servlet.ServletContainer.init(ServletContainer.java:326) at javax.servlet.GenericServlet.init(GenericServlet.java:244) at org.glassfish.osgihttp.OSGiServletWrapper.initializeServlet(OSGiServletWrapper.java:92) at org.glassfish.osgihttp.GlassFishHttpService.registerServlet(GlassFishHttpService.java:103) ... 36 more Caused by: java.lang.ClassNotFoundException: org.glassfish.jersey.examples.osgihttpservice.JerseyApplication not found by org.glassfish.jersey.core.jersey-common [165] at org.apache.felix.framework.BundleWiringImpl.findClassOrResourceByDelegation(BundleWiringImpl.java:1460) at org.apache.felix.framework.BundleWiringImpl.access$400(BundleWiringImpl.java:72) at org.apache.felix.framework.BundleWiringImpl$BundleClassLoader.loadClass(BundleWiringImpl.java:1843) at java.lang.ClassLoader.loadClass(ClassLoader.java:356) at java.lang.Class.forName0(Native Method) at java.lang.Class.forName(Class.java:186) at org.glassfish.jersey.internal.util.ReflectionHelper.classForNameWithException(ReflectionHelper.java:284) at org.glassfish.jersey.internal.util.ReflectionHelper.classForNameWithException(ReflectionHelper.java:262) at org.glassfish.jersey.servlet.WebComponent.createResourceConfig(WebComponent.java:368)

tangyong commented 11 years ago

The issue is caused by classloader and we must set correct thread ContextClassLoader while registering rest servlet.

For example,

ClassLoader oldTCC = Thread.currentThread().getContextClassLoader();
try{ ClassLoader newTCC = new TCCLClassLoader(oldTCC, this.getClass().getClassLoader()); Thread.currentThread().setContextClassLoader(newTCC);

        httpService.registerServlet("/jersey-http-service",
                new ServletContainer(), getJerseyServletParams(), null);
    }finally{
        Thread.currentThread().setContextClassLoader(oldTCC);
    }       

private static class TCCLClassLoader extends ClassLoader { private final ClassLoader oldCLS;

        private final ClassLoader newCLS;

        public TCCLClassLoader(ClassLoader oldCLS, ClassLoader newCLS) {
            this.oldCLS = oldCLS;
            this.newCLS = newCLS;
        }

        @Override
        public Class<?> loadClass(String name) throws ClassNotFoundException {
            Class<?> loadedClass = null;
            try {
                loadedClass = oldCLS.loadClass(name);
            } catch (ClassNotFoundException cnfe) {
                loadedClass = newCLS.loadClass(name);
            }
            return loadedClass;
        }
    }
tangyong commented 11 years ago

In addition, required jersey 2.x dependent bundles are as following:

1 javax.ws.rs-api

2 jersey-server

3 jersey-container-grizzly2-http

4 jersey-container-servlet-core

5 javax.servlet-api

tangyong commented 11 years ago

Currently, listsubsystems rest api has been done and passed tests.