Hi all, I tried several ways to deploy the BpelManagementFacadeImpl class it self as a web service. But I need some ideas from the community on which the best possible way to deploy the debugger web service should be.
Here are some approaches I tried. 1. Contract first method Similar to deploying the Management API, I tried by generating the WSDL and Bean classes then a problem occurs as BpelManagementFacadeImpl method implementations return plain java objects not beans. So in this way I have to reimplement the service class such that methods can handle bean objects as in org.apache.ode.bpel.engine.ProcessAndInstanceManagementImpl. 2. Pojo Method Then I programatically deploy the service using the method AxisService debuggerService = AxisService.createService(BpelManagementFacadeImpl.class.getName(),axisConfig); Now the problem is when invoking operations at org.apache.axis2.receivers.AbstractMessageReceiver#makeNewServiceObject method, it tries to instantiate a service implementation class using reflections. But as in BpelManagementFacadeImpl class doesn't have a default constructor, so an exception occurs. So then I tried to instantiate a sevice implementation class by using an org.apache.axis2.ServiceObjectSupplier. But in that case also when instantiating the BpelManagementFacadeImpl I need to pass the _server and store parameters. But I do not know how to get those parameters inside the ServiceObjectSupplier class. Is there a way of refering the attributes of org.apache.ode.axis2.ODEServer object which is created when ODE startup, outside of the org.apache.ode.axis2.ODEServer class.? Or do I have to reimplement all the operations as in Contract first method.? Please help me on deploying this matter. Best Regards, Denis Weerasiri. On Thu, Mar 19, 2009 at 8:42 PM, Matthieu Riou <[email protected]>wrote: > On Thu, Mar 19, 2009 at 4:46 AM, Denis Weerasiri <[email protected]>wrote: > >> Hi all, >> >> I studied how the ODE Management API is deployed as a web service during >> the startup of ODE in order to deploy the debugging functionality as a web >> service programatically during the startup of ODE. So I created the WSDL >> from the service class (BpelManagementFacedImpl) and implement Axis2 wrapper >> class for the debugger interface. Then I change the >> org.apache.ode.axis2.ODEServer#init method in order to start the debugging >> service when ODE starts. As well the relevant schema were added to >> ode-bpel-schemas module and created the .xsdconfig file in order to generate >> the bean classes. Then I changed the rakefile in order to add relevant >> schema to the war distribution. >> >> Then I build ODE and put war distribution inside tomcat and start ODE. >> >> Debugger service was created without no exceptions. But when I invoke >> operations it gives a exception stack as follows. It seems like there is a >> serializing/deserializing problem. >> > > The DynamicService thingy relays web services calls to the management class > (ProcessAndInstanceManagement). Doing so, it take cares of serialization and > deserialization of the parameters and the returned result. It's usually > pretty easy because the management API only deals either with basic types or > XmlBeans types. What it's telling you here is that it doesn't know how to > serialize the Breakpoint object returned. That's pretty normal because > Breakpoint is neither simple not an XmlBean type. > > So you'll need to add a Breakpoint datatype in pmapi.xsd to generate an > XmlBean out of it and then return that from the management classes. > > Cheers, > Matthieu > > >> <soapenv:Fault> >> >> <soapenv:Code>axis2ns72:Server</soapenv:Code> >> >> <soapenv:Reason> >> >> java.lang.RuntimeException: Couldn't convert object >> [Lorg.apache.ode.bpel.bdi.breaks.Breakpoint;@9fb152 into a response >> element. >> >> </soapenv:Reason> >> >> <soapenv:Detail> >> >> <axis2ns73:RuntimeException> >> >> java.lang.RuntimeException: Couldn't convert object >> [Lorg.apache.ode.bpel.bdi.breaks.Breakpoint;@9fb152 into a response >> element. >> >> at org.apache.ode.il.DynamicService.convertToOM(DynamicService.java:164) >> >> at org.apache.ode.il.DynamicService.invoke(DynamicService.java:73) >> >> at >> org.apache.ode.axis2.service.DebuggingWebService$DynamicMessageReceiver.invokeBusinessLogic(DebuggingWebService.java:95) >> >> at >> org.apache.axis2.receivers.AbstractMessageReceiver.receive(AbstractMessageReceiver.java:96) >> >> at org.apache.axis2.engine.AxisEngine.receive(AxisEngine.java:145) >> >> at >> org.apache.axis2.transport.http.util.RESTUtil.invokeAxisEngine(RESTUtil.java:125) >> >> at >> org.apache.axis2.transport.http.util.RESTUtil.processURLRequest(RESTUtil.java:119) >> >> at >> org.apache.axis2.transport.http.AxisServlet$RestRequestProcessor.processURLRequest(AxisServlet.java:799) >> >> at org.apache.axis2.transport.http.AxisServlet.doGet(AxisServlet.java:242) >> >> at org.apache.ode.axis2.hooks.ODEAxisServlet.doGet(ODEAxisServlet.java:62) >> >> at javax.servlet.http.HttpServlet.service(HttpServlet.java:617) >> >> at javax.servlet.http.HttpServlet.service(HttpServlet.java:717) >> >> at >> org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) >> >> at >> org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) >> >> at >> org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233) >> >> at >> org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191) >> >> at >> org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128) >> >> at >> org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) >> >> at >> org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) >> >> at >> org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286) >> >> at >> org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:845) >> >> at >> org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583) >> >> at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447) >> >> at java.lang.Thread.run(Thread.java:619) >> >> </axis2ns73:RuntimeException> >> >> </soapenv:Detail> >> >> </soapenv:Fault> >> >> >> Please help me on this matter. >> >> Cheers, >> >> Denis Weerasiri >> >> >> On Tue, Feb 10, 2009 at 4:00 AM, Matthieu Riou >> <[email protected]>wrote: >> >>> On Sun, Feb 8, 2009 at 8:29 AM, Denis Weerasiri <[email protected] >>> >wrote: >>> >>> > Hi, >>> > >>> > I'm interested in implementing a interactive debugging tool for WS-BPEL >>> > developers on Apache ODE which enables to set breakpoints, and >>> > watch/inspect >>> > instance variables as GSOC project. >>> >>> >>> Sweet! Really good idea :) >>> >>> >>> > >>> > These days I'm developing a WS-BPEL status tracking tool which generate >>> an >>> > SVG flow diagram based on the BPEL code, and view the instance variable >>> > values and the activity details of the running instances. I used the >>> ODE >>> > Management API for that. But it seems that ODE doesn't provide any API >>> for >>> > handling breakoints. >>> > Please let me know whether there is any API or some tool already >>> developed >>> > for handling breakpoint functionality in ODE. >>> > As well I'm clueless of the capacity of this project idea, whether it's >>> > possible to achieve. >>> > Or if there is any other interresting ideas for GSOC under Apache ODE >>> > project please let me know. >>> >>> >>> It is possible as it's a feature that used to exist back in the days when >>> ODE was still called PXE and was developed by Intalio only. Debugging had >>> been developed for Netbeans by a third party. >>> >>> Since then, even if it's never really been tested, I've been very careful >>> to >>> not remove this code and keep it up-to-date with the different >>> refactoring >>> we've done, thinking we'll probably revive this feature sooner or later. >>> So >>> even if it's probably buggy, most of the code is still present and should >>> be >>> operational. >>> >>> So if you check the InstanceManagement interface [1], you'll see >>> suspend(iid) and resume(iid) methods, which is a start. Those are >>> implemented by the DebuggerSupport class [2], which is useful to look at >>> but >>> is mostly internal API (external tooling shouldn't use it directly). >>> Instead >>> those methods should be used through BpelManagementFacadeImpl that >>> delegates >>> to DebuggerSupport. You'll find all the usual suspects: >>> getGlobalBreakpoints, addActivityBreakpoint, removeBreakpoint, ... For >>> the >>> moment, even though those methods are on BpelManagementFacadeImpl like >>> all >>> others of the management API, they're not accessible remotely yet. But >>> that >>> wouldn't too hard to add. >>> >>> I think that should be enough information to get you started but don't >>> hesitate to ask if you have any other additional question or problems. >>> >>> Cheers, >>> Matthieu >>> >>> [1] >>> >>> http://svn.apache.org/repos/asf/ode/trunk/bpel-api/src/main/java/org/apache/ode/bpel/pmapi/InstanceManagement.java >>> [2] >>> >>> http://svn.apache.org/repos/asf/ode/trunk/engine/src/main/java/org/apache/ode/bpel/engine/DebuggerSupport.java >>> >>> >>> > >>> > >>> > Best regards, >>> > Denis Weerasiri. >>> > >>> >> >> >
