Showing posts with label Plugins. Show all posts
Showing posts with label Plugins. Show all posts

Monday, 11 November 2013

Debugging application startup with plugins in Websphere Application Server

This post mainly addresses the errors observed during installing a application in Websphere Application Server . Most of the stuff I shall write about are generic to WAS 7 ,WAS 8 and WAS 8.5

1) So what happens when you install a new application through the WAS Admin console , and post successful installation it does not start ???

Observe the application startup logs in  your application server folder in profile
Eg : C:\IBM\WebSphere\AppServer\profiles\AppSrv01\logs\server1
or C:\IBM\WebSphere\AppServer\profiles\AppSrv01\logs\webserver1
Go through the logs and you should get idea of whats wrong.

2) If Step 1 fails , and the logs show only IBM related errors, then it might be a good idea to look for and install any applicable fixpaks. These fixpaks are cumulative so the latest should suffice

Eg: I was trying to install an application in WAS 8.5 and though the installation was successful , the applciation would not start .  The logs at C:\IBM\WebSphere\AppServer\profiles\AppSrv01\logs\ffdc
said  :
[11/11/13 9:40:36:513 IST]     FFDC Exception:com.ibm.ws.exception.RuntimeError SourceId:com.ibm.ws.runtime.component.CompositionUnitMgrImpl ProbeId:679 Reporter:com.ibm.ws.runtime.component.CompositionUnitMgrImpl@e341fce8
com.ibm.ws.exception.RuntimeError: java.lang.RuntimeException: java.lang.ArrayIndexOutOfBoundsException
at com.ibm.ws.runtime.component.ApplicationMgrImpl.startApplication(ApplicationMgrImpl.java:792)
..
..
..
Caused by: java.lang.ArrayIndexOutOfBoundsException
at org.objectweb.asm.ClassReader.readClass(Unknown Source)
at org.objectweb.asm.ClassReader.accept(Unknown Source)
at org.objectweb.asm.ClassReader.accept(Unknown Source)

Appeared to be an application issue,but after a lot of browsing realised that the fix was in one of the fixpaks
So stay on the latest fixpak if possible

Now what happens when you application has started successfully

1)Try to access your application through the application server port
Eg: http://localhost:9080/<context-root>/<web-page>

If this works well for you , that means the setup is correct
Otherwise,ensure that the URL you are accessing is correct, and simple html,jsp files etc are accessible

2) If you'r able to access your URL through the application server,but you are getting a 404 error on trying to access it through the web server ,follow the below mentioned steps :
-Make sure your http.conf has the following entries :
LoadModule was_ap22_module "C:\IBM\WebSphere\Plugins\bin\32bits\mod_was_ap22_http.dll"
WebSpherePluginConfig "C:\IBM\WebSphere\Plugins\config\webserver1\plugin-cfg.xml"

-Check your webserver logs  for errors
Eg : Ensure the follwoing text appears
[Mon Nov 11 12:57:52 2013] [notice] PLUGIN: mod_was_ap22_http: apache_log_header: WebSphere Plugins loaded.
[Mon Nov 11 12:57:52 2013] [notice] PLUGIN: mod_was_ap22_http: apache_log_header: --------------------Plugin Information-----------------------
[Mon Nov 11 12:57:52 2013] [notice] PLUGIN: mod_was_ap22_http: apache_log_header: Bld version: 8.5.0
[Mon Nov 11 12:57:52 2013] [notice] PLUGIN: mod_was_ap22_http: apache_log_header: Bld date: Apr 24 2012, 15:12:31
[Mon Nov 11 12:57:52 2013] [notice] PLUGIN: mod_was_ap22_http: apache_log_header: Webserver: IBM_HTTP_Server
[Mon Nov 11 12:57:52 2013] [notice] PLUGIN: mod_was_ap22_http: apache_log_header: --------------------------------------------------------------

My log had additional errors: 
File does not exist: C:/IBM/HTTPServer/htdocs/<application context-root>
Since plugins were configured ,this meant that the plugin-cfg.xml file was incomplete
Read on to know more ...

-plugin-cfg.xml
When any application has to be rerouted to the application server to the web server,plugins need to be generated specifically for that application . One plugin-cfg.xml file is updated(Operation "Generate plugins") and propagation involves pasting this file in the various app server,web server and dmgr locations (Operation "Propogate Plug In") . 

Sample locations :

C:\IBM\WebSphere\Plugins\config\webserver1\plugin-cfg.xml

C:\IBM\WebSphere\AppServer\profiles\Dmgr01\config\cells\CFWIN2012X64-4Cell01\nodes\CFWIN2012X64-4Node01\servers\webserver1\plugin-cfg.xml

