Hi All,

I have check the source code with Nasmin and found,

the JaggeryAsyncServlet is already registered before it does
programatically because JaggeryAsyncServlet class is automatically added to
all the Webapp Contexts because of the @WebServlet annotation.


@WebServlet(name = "JaggeryAsyncServlet", urlPatterns = "/*", asyncSupported
= true)

Since this JaggeryAsyncServlet is added selectively (only for the Jaggery
apps), The @WebServlet should be removed.

Regards,
Chamil




On Tue, Jul 1, 2014 at 12:10 AM, Mohamed Nasmin <[email protected]>
wrote:

> After some reading I found the above null pointer comes when we adding the
> context listener BEFORE_START_EVENT occurs. So I changed the event to
> STARTING. Now without any error the jaggery context listener added to the
> standard context.
>
> But when access the sample tomgery application through URL I got this
> error. When I debug this[1] I found appConfigs is null. But could not find
> how it happened. Thanks in advance.
>
> *Code : *
>
> protected void service(HttpServletRequest request,
>                            HttpServletResponse response) throws
> ServletException, IOException {
>         JaggeryAppConfigs appConfigs =
> JaggeryAppConfigs.getInstance(request.getServletContext());
>         request.setAttribute("org.apache.catalina.ASYNC_SUPPORTED", true);
>         AsyncContext asyncCtx = request.startAsync();
>         asyncCtx.addListener(new JaggeryAsyncListener());
>         asyncCtx.setTimeout(appConfigs.getServletTimeout());
>         appConfigs.getServletExecutor().execute(new
> JaggeryAsyncRequestProcessor(asyncCtx));
>     }
>
> *Exception :*
>
> java.lang.NullPointerException
>       
> org.jaggeryjs.apps.JaggeryAsyncServlet.service(JaggeryAsyncServlet.java:23)
>       javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
>       org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
>
> [1]
> https://github.com/ruchiraw/jaggery/blob/master/components/jaggery-core/org.jaggeryjs.apps/src/main/java/org/jaggeryjs/apps/JaggeryAsyncServlet.java
>
>
> On Sun, Jun 22, 2014 at 5:54 AM, Chamil Jeewantha <[email protected]> wrote:
>
>> Hi Nasmin,
>>
>> the Null Pointer Exception (NPE) comes from the line
>>
>> registration.setAsyncSupported(true);
>>
>> Which means "registration" object is null. The responsible line of
>> assigning this variable is the line 25.
>>
>> ServletRegistration.Dynamic registration = servletContext.addServlet(
>>
>>                 JaggeryAsyncServlet.NAME, JaggeryAsyncServlet.class);
>>
>>
>> servletContext.addServlet javadoc[1] says,
>>
>>
>>
>> a ServletRegistration object that may be used to further configure the 
>> registered servlet, or *null** if this ServletContext already contains a 
>> complete ServletRegistration for the given **servletName*
>>
>>
>> For this case you can start debug by two points.
>>
>> 1. debug JaggeryContextListener
>> 2. Debug with tomcat source - servletContext.addServlet method to see why it 
>> returns null here.
>>
>>
>> [1] 
>> http://docs.oracle.com/javaee/6/api/javax/servlet/ServletContext.html#addServlet(java.lang.String,
>>  java.lang.Class)
>>
>>
>>
>> On Sat, Jun 21, 2014 at 10:08 PM, Mohamed Nasmin <[email protected]>
>> wrote:
>>
>>> Hi,
>>>
>>> @Ruchira
>>> I will debug the jars that we use in the tomgery app deployment and
>>> update with the results.
>>>
>>> @Dilshan
>>> I am using that JaggeryContextListener in a jar which is created by
>>> Ruchira. You can find the source code of that jar here[1].
>>>
>>> @Dakshika
>>> With the integration with JSR-223, Jaggery will use Nashorn from JDK8
>>> onwards and will fallback to JDK's embeded Rhino version with JDK7 or
>>> below. With the above Jaggery core minimisations, a Jaggery app can be even
>>> deployed on top of tomcat, subjecting to a WEB-INF directory which contains
>>> jaggery core jars and web.xml. For more details please refer this link[2].
>>>
>>> [1]
>>> https://github.com/ruchiraw/jaggery/blob/master/components/jaggery-core/org.jaggeryjs.apps/src/main/java/org/jaggeryjs/apps/JaggeryContextListener.java
>>> [2] http://osdir.com/ml/carbon-wso2-architecture/2014-06/msg00000.html
>>>
>>>
>>> On Sat, Jun 21, 2014 at 9:46 PM, Dilshan Edirisuriya <[email protected]>
>>> wrote:
>>>
>>>> Hi,
>>>>
>>>> Whats there at line 27 of JaggeryContextListener.java? Where can we
>>>> find the source for this?
>>>>
>>>> Regards,
>>>>
>>>> Dilshan
>>>>
>>>>
>>>> On Sat, Jun 21, 2014 at 1:31 PM, Mohamed Nasmin <[email protected]>
>>>> wrote:
>>>>
>>>>>  According to our earlier conversation I am following the below
>>>>> progression to accomplish the project. Sorry for the lengthy email.
>>>>>
>>>>> *Task1. Check whether the app in the tomcat webapps is jaggery app or
>>>>> not before it gets deployed/initialized*
>>>>>
>>>>> I trigger the BEFORE_START_EVENT by configuring the tomcat lifecycle
>>>>> listener with context.xml in the tomcat. The context can listen to the
>>>>> lifecycle listener by putting jar inside lib folder of tomcat. That jar
>>>>> should contain the tomcat listener. Also we need to define that class in
>>>>> the context.xml like below (For more details please refer this mail with
>>>>> subject Tomcat Lifecycle listener how to.).
>>>>>
>>>>> <Listener className="org.jaggery.tomcat.listener.TomcatListener" />
>>>>>
>>>>> When an application is started to deploy BEFORE_START_EVENT will be
>>>>> occurred. we check that event get the standard context of that event. To
>>>>> find out whether it is a jaggery context or not we identify the
>>>>> jaggery.conf in that app folder.
>>>>>
>>>>> Code :
>>>>>
>>>>> public void lifecycleEvent(LifecycleEvent event) {
>>>>>
>>>>>         String type = event.getType();
>>>>>         if (Lifecycle.BEFORE_START_EVENT.equals(type)) {
>>>>>             LOGGER.log(Level.INFO, "BEFORE START EVENT triggered.");
>>>>>             Lifecycle source = event.getLifecycle();
>>>>>
>>>>>             if (source instanceof StandardContext) {
>>>>>
>>>>>                 StandardContext standardContext = (StandardContext)
>>>>> source;
>>>>>                 boolean exists = isJaggeryApp(standardContext);
>>>>>
>>>>>                 if (!exists) {
>>>>>                     System.out.println("This is not a Jaggery app");
>>>>>                 } else {
>>>>>                     System.out.println("This is a Jaggery app");
>>>>>                 }
>>>>>             }
>>>>>         }
>>>>>     }
>>>>>
>>>>>  public boolean isJaggeryApp(StandardContext standardContext) {
>>>>>
>>>>>         String contextPath = standardContext.getPath();
>>>>>         String catalinaPath = System.getProperty("catalina.base");
>>>>>
>>>>>         try{
>>>>>         File file = new File(catalinaPath + File.separator + "webapps"
>>>>> + contextPath + File.separator + "jaggery.conf");
>>>>>         boolean exists = file.exists();
>>>>>         }
>>>>>         catch (Exception e){
>>>>>             e.printStackTrace();
>>>>>         }
>>>>>
>>>>>         if (!exists) {
>>>>>             return false;
>>>>>         } else {
>>>>>             return true;
>>>>>         }
>>>>>
>>>>>     }
>>>>>
>>>>> Output:
>>>>>
>>>>> INFO: Deploying web application directory
>>>>> /home/nasmin/tomcat/apache-tomcat-7.0.54/webapps/demo3
>>>>> Jun 20, 2014 10:25:40 PM org.jaggery.tomcat.listener.TomcatListener
>>>>> lifecycleEvent
>>>>> INFO: BEFORE START EVENT triggered.
>>>>> This is a Jaggery app
>>>>>
>>>>> *Task2. How to put the jars in the tomcat that apps can see*
>>>>>
>>>>> After finding the jaggery app in the tomcat we need to assign some jar
>>>>> which will be required to get new jaggery engine. So we can put the in a
>>>>> directory in the tomcat and we need to mention that in the
>>>>> catalina.properties like below.
>>>>>
>>>>>
>>>>> common.loader=${catalina.base}/lib,${catalina.base}/lib/*.jar,${catalina.home}/lib,${catalina.home}/lib/*.jar,${catalina.base}/jaggery/lib,${catalina.base}/jaggery/lib/*.jar,${catalina.home}/jaggery/lib,${catalina.home}/jaggery/lib/*.jar
>>>>>
>>>>> *Task3. Register a jaggery servlet listener if it is a jaggery app *
>>>>>
>>>>> Afterwards we need to register our jaggery servlet listener to the
>>>>> jaggery app. I did by adding application listener to the jaggery standard
>>>>> context and I added application paramaeter which we had in the web.xml.
>>>>> Here I got an exception like below. Please advice on this.
>>>>>
>>>>> Code:
>>>>>
>>>>>
>>>>> standardContext.addApplicationListener("org.jaggeryjs.apps.JaggeryContextListener");
>>>>>
>>>>> ApplicationParameter applicationParameter = new ApplicationParameter();
>>>>> applicationParameter.setName("jaggery.initializer");
>>>>> applicationParameter.setValue("server://engines/index.js");
>>>>> standardContext.addApplicationParameter(applicationParameter);
>>>>>
>>>>> ApplicationParameter applicationParameter1 = new
>>>>> ApplicationParameter();
>>>>> applicationParameter1.setName("jaggery.development");
>>>>> applicationParameter1.setValue("true");
>>>>> standardContext.addApplicationParameter(applicationParameter1);
>>>>>
>>>>> ApplicationParameter applicationParameter2 = new
>>>>> ApplicationParameter();
>>>>> applicationParameter2.setName("jaggery.engine.pool.max.active");
>>>>> applicationParameter2.setValue("5000");
>>>>> standardContext.addApplicationParameter(applicationParameter2);
>>>>>
>>>>> ApplicationParameter applicationParameter3 = new
>>>>> ApplicationParameter();
>>>>> applicationParameter3.setName("jaggery.executor.pool.max");
>>>>> applicationParameter3.setValue("5000");
>>>>> standardContext.addApplicationParameter(applicationParameter3);
>>>>>
>>>>> Output:
>>>>>
>>>>> INFO: Deploying web application directory
>>>>> /home/nasmin/tomcat/apache-tomcat-7.0.54/webapps/demo5
>>>>> Jun 20, 2014 10:25:39 PM org.jaggery.tomcat.listener.TomcatListener
>>>>> lifecycleEvent
>>>>> INFO: BEFORE START EVENT triggered.
>>>>> This is a Jaggery app
>>>>> Jun 20, 2014 10:25:40 PM org.apache.catalina.core.StandardContext
>>>>> listenerStart
>>>>> SEVERE: Exception sending context initialized event to listener
>>>>> instance of class org.jaggeryjs.apps.JaggeryContextListener
>>>>> java.lang.NullPointerException
>>>>>     at
>>>>> org.jaggeryjs.apps.JaggeryContextListener.contextInitialized(JaggeryContextListener.java:27)
>>>>>     at
>>>>> org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4973)
>>>>>     at
>>>>> org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5467)
>>>>>     at
>>>>> org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
>>>>>     at
>>>>> org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:901)
>>>>>     at
>>>>> org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:877)
>>>>>     at
>>>>> org.apache.catalina.core.StandardHost.addChild(StandardHost.java:632)
>>>>>     at
>>>>> org.apache.catalina.startup.HostConfig.deployDirectory(HostConfig.java:1247)
>>>>>     at
>>>>> org.apache.catalina.startup.HostConfig$DeployDirectory.run(HostConfig.java:1898)
>>>>>     at
>>>>> java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
>>>>>     at java.util.concurrent.FutureTask.run(FutureTask.java:262)
>>>>>     at
>>>>> java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
>>>>>     at
>>>>> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
>>>>>     at java.lang.Thread.run(Thread.java:744)
>>>>>
>>>>> Jun 20, 2014 10:25:40 PM org.apache.catalina.core.StandardContext
>>>>> startInternal
>>>>> SEVERE: Error listenerStart
>>>>>
>>>>> I attached the tomcat directory structure for the jaggery app with
>>>>> this email. Also we have a remaining task that we need put context
>>>>> parameters in a separate property file and make it available for the app
>>>>> deployment. Here I hard coded those parameters. Please advice on this
>>>>> issue.
>>>>>
>>>>> Thanks in advance.
>>>>>
>>>>> _______________________________________________
>>>>> Dev mailing list
>>>>> [email protected]
>>>>> http://wso2.org/cgi-bin/mailman/listinfo/dev
>>>>>
>>>>>
>>>>
>>>>
>>>> --
>>>> Dilshan Edirisuriya
>>>> Senior Software Engineer - WSO2
>>>> Mob: + 94 777878905
>>>> http://wso2.com/
>>>>
>>>
>>>
>>> _______________________________________________
>>> Dev mailing list
>>> [email protected]
>>> http://wso2.org/cgi-bin/mailman/listinfo/dev
>>>
>>>
>>
>>
>> --
>> K.D. Chamil Jeewantha
>> Associate Technical Lead
>> WSO2, Inc.;  http://wso2.com
>> Mobile: +94716813892
>>
>>
>


-- 
K.D. Chamil Jeewantha
Associate Technical Lead
WSO2, Inc.;  http://wso2.com
Mobile: +94716813892
_______________________________________________
Dev mailing list
[email protected]
http://wso2.org/cgi-bin/mailman/listinfo/dev

Reply via email to