Service calling a service

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
13 messages Options
Reply | Threaded
Open this post in threaded view
|

Service calling a service

David Shere
I'm trying to write a java service that will call another service.  The
other service takes three strings and a map as input.  This is what I
have so far.

public static Map printLabel(DispatchContext dctx, Map context) {
     GenericDelegator delegator = dctx.getDelegator();

     String productId  = (String) context.get("productId");
     String producName = (String) context.get("productName");
     String printer    = (String) context.get("printer");

     // call service here with above parameters
     //
     //

     Map results = ServiceUtil.returnSuccess();
     return results;
}

Am on the right track?

--
David Shere
Information Technology Services
Steele Rubber Products
www.SteeleRubber.com

Reply | Threaded
Open this post in threaded view
|

Re: Service calling a service

David Shere
Maybe I should clarify/restate.

Jacopo wrote a service that sends a screen definition directly to a
printer.  It takes as input:

1. screen definition
2. path to (network shared?) printer
3. contentType
4. body parameters

1-3 are strings and 4 is a map.  We tested this Friday, with #4 being
blank, and everything worked beautifully.  I now want to test it while
passing parameters to it.  I'm trying to figure out how I can pass a map
to this service -- just enough implementation to see if it works.  I
want to test it with the screen definition
component://product/widget/catalog/ProductScreens.xml#ProductBarCode.fo
so my body parameters would be productId and productName.

You can see the service at
https://ofbiz.davidshere.com:8443/webtools/control/availableServices?sel_service_name=sendPrintFromScreen 
or you can look at JIRA 823.  Part of the attached patch contains this
service.

Jacopo has been very helpful to (and patient with) me on this issue, but
he's on vacation for the next few days.

Thanks for any help you can provide.

David Shere wrote:
> I'm trying to write a java service that will call another service.  The
> other service takes three strings and a map as input.  This is what I
> have so far.
>

Reply | Threaded
Open this post in threaded view
|

Re: Service calling a service

Scott Gray
Hi David

You need to put all the parameters into a map and then pass that map to the
service call.
I can't remember the exact code but it goes like:

Map inputMap = UtilMisc.toMap("param1", param1);
 Map inputMap = UtilMisc.toMap("param2", param2);
Map results = dispatcher.runSync("myService", inputMap);

runSync needs to be surrounded with try/catch of course.

Regards
Scott

On 20/03/07, David Shere <[hidden email]> wrote:

>
> Maybe I should clarify/restate.
>
> Jacopo wrote a service that sends a screen definition directly to a
> printer.  It takes as input:
>
> 1. screen definition
> 2. path to (network shared?) printer
> 3. contentType
> 4. body parameters
>
> 1-3 are strings and 4 is a map.  We tested this Friday, with #4 being
> blank, and everything worked beautifully.  I now want to test it while
> passing parameters to it.  I'm trying to figure out how I can pass a map
> to this service -- just enough implementation to see if it works.  I
> want to test it with the screen definition
> component://product/widget/catalog/ProductScreens.xml#ProductBarCode.fo
> so my body parameters would be productId and productName.
>
> You can see the service at
>
> https://ofbiz.davidshere.com:8443/webtools/control/availableServices?sel_service_name=sendPrintFromScreen
> or you can look at JIRA 823.  Part of the attached patch contains this
> service.
>
> Jacopo has been very helpful to (and patient with) me on this issue, but
> he's on vacation for the next few days.
>
> Thanks for any help you can provide.
>
> David Shere wrote:
> > I'm trying to write a java service that will call another service.  The
> > other service takes three strings and a map as input.  This is what I
> > have so far.
> >
>
>
Reply | Threaded
Open this post in threaded view
|

Re: Service calling a service

David Shere
Thanks!  That's the line I was missing.  I must ask, though, what class
is "dispatcher" and how do I construct it?

(I think I was dealing with ServiceXaWrapper)

Scott Gray wrote:
> Map results = dispatcher.runSync("myService", inputMap);

Reply | Threaded
Open this post in threaded view
|

Re: Service calling a service

Scott Gray
I think it's a LocalDispatcher, but don't quote me on that.  Anyway there's
a million examples in code, just search for runSync


On 20/03/07, David Shere <[hidden email]> wrote:

>
> Thanks!  That's the line I was missing.  I must ask, though, what class
> is "dispatcher" and how do I construct it?
>
> (I think I was dealing with ServiceXaWrapper)
>
> Scott Gray wrote:
> > Map results = dispatcher.runSync("myService", inputMap);
>
>
Reply | Threaded
Open this post in threaded view
|

Re: Service calling a service

Jacopo Cappellato
In reply to this post by David Shere
David,

David Shere wrote:
> ...
> Jacopo has been very helpful to (and patient with) me on this issue, but
> he's on vacation for the next few days.
>

really? And where I'm supposed to have my vacation? Sea or mountains? :-)

Unfortunately this is not really true, and I don't know what I wrote you
that could have made you believe that I was going to be on vacation.

 From office,

Jacopo


Reply | Threaded
Open this post in threaded view
|

Re: Service calling a service

Jacopo Cappellato
In reply to this post by Scott Gray
Yes, literally millions of examples.

However, this morning I've committed a first draft of the service in svn
so I'd suggest you to update your local copy with a clean trunk and then
you can test it, for example, in this way:

//============================
Map screenInMap = UtilMisc.toMap("orderId", orderId);
Map inMap = UtilMisc.toMap("screenLocation",
"component://order/widget/ordermgr/OrderPrintForms.xml#OrderPDF",
"printerName", "//server/printer",
"userLogin", userLogin,
"screenContext", screenInMap);

dispatcher.runAsync("sendPrintFromScreen", inMap);
//============================

A quick way to run this code is to copy it at the bottom of a bsh
script, for example:
applications/manufacturing/webapp/manufacturing/WEB-INF/actions/jobshopmgt/WorkWithShipmentPlans.bsh

then you'll submit the service call every time you'll visit the page:

https://localhost:8443/manufacturing/control/WorkWithShipmentPlans

You can edit the bsh script without the need to build and restart the
server.

Jacopo


Scott Gray wrote:

> I think it's a LocalDispatcher, but don't quote me on that.  Anyway there's
> a million examples in code, just search for runSync
>
>
> On 20/03/07, David Shere <[hidden email]> wrote:
>>
>> Thanks!  That's the line I was missing.  I must ask, though, what class
>> is "dispatcher" and how do I construct it?
>>
>> (I think I was dealing with ServiceXaWrapper)
>>
>> Scott Gray wrote:
>> > Map results = dispatcher.runSync("myService", inputMap);
>>
>>
>

Reply | Threaded
Open this post in threaded view
|

Re: Service calling a service

David Shere
In reply to this post by Jacopo Cappellato
Come to North Carolina.  We have sea and mountains!

Jacopo Cappellato wrote:
> really? And where I'm supposed to have my vacation? Sea or mountains? :-)

--
David Shere
Information Technology Services
Steele Rubber Products
www.SteeleRubber.com

Reply | Threaded
Open this post in threaded view
|

Re: Service calling a service

David Shere
In reply to this post by Jacopo Cappellato
I have tried this, and have had no luck.  I'm using this in
WorkWithShipmentPlans.bsh:

//----------
Map screenInMap = UtilMisc.toMap("orderId", "WS10000");
String printerName = "LaserJet-2420";
Map inMap = UtilMisc.toMap("screenLocation",
"component://order/widget/ordermgr/OrderPrintForms.xml#ShipGroupsPDF",
"printerName", printerName,
"userLogin", userLogin,
"screenContext", screenInMap);

dispatcher.runAsync("sendPrintFromScreen", inMap);
//------------

and I've modified this line in PrintServices.java:

//------------
String errMsg = "The following printer was not found: [" +
printerUriObj.toString() + "].";
//------------

and I've verified that I can print to this printer from Linux:

//------------
admin@raptor:~$ lpstat -dP
system default destination: LaserJet-2420
admin@raptor:~$ lpr -P LaserJet-2420 planes
//------------

and I get this error message in the OfBiz Log:

//------------

2007-03-21 16:25:25,617 (default-invoker-Thread-2) [
PrintServices.java:159:ERROR] The following printer was not found:
[LaserJet-2420].
2007-03-21 16:25:25,618 (default-invoker-Thread-2) [
ServiceDispatcher.java:415:ERROR] Service Error [sendPrintFromScreen]:
The following printer was not found: [LaserJet-2420].
2007-03-21 16:25:25,618 (default-invoker-Thread-2) [
TransactionUtil.java:252:ERROR]
---- exception report
----------------------------------------------------------
[TransactionUtil.rollback]
Exception: java.lang.Exception
Message: Stack Trace
---- stack trace
---------------------------------------------------------------
java.lang.Exception: Stack Trace
org.ofbiz.entity.transaction.TransactionUtil.rollback(TransactionUtil.java:251)
org.ofbiz.entity.transaction.TransactionUtil.rollback(TransactionUtil.java:233)
org.ofbiz.service.ServiceDispatcher.runSync(ServiceDispatcher.java:419)
org.ofbiz.service.ServiceDispatcher.runSync(ServiceDispatcher.java:211)
org.ofbiz.service.GenericDispatcher.runSync(GenericDispatcher.java:136)
org.ofbiz.service.job.GenericServiceJob.exec(GenericServiceJob.java:70)
org.ofbiz.service.job.JobInvoker.run(JobInvoker.java:221)
java.lang.Thread.run(Thread.java:595)
--------------------------------------------------------------------------------

2007-03-21 16:25:25,620 (default-invoker-Thread-2) [
TransactionUtil.java:262:INFO ] [TransactionUtil.rollback] transaction
rolled back
2007-03-21 16:25:25,621 (default-invoker-Thread-2) [
ServiceDispatcher.java:459:DEBUG] [[Sync service finished-
total:1.922,since last(Begin):1.923]] - 'JobDispatcher /
sendPrintFromScreen'
2007-03-21 16:25:25,621 (default-invoker-Thread-2) [
GenericServiceJob.java:117:ERROR]
---- exception report
----------------------------------------------------------
Async-Service failed.
Exception: java.lang.Exception
Message: The following printer was not found: [LaserJet-2420].
---- stack trace
---------------------------------------------------------------
java.lang.Exception: The following printer was not found: [LaserJet-2420].
org.ofbiz.service.job.GenericServiceJob.exec(GenericServiceJob.java:76)
org.ofbiz.service.job.JobInvoker.run(JobInvoker.java:221)
java.lang.Thread.run(Thread.java:595)
--------------------------------------------------------------------------------
//-----------

Thoughts?


Jacopo Cappellato wrote:

> Yes, literally millions of examples.
>
> However, this morning I've committed a first draft of the service in svn
> so I'd suggest you to update your local copy with a clean trunk and then
> you can test it, for example, in this way:
>
> //============================
> Map screenInMap = UtilMisc.toMap("orderId", orderId);
> Map inMap = UtilMisc.toMap("screenLocation",
> "component://order/widget/ordermgr/OrderPrintForms.xml#OrderPDF",
> "printerName", "//server/printer",
> "userLogin", userLogin,
> "screenContext", screenInMap);
>
> dispatcher.runAsync("sendPrintFromScreen", inMap);
> //============================
>
> A quick way to run this code is to copy it at the bottom of a bsh
> script, for example:
> applications/manufacturing/webapp/manufacturing/WEB-INF/actions/jobshopmgt/WorkWithShipmentPlans.bsh
>
>
> then you'll submit the service call every time you'll visit the page:
>
> https://localhost:8443/manufacturing/control/WorkWithShipmentPlans
>
> You can edit the bsh script without the need to build and restart the
> server.
>
> Jacopo
>
>
> Scott Gray wrote:
>> I think it's a LocalDispatcher, but don't quote me on that.  Anyway
>> there's
>> a million examples in code, just search for runSync
>>
>>
>> On 20/03/07, David Shere <[hidden email]> wrote:
>>>
>>> Thanks!  That's the line I was missing.  I must ask, though, what class
>>> is "dispatcher" and how do I construct it?
>>>
>>> (I think I was dealing with ServiceXaWrapper)
>>>
>>> Scott Gray wrote:
>>> > Map results = dispatcher.runSync("myService", inputMap);
>>>
>>>
>>
>
>

--
David Shere
Information Technology Services
Steele Rubber Products
www.SteeleRubber.com

Reply | Threaded
Open this post in threaded view
|

Re: Service calling a service

Jacopo Cappellato
David, all,

I'd like to clarify that this issue is not strictly related to OFBiz and
service calls.
It is an issue probably caused by my ignorance on the usage of the
javax.print API:

http://java.sun.com/j2se/1.4.2/docs/api/javax/print/package-summary.html

In that service I've just tried to implement what is described at the
bottom of that page; to that, I've added the code to search for a
printer by its URI.
Unfortunately, this is really the first time I play with this java api
and I'm not even sure if the approach I've followed is correct.
Even if this is a bit off topic in this list, if you could provide
suggestions on how to locate a lan printer (by printer name/address)
using the javax.printer api, I promise I will fix that service.

David, if it is simpler for you, you could try to implement a simple
Java class (following the pattern used in the above link) and try to
print a file with it; once you understand how this can be done I'll move
the code to the OFBiz service.
A second option could be to try to post this question ("How do I locate
and print to a lan printer using javax.print api?") to one of the many
Java forums in the Internet

Jacopo

David Shere wrote:

> I have tried this, and have had no luck.  I'm using this in
> WorkWithShipmentPlans.bsh:
>
> //----------
> Map screenInMap = UtilMisc.toMap("orderId", "WS10000");
> String printerName = "LaserJet-2420";
> Map inMap = UtilMisc.toMap("screenLocation",
> "component://order/widget/ordermgr/OrderPrintForms.xml#ShipGroupsPDF",
> "printerName", printerName,
> "userLogin", userLogin,
> "screenContext", screenInMap);
>
> dispatcher.runAsync("sendPrintFromScreen", inMap);
> //------------
>
> and I've modified this line in PrintServices.java:
>
> //------------
> String errMsg = "The following printer was not found: [" +
> printerUriObj.toString() + "].";
> //------------
>
> and I've verified that I can print to this printer from Linux:
>
> //------------
> admin@raptor:~$ lpstat -dP
> system default destination: LaserJet-2420
> admin@raptor:~$ lpr -P LaserJet-2420 planes
> //------------
>
> and I get this error message in the OfBiz Log:
>
> //------------
>
> 2007-03-21 16:25:25,617 (default-invoker-Thread-2) [
> PrintServices.java:159:ERROR] The following printer was not found:
> [LaserJet-2420].
> 2007-03-21 16:25:25,618 (default-invoker-Thread-2) [
> ServiceDispatcher.java:415:ERROR] Service Error [sendPrintFromScreen]:
> The following printer was not found: [LaserJet-2420].
> 2007-03-21 16:25:25,618 (default-invoker-Thread-2) [
> TransactionUtil.java:252:ERROR]
> ---- exception report
> ----------------------------------------------------------
> [TransactionUtil.rollback]
> Exception: java.lang.Exception
> Message: Stack Trace
> ---- stack trace
> ---------------------------------------------------------------
> java.lang.Exception: Stack Trace
> org.ofbiz.entity.transaction.TransactionUtil.rollback(TransactionUtil.java:251)
>
> org.ofbiz.entity.transaction.TransactionUtil.rollback(TransactionUtil.java:233)
>
> org.ofbiz.service.ServiceDispatcher.runSync(ServiceDispatcher.java:419)
> org.ofbiz.service.ServiceDispatcher.runSync(ServiceDispatcher.java:211)
> org.ofbiz.service.GenericDispatcher.runSync(GenericDispatcher.java:136)
> org.ofbiz.service.job.GenericServiceJob.exec(GenericServiceJob.java:70)
> org.ofbiz.service.job.JobInvoker.run(JobInvoker.java:221)
> java.lang.Thread.run(Thread.java:595)
> --------------------------------------------------------------------------------
>
>
> 2007-03-21 16:25:25,620 (default-invoker-Thread-2) [
> TransactionUtil.java:262:INFO ] [TransactionUtil.rollback] transaction
> rolled back
> 2007-03-21 16:25:25,621 (default-invoker-Thread-2) [
> ServiceDispatcher.java:459:DEBUG] [[Sync service finished-
> total:1.922,since last(Begin):1.923]] - 'JobDispatcher /
> sendPrintFromScreen'
> 2007-03-21 16:25:25,621 (default-invoker-Thread-2) [
> GenericServiceJob.java:117:ERROR]
> ---- exception report
> ----------------------------------------------------------
> Async-Service failed.
> Exception: java.lang.Exception
> Message: The following printer was not found: [LaserJet-2420].
> ---- stack trace
> ---------------------------------------------------------------
> java.lang.Exception: The following printer was not found: [LaserJet-2420].
> org.ofbiz.service.job.GenericServiceJob.exec(GenericServiceJob.java:76)
> org.ofbiz.service.job.JobInvoker.run(JobInvoker.java:221)
> java.lang.Thread.run(Thread.java:595)
> --------------------------------------------------------------------------------
>
> //-----------
>
> Thoughts?
>
>
> Jacopo Cappellato wrote:
>> Yes, literally millions of examples.
>>
>> However, this morning I've committed a first draft of the service in
>> svn so I'd suggest you to update your local copy with a clean trunk
>> and then you can test it, for example, in this way:
>>
>> //============================
>> Map screenInMap = UtilMisc.toMap("orderId", orderId);
>> Map inMap = UtilMisc.toMap("screenLocation",
>> "component://order/widget/ordermgr/OrderPrintForms.xml#OrderPDF",
>> "printerName", "//server/printer",
>> "userLogin", userLogin,
>> "screenContext", screenInMap);
>>
>> dispatcher.runAsync("sendPrintFromScreen", inMap);
>> //============================
>>
>> A quick way to run this code is to copy it at the bottom of a bsh
>> script, for example:
>> applications/manufacturing/webapp/manufacturing/WEB-INF/actions/jobshopmgt/WorkWithShipmentPlans.bsh
>>
>>
>> then you'll submit the service call every time you'll visit the page:
>>
>> https://localhost:8443/manufacturing/control/WorkWithShipmentPlans
>>
>> You can edit the bsh script without the need to build and restart the
>> server.
>>
>> Jacopo
>>
>>
>> Scott Gray wrote:
>>> I think it's a LocalDispatcher, but don't quote me on that.  Anyway
>>> there's
>>> a million examples in code, just search for runSync
>>>
>>>
>>> On 20/03/07, David Shere <[hidden email]> wrote:
>>>>
>>>> Thanks!  That's the line I was missing.  I must ask, though, what class
>>>> is "dispatcher" and how do I construct it?
>>>>
>>>> (I think I was dealing with ServiceXaWrapper)
>>>>
>>>> Scott Gray wrote:
>>>> > Map results = dispatcher.runSync("myService", inputMap);
>>>>
>>>>
>>>
>>
>>
>


Reply | Threaded
Open this post in threaded view
|

Re: Service calling a service

Walter Vaughan
Jacopo Cappellato wrote:
> David, all,
>
> I'd like to clarify that this issue is not strictly related to OFBiz and
> service calls.
> It is an issue probably caused by my ignorance on the usage of the
> javax.print API:
>
> http://java.sun.com/j2se/1.4.2/docs/api/javax/print/package-summary.html

DavidS said you were looking for code to discover lan printers. I definately
don't understand the one-dimension java printing tools, but I posted two
snippets of code at
http://forum.java.sun.com/thread.jspa?threadID=216673&start=17&tstart=0

Here's code to find printers that the machine the javaVM is running in knows
about. This code works, but needs cleanups since I think it imports too much
stuff. And I am NOT a java coder. This is only Proof of Concept.

<code>

import java.io.*;
import javax.print.*;
import javax.print.attribute.*;
import javax.print.attribute.standard.*;
import javax.print.attribute.AttributeSetUtilities.*;

public class Eltron3 {

         public static void main(String[] args) {
                 PrintService psZebra = null;
                 String sPrinterName = null;
                 PrintService[] services =
PrintServiceLookup.lookupPrintServices(null, null);
                 for (int i = 0; i < services.length; i++) {
                         PrintServiceAttribute attr =
services[i].getAttribute(PrinterName.class);
                         sPrinterName = ((PrinterName)attr).getValue();
                         System.out.println("Found printer: " + sPrinterName +
"\n");
                 }
                 System.out.println("Finshed\n");
         }
}


</code>

See the link for the code to print to a named printer with a byte stream.
--
Walter
Reply | Threaded
Open this post in threaded view
|

Re: Service calling a service

madhu
In reply to this post by David Shere
hi,
i want to insert data in 2 entities in one service call.for that i wrote the following service

<service name="updateStatus" engine="java" default-entity-name="TicketBookingDetails" other-entity-name="PaymentDetails"
                                location="org.ofbiz.eticket.ETicket_booking" invoke="updateStatus_TicketBooking" auth="false">
                <description>Update TicketBookingDetails</description>               
                <auto-attributes mode="IN" include="pk" optional="true"/>
                <auto-attributes mode="IN" include="nonpk" optional="true"/>
                                <attribute name="expMonth" type="String" mode="IN"  optional="true"/>
                <attribute name="expYear" type="String" mode="IN" optional="true"/>                               
        </service>

can i give like this
default-entity-name="TicketBookingDetails" other-entity-name="PaymentDetails"
and

in updateStatus_TicketBooking method i am calling another method.
Reply | Threaded
Open this post in threaded view
|

Re: Service calling a service

Rishi Solanki
You can use it in different way:
At the service level use default-entity-name="TicketBookingDetails" if you
want to use other entity then use <auto-attributes mode="IN" include="pk"
optional="true" entity-name="PaymentDetails"/>

The auto-attributes override the default-entity-name setting otherwise it
takes the default-entity. Another way to do this, just include the
additional parameters as in and add their implementation - <attribute
name="expYear" type="String" mode="IN" optional="true"/>

There is no other-entity-name attribute available at service definition
level tags.

HTH!

--
Rishi Solanki
Manager, Enterprise Software Development
HotWax Media Pvt. Ltd.
Direct: +91-9893287847
http://www.hotwaxmedia.com


On Fri, Jun 29, 2012 at 11:42 AM, madhu <[hidden email]>wrote:

> hi,
> i want to insert data in 2 entities in one service call.for that i wrote
> the
> following service
>
> <service name="updateStatus" engine="java"
> default-entity-name="TicketBookingDetails"
> other-entity-name="PaymentDetails"
>                                location="org.ofbiz.eticket.ETicket_booking"
> invoke="updateStatus_TicketBooking" auth="false">
>                <description>Update TicketBookingDetails</description>
>                <auto-attributes mode="IN" include="pk" optional="true"/>
>                <auto-attributes mode="IN" include="nonpk" optional="true"/>
>                                <attribute name="expMonth" type="String"
> mode="IN"  optional="true"/>
>                <attribute name="expYear" type="String" mode="IN"
> optional="true"/>
>        </service>
>
> can i give like this
> default-entity-name="TicketBookingDetails"
> other-entity-name="PaymentDetails"
> and
>
> in updateStatus_TicketBooking method i am calling another method.
>
>
> --
> View this message in context:
> http://ofbiz.135035.n4.nabble.com/Service-calling-a-service-tp145137p4634193.html
> Sent from the OFBiz - User mailing list archive at Nabble.com.
>