C:\IBM\WebSphere\AppServer\profiles\AppSrv01\config\cells\CFWIN2012X64-4Cell01\nodes\CFWIN2012X64-4Node01\servers\webserver1\plugin-cfg.xml 

If any time a plugin-cfg.xml is created in the Dmgr01 file path ( as shown in sample location 2) , any changes made to the plugin-cfg.xml are not reflected to it.Hence it will always remain out of sync with the other plugin-cfg.xml files

 The trick is to make sure all the plugin-cfg.xml files are in sync,bear the same timestamp and content.just search plugin-cfg.xml files in your IBM roots,copy paste and restart web server.

This will also resolve the incomplete plugin-cfg.xml issue mentioned above


.

Wednesday, 13 June 2012

Simple plugins with PhoneGap1.7 Android

Recently I had a major run in with PhoneGap 1.7 and since I had a lot of java just begging to be called I ended up using plugins in PhoneGap.

Though there is a decent example on the PhoneGap website , I found it a little off base for a first plugin example , to explain just the basic functioning of plugins.The example I post here is a beginner level example which will help you understand the basic mechanism of plugins without any fancy stuff.

Steps :
1)Create an PhoneGap powered Android Project using phonegap docs
2)This is where we write our business logic . Create a java file MyPluginClass . This class will return some standard string to a html. You need to override the execute method of Plugin class and send back your result in a PluginResult object

package org.firstplugin;



public class 
MyPluginClass extends Plugin{



@Override

public PluginResult execute(String action, JSONArray data, String callbackID) {

       try{

       PluginResult rs=null;

      /* Create the JSONObject which will be sent in PluginResult */

      JSONObject jsonobj=new JSONObject();

    /* Add whatever you want to send back to PhoneGap in the JSONObject */

       jsonobj.put("myname","whats in a name");

   /*  Put your JSONObject in a PluginResult object */

       rs=new PluginResult(Status.OK,jsonobj);

}
catch(JSONException e){ LOG.d("DEBUG",e.getmessage())}

/* Send your PluginResult object back to PhoneGap */

return rs;
}

}

3)Now we shall write the plugin javascript which will call MyPluginClass.This "myplugin.js" JS file will call PhoneGap.exec which in turn will call the execute method of MyPluginClass.


var CallPlugin=function(){};

CallPlugin.prototype.get=function(successCallback,failureCallback){

  return PhoneGap.exec(successCallback,failureCallback,'  MyPluginClass ','show',[ ]);

};

PhoneGap.addConstructor(function() {

//Register the javascript plugin with PhoneGap
PhoneGap.addPlugin('callplugin', new CallPlugin());



});
In detail :
successCallback : This method will be called after the plugin gets executed
failureCallback : This method will be called in case of error
We can also pass arguments to the Java class through the array

4)Register the plugin in plugins.xml with :
<plugin name="
MyPluginClass" value="
org.firstplugin.MyPluginClass"></plugin>

5)Now write the html which will execute this plugin.Click the button " Click Me To Return Name" to run the plugin


<!DOCTYPE html>

<html>

    <head>

        <meta charset="utf-8" />

        <meta name="viewport" content="width=device-width, initial-scale=1" />

        <title>

        </title>

        <link rel="stylesheet" href="http://code.jquery.com/mobile/1.1.0/jquery.mobile-1.1.0.min.css" />

        <link rel="stylesheet" href="my.css" />

        <link rel="stylesheet" href="photoswipe.css" type="text/css"/>

        <style>

           /* App custom styles */

        </style>

        <script type="text/javascript" src="klass.min.js"></script>

        <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js">

        </script>

        <script src="http://code.jquery.com/mobile/1.1.0/jquery.mobile-1.1.0.min.js">

        </script>

        <script src="cordova-1.7.0.js">

        </script>

        <script src="
myplugin.js">

        </script>

      </head>

    <body>

      

         <div data-role="page" id="home">

              <div data-theme="a" data-role="header">

                <h3>

                    Plugin Example

                </h3>

               </div>

               <div data-role="content">

                <div>

                        <a data-role="button" data-transition="fade"  id="runplugin">

                            Click Me To Return Name

                        </a>

                        </div>

                </div>

               <div data-role="footer"></div>

         </div>

<script type="text/javascript">





$("#
runplugin").click(function(e){

     window.plugins.callcamplugin.get(

function(r){alert(JSON.stringify(r);},

function(e){console.log(e)}

);

});





</script>

   </body>

</html>


 
Using this code you will be able to run a simple plugin using PhoneGap