The general grammar for the possible XML descriptions is specified
by the following DTD:
<!DOCTYPE XMLDESCRIPTION [
<!--beginning of element declarations-->
<!--the root tag of client-->
<!ELEMENT XMLDESCRIPTION (OPERATOR |
CONNECTOR)>
<!ELEMENT OPERATOR (UNIQUE_ID, CODEURL,(OP_INPUT)*,
(OP_OUTPUT)*)>
<!ELEMENT CONNECTOR (UNIQUE_ID, CODEURL,
NETWORK_INFO>
<!ELEMENT UNIQUE_ID (#PCDATA)>
<!ELEMENT CODEURL (#PCDATA)>
<!ELEMENT OP_INPUT (NETWORKINFO, MEDIAINFO)>
<!ELEMENT OP_OUTPUT (NETWORKINFO, MEDIAINFO)>
<!ELEMENT NETWORKINFO (TYPE, SUBTYPE
, CONNECTORNAME, ORDERED, RELIABLE, LOWERBANDWIDTH, HIGHERBANDWITH,PORT)>
<!ELEMENT MEDIAINFO (TEXT|IMAGE|NRMI|AUDIO|SPEECH|VIDEO|SLIDES)>
<!ELEMENT TYPE (#PCDATA)>
<!ELEMENT SUBTYPE (#PCDATA)>
<!ELEMENT CONNECTORNAME (#PCDATA)>
<!ELEMENT ORDERED (#PCDATA)>
<!ELEMENT RELIABLE (#PCDATA)>
<!ELEMENT LOWERBANDWIDTH (#PCDATA)>
<!ELEMENT HIGHERBANDWIDTH (#PCDATA)>
<!ELEMENT PORT (#PCDATA)>
<!ELEMENT TEXT (TEXTSTRUCTURALINFO,TEXTSEMANTICINFO?)>
<!ELEMENT IMAGE (IMAGESTRUCTURALINFO)>
<!ELEMENT NRMI (NRMISTRUCTURALINFO)>
<!ELEMENT AUDIO (AUDIOSTRUCTURALINFO,AUDIOSEMANTICINFO?)>
<!ELEMENT SPEECH (SPEECHSTRUCTURALINFO,SPEECHSEMANTICINFO?)>
<!ELEMENT VIDEO (VIDEOSTRUCTURALINFO,VIDEOSEMANTICINFO?)>
<!ELEMENT SLIDES (SLIDESSTRUCTURALINFO)>
<!ELEMENT TEXTSTRUCTURALINFO
(ENCODING)>
<!ELEMENT IMAGESTRUCTURALINFO
(ENCODING,RESOLUTION?)>
<!ELEMENT NRMISTRUCTURALINFO
EMPTY>
<!ELEMENT AUDIOSTRUCTURALINFO
(ENCODING,SAMPLERATE)>
<!ELEMENT SPEECHSTRUCTURALINFO
(ENCODING,SAMPLERATE)>
<!ELEMENT VIDEOSTRUCTURALINFO
(ENCODING,RESOLUTION*,FRAMERATE*)>
<!ELEMENT SLIDESSTRUCTURALINFO
(ENCODING,RESOLUTION?)>
<!ELEMENT TEXTSEMANTICINFO
(TEXTUAL)>
<!ELEMENT AUDIOSEMANTICINFO
(AURAL)>
<!ELEMENT SPEECHSEMANTICINFO
(AURAL)>
<!ELEMENT VIDEOSEMANTICINFO
(VISUAL,AURAL,TEXTUAL)>
<!ELEMENT ENCODING (#PCDATA)>
<!ELEMENT SAMPLERATE (#PCDATA)>
<!ELEMENT FRAMERATE (#PCDATA)>
<!ELEMENT RESOLUTION (#PCDATA)>
<!ELEMENT VISUAL (BOOL)>
<!ELEMENT AURAL (BOOL,LANG)>
<!ELEMENT TEXTUAL (BOOL,LANG)>
<!ELEMENT BOOL (#PCDATA)>
<!ELEMENT LANG (#PCDATA)>
<!--end of element declarations-->
<!--beginning of attribute declarations-->
]>
For those of you who are not familiar with XML DTDs -- Dont
worry! An example follows, so all this will shortly make sense.
ENGLISH TO PIG-LATIN CONVERTER:
The following example converts from English text to PigLatin text:
package ninja.activeproxy.path.demo;
import java.io.*;
import java.net.*;
import java.rmi.*;
import ninja.activeproxy.path.*;
// The java class for our service has to extend Operator and implement
the OperatorIF and SDSOperatorIF
public class EnglishToPigLatin extends Operator implements OperatorIF,
SDSOperatorIF{
public EnglishToPigLatin() throws RemoteException{
super();
}
// This is the meat of the code
public void run() {
// reader and writer are the input
and output streams
BufferedReader reader;
BufferedWriter writer;
String outs;
// pathID is an identifier for the
path that this operator belongs to
Object pathId = getPathID(Thread.currentThread());
if (pathId == null) System.out.println("pathId
not found, EncodeOperator.");
// instantiate the reader and writer
streams
reader = new BufferedReader(new InputStreamReader(getReader(pathId)));
writer = new BufferedWriter(new OutputStreamWriter(getWriter(pathId)));
// What follows is the actual English-to-PigLatin Converter
String s;
boolean done = false;
char first = ' ';
boolean wordStart = true;
while (!done) {
try {
//
Read a line of input
s = reader.readLine();
System.out.println("Read:
" + s);
if (s
== null) {
System.out.println("EC Socket closed.");
done = true;
}
outs = new String();
// Do whatever
you are supposed to do with it
for (int i = 0; i < s.length();
i++ )
{
char c = s.charAt(i);
if (Character.isLetterOrDigit(c)) {
if (wordStart) first = c;
else outs += c;
wordStart = false;
} else {
if (!wordStart) {
outs += first;
outs += "ay";
wordStart = true;
}
outs += c;
}
}
if (!wordStart)
{
outs += first;
outs += "ay";
}
// write
out your output, and remember to flush the stream
writer.write(outs);
writer.newLine();
writer.flush();
} catch (IOException
e) {
System.out.println("IOException in EncodeOperator." + e);
}
}
}
// This method is used to return an XML description
of the operator to the SDS
public String GetServiceDescriptor() {
String descr = "";
try {
// This returns the
contents of the xml file with the same name as the operator
descr = getOperatorDescription();
} catch (Exception e) {
}
System.out.println("Returning xml description:
" + descr);
return descr;
}
The corresponding XML description for the English to PigLatin Converter
operator follows:
<?xml version="1.0"?>
<XMLDESCRIPTION>
<! this specifies that it is an operator and not a connector>
<OPERATOR>
<! specifies the unique id of this operator>
<UNIQUE_ID>ninja.activeproxy.path.demo.EnglishToPigLatin</UNIQUE_ID>
<! Input>
<OP_INPUT>
<! Network Information>
<NETWORKINFO>
<! you are not looking for a specific protocol>
<TYPE>GENERIC</TYPE>
<SUBTYPE>STREAM</SUBTYPE>
<! various parameters>
<CONNECTORNAME>NONE</CONNECTORNAME>
<ORDERED>YES</ORDERED>
<RELIABLE>YES</RELIABLE>
<LOWERBANDWIDTH>ANY</LOWERBANDWIDTH>
<HIGHERBANDWIDTH>ANY</HIGHERBANDWIDTH>
</NETWORKINFO>
<MEDIAINFO>
<TEXT>
<TEXTSTRUCTURALINFO></TEXTSTRUCURALINFO>
<TEXTSEMANTICINFO>
<TEXTUAL>
<LANG>ENGLISH</LANG>
</TEXTUAL>
</TEXTSEMANTICINFO>
</TEXT>
</MEDIAINFO>
</OP_INPUT>
<! similarly for the output>
<OP_OUTPUT>
<NETWORKINFO>
<TYPE>GENERIC</TYPE>
<SUBTYPE>STREAM</SUBTYPE>
<CONNECTORNAME>NONE</CONNECTORNAME>
<ORDERED>YES</ORDERED>
<RELIABLE>YES</RELIABLE>
<LOWERBANDWIDTH>ANY</LOWERBANDWIDTH>
<HIGHERBANDWIDTH>ANY</HIGHERBANDWIDTH>
</NETWORKINFO>
<MEDIAINFO>
<TEXT>
<TEXTSTRUCTURALINFO></TEXTSTRUCURALINFO>
<TEXTSEMANTICINFO>
<TEXTUAL>
<LANG>PIG LATIN</LANG>
</TEXTUAL>
</TEXTSEMANTICINFO>
</TEXT>
</MEDIAINFO>
</OP_OUTPUT>
</OPERATOR>
</XMLDESCRIPTION>