fea310d2bb06e08ad2662613086e5f85.ppt
- Количество слайдов: 22
Service Wrapper Example 15 -1
Learning Objectives ● This module will help you. . . – Understand how to create your own advertisement – Understand how to register new advertisement – Understand how to use module advertisements – Understand how to discover modules 15 -1
Print Service Tutorial ● Illustrates how to wrap a JXTA service around a traditional service, such as an lpr printer – Create an advertisement describing the printer – Create module advertisements for the printer – Publish the advertisements – Discover the service – Print to the service 15 -1
“JXTA-ify” a Service Part #1 – – Wait for print jobs – Open a connection to the printer – ● Create a service advertisement describing the printer service (printer name, global position, IP address, port, and capabilities) Send print job to the printer Part #2 (java, C) – Discover the printer module advertisement – Extract the printer advertisement – Resolve the printer's pipe – Send a print job(s) 15 -1
Print Service Tutorial Overview Spooler Service Print Client Module Class Adv Module Spec Adv Input. Pipe 15 -1
“JXTA-ify” a Service ● Part #1 – Create a service advertisement describing the printer service (printer name, global position, IP address, port, and capabilities) – Wait for print jobs – Open a connection to the printer – Send print job to the printer 15 -1
Creating the Printer's Advertisement /** * A Lpr. Printer. Advertisement describes an lpr printer advertisement. Its main * purpose is to formally document the existence of a printer */ public abstract class Lpr. Printer. Advertisement extends Advertisement implements Cloneable { private String description = null; private ID id = null; private String ip. Address = null; private String location = null; private String manufacturer = null; private String model = null; private String name = null; private Pipe. ID pipe = null; // default lpr socket port private int port = 9100; private String resolution = null; private String type = null; private double longitude=0; private double latitude=-1; private int altitude=0; . . . . public class Lpr. Printer. Adv. Impl extends Lpr. Printer. Advertisement { /** * Constructor for the Lpr. Printer. Adv. Impl object */ public Lpr. Printer. Adv. Impl(Element root) { initialize(root); } 15 -1
Create Printer's Advertisement public Lpr. Printer. Advertisement create. New. Printer (Peer. Group group, String name, String desc, String Model, String ip. Address, int port, double latitude, double longitude, int altitude) { try { Discovery. Service discovery = group. get. Discovery. Service(); // use a codat id for the printer Codat. ID pid = IDFactory. new. Codat. ID(group. get. Peer. Group. ID()); // create the pipe id this printer is going to be attached to Pipe. ID pipe = IDFactory. new. Pipe. ID(group. get. Peer. Group. ID()); // the printer advertisement String module. Spec. URI = null; Lpr. Printer. Adv. Impl adv = new Lpr. Printer. Adv. Impl(); adv. set. Name(name); adv. set. Description(desc); adv. set. IPAddress(ip. Address); adv. set. Port(port); adv. set. Altitude(altitude); adv. set. Latitude(latitude); adv. set. Longitude(longitude); adv. set. Pipe. ID(pipe); adv. set. Printer. ID(pid); 15 -1
Create Printer's Advertisement (cont. ) // module class id for this print service URL mc. URL = IDFactory. jxta. URL(mc. URI); Module. Class. ID mc. ID = (Module. Class. ID) IDFactory. from. URL(mc. URL); // module spec id for this print service URL ms. URL = IDFactory. jxta. URL(ms. URI); Module. Spec. ID ms. ID = (Module. Spec. ID) IDFactory. from. URL(ms. URL); Module. Manager mod. Mgr = Module. Manager. get. Module. Manager(group); mod. Mgr. create. Service. Advertisement(group, name, desc, ms. URI, //no module code null, mc. URI, mc. ID, ms. ID, (Advertisement) adv, discovery. DEFAULT_LIFETIME, discovery. DEFAULT_EXPIRATION); return adv; } catch (Malformed. URLException bad. ID) { throw new Illegal. Argument. Exception("Bad MC ID"); } catch (Unknown. Service. Exception bad. ID) { throw new Illegal. Argument. Exception("Unusable MC ID"); } catch (IOException ie) { throw new Runtime. Exception("failed to publish Advertisements", ie); } } 15 -1
Discover/Create Printer Adv. private Lpr. Printer. Advertisement find. Or. Create. Printer(Peer. Group group) { try { enum = discovery. get. Local. Advertisements(discovery. ADV, "MSID", ms. URI) ; } catch (IOException ie) {} if (enum != null && enum. has. More. Elements()) { System. out. println("Looking in local cache"); while (enum. has. More. Elements()) { Advertisement adv = (Advertisement) enum. next. Element(); if (adv instanceof Module. Impl. Advertisement) { Module. Manager mod. Mgr = Module. Manager. get. Module. Manager(group); try { padv = mod. Mgr. get. Service. Advertisement(group, (Module. Impl. Advertisement) adv, Lpr. Printer. Advertisement. get. Advertisement. Type()); } catch (Exception e) { continue; } if (padv != null && padv instanceof Lpr. Printer. Advertisement) { System. out. println("Found Printer Advertisement"); return (Lpr. Printer. Advertisement) padv; } } // could not find the printer's advertisement, recreate it System. out. println("Creating new Printer Advertisements"); return create. New. Printer(group, "Xerox work. Set", "Postscript Duplex Printer", "Xerox work. Set", "192. 9. 200. 1", 9100, 50, 0, 0); 15 -1
Class Spooler public class Spooler implements Pipe. Msg. Listener, Runnable { // Module Class ID private final static String mc. URI = "urn: jxta: uuid. A 3 E 3952 F 55 D 448 DBBC 66948 F 8 C 0 DB 04105"; // Module Spec ID String ms. URI = "urn: jxta: uuid-A 3 E 3952 F 55 D 448 DBBC 66948 F 8 C 0 DB 041 E 9 0 B 8 F 31 D 111491 DAF 32 AB 5 AD 441940 B 06"; /** * Constructor for the Spooler object */ public Spooler() { } 15 -1
Class Spooler Start JXTA and the Printer's Pipe /** * Start the Net. Peer. Group, create the input pipe and wait for print jobs * * @param args command line arguments */ public static void main(String[] args) { Spooler spooler = new Spooler(); spooler. start. Jxta(); //Register Lpr. Printer. Advertisement with the Advertisement. Factory. register. Advertisement. Instance( Lpr. Printer. Advertisement. get. Advertisement. Type(), new Lpr. Printer. Adv. Impl. Instantiator()); //create the printer in the Net. Peer. Group Lpr. Printer. Advertisement printer. Adv = spooler. find. Or. Create. Printer(spooler. net. Peer. Group); } //create the pipe Advertisement for this printer spooler. create. Pipe. Adv(printer. Adv); try { System. out. println("Starting the Printer Pipe"); // start listening on the input pipe, and // register spooler as the msg listener spooler. input. Pipe = spooler. net. Peer. Group. get. Pipe. Service(). create. Input. Pipe(spooler. pipe. Adv, spooler); spooler. run(); } catch (IOException e) {} 15 -1
Class Spooler Wait for Print Jobs. . . public void pipe. Msg. Event(Pipe. Msg. Event event) { } Message msg = null; try { // grab the message from the event msg = event. get. Message(); Message. Element printjob = msg. get. Message. Element(null, job. Tag); // push the print job on the queue. push(printjob, -1); } catch (Interrupted. Exception e) {} public void run() { System. out. println("Waiting for print jobs"); while (true) { try { // pop the print job off the queue Message. Element el = (Message. Element) queue. pop(0); if (el != null) { System. out. println("Received a print job"); print(inet. Address, port, el); } } catch (Interrupted. Exception ie) {} } } 15 -1
Class Spooler. . . and Print private void print(Inet. Address inet. Address, int port, Message. Element data) { try { System. out. print("Printing. . . "); //open a connection to the lpr printer Socket socket = new Socket(inet. Address, port); Output. Stream out = socket. get. Output. Stream(); data. send. To. Stream(out); out. flush(); socket. close(); System. out. println("done"); } catch (Exception e) {} } 15 -1
“JXTA-ify” a Service ● Part #2 – Discover the printer module advertisement – Extract the printer advertisement – Resolve the printer's pipe – Send a print job(s) 15 -1
Discover/Create Printer Adv. private Pipe. Advertisement find. Printer() { // for brevity we issue a remote discovery followed by local discovery. get. Remote. Advertisements(null, discovery. ADV, "MSID", Spooler. ms. URI, 1, this); Enumeration enum = null; try { enum = discovery. get. Local. Advertisements(discovery. ADV, "MSID", Spooler. ms. URI); } catch (IOException ie) {} if (enum != null && enum. has. More. Elements()) { Module. Impl. Advertisement mia = null; System. out. println("Looking in local cache"); while (enum. has. More. Elements()) { Advertisement adv = (Advertisement) enum. next. Element(); if (adv instanceof Module. Impl. Advertisement) { Pipe. Advertisement padv = get. Pipe. Advertisement( (Module. Impl. Advertisement) adv); if (padv == null) { continue; } return padv; } } return null; 15 -1
Discover/Create Printer Advertisement public void discovery. Event(Discovery. Event ev) { } Discovery. Response. Msg res = ev. get. Response(); Enumeration enum = res. get. Advertisements(); while (enum. has. More. Elements()) { adv = (Advertisement) enum. next. Element(); if (adv instanceof Module. Impl. Advertisement) { // create a pipe advertisement from the // printer's Module. Impl. Advertisement Pipe. Advertisement padv = get. Pipe. Advertisement( (Module. Impl. Advertisement) adv); if (padv == null) { continue; } pipe. Adv = padv; synchronized (lock) { // we found the printer notify lock. notify(); } } } 15 -1
Discover/Create Printer Advertisement public static void main(String args[]) { } Print printer = new Print(); printer. start. Jxta(); printer. pipe. Adv = printer. find. Printer(); if (printer. pipe. Adv != null) { try { //wait until we find the printer synchronized (printer. lock) { printer. lock. wait(); } } catch (Interrupted. Exception ie) {} } // we found the printer try { pipe. create. Output. Pipe(printer. pipe. Adv, printer); } catch (IOException e) { } 15 -1
“JXTA-ify” a Service JXTA-C shell command lpr_print. c – Resolve the printer's pipe – Send a print job(s) 15 -1
lpr_print. c static void connect_to_printer () { Jxta_pipe_adv* adv = NULL; Jxta_status res; Jxta_pipe* pipe = NULL; Jxta_outputpipe* op = NULL; // obtain the printer's pipe advertisement adv = get_printer_pipe_adv (DEFAULT_TIMEOUT); if (adv != NULL) { res = jxta_pipe_service_timed_connect (pipe_service, adv, 30 * 1000, NULL, &pipe); if (res != JXTA_SUCCESS) { printf("Cannot connect to printern"); return; } res = jxta_pipe_get_outputpipe (pipe, &op) ; } if (res != JXTA_SUCCESS) { printf ("Cannot get printer's outputpipen"); return; } // send the printjob lpr_print(op, printjob, length); JXTA_OBJECT_RELEASE (adv); } else { printf ("Cannot retreive printer's advertisementn"); } 15 -1
lpr_print Static void lpr_print (Jxta_outputpipe* op, char* printjob, int length) { Jxta_message* msg = jxta_message_new(); Jxta_message_element* el = NULL; char* pt = NULL; Jxta_status res; JXTA_OBJECT_CHECK_VALID (op); JXTA_OBJECT_RELEASE (el); el = jxta_message_element_new_1 ((char*) JOBTAG, (char*) "application/octet-stream", printjob, length, NULL ); jxta_message_add_element JXTA_OBJECT_RELEASE (el); (msg, el); res = jxta_outputpipe_send (op, msg); if (res != JXTA_SUCCESS) { printf ("sending failed: %dn", (int) res); } } JXTA_OBJECT_CHECK_VALID (msg); JXTA_OBJECT_RELEASE (msg); 15 -1
End – Service Wrapper Example 15 -1
fea310d2bb06e08ad2662613086e5f85.ppt