|
The Evolution of Data-Oriented Services by Matthew Zager
WSJ Vol 04 Issue 07 - pg.56
Listing 1 • XDS Mapping Document
<xdl:querysheet>
<xdl:datasource ns="personDB"/>
<xdl:statement ns="getPersons">
<![CDATA[
select person.firstname, person.lastname, passport.ppn
from person, location, passport
where person.id = passport.person and
person.location = location.id and
((location.x > {$upperLeftLon} and
location.x < {$lowerRightLon}) and
(location.y < {$upperLeftLat} and
location.y > {$lowerRightLat}))
]]>
</xdl:statement>
<xdl:element name="persons">
<xdl:transaction datasource="%personDB" exception="stop">
<xdl:session statement="%getPersons" mode="query">
<xdl:for-each expr="*">
<xdl:element name="person">
<xdl:element name="firstName" expr="*1"/>
<xdl:element name="lastName" expr="*2"/>
<xdl:element name="passportNumber" expr="*3"/>
</xdl:element>
</xdl:for-each>
</xdl:session>
</xdl:transaction>
</xdl:element>
</xdl:querysheet>
Listing 2 • RPC WSDL
<wsdl:definitions>
<types>
<xsd:schema>
<xsd:import namespace="http://schemas.xmlsoap.org/soap/encoding/"/>
<xsd:complexType name="personResults">
<xsd:sequence>
<xsd:element name="persons" type="intf:personList"/>
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="personList">
<xsd:sequence>
<xsd:element name="person" type="intf:personType" minOccurs="0"
maxOccurs="unbounded"/>
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="personType">
<xsd:sequence>
<xsd:element name="firstName" type="xsd:string"/>
<xsd:element name="lastName" type="xsd:string"/>
<xsd:element name="passportNumber" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
</xsd:schema>
</types>
<wsdl:message name="requestPersonnelResponse">
<wsdl:part name="requestPersonnelReturn" type=
"impl:personResults"/>
</wsdl:message>
<wsdl:message name="requestPersonnelRequest">
<wsdl:part name="upperLeftLat" type="xsd:float"/>
<wsdl:part name="upperLeftLon" type="xsd:float"/>
<wsdl:part name="lowerRightLat" type="xsd:float"/>
<wsdl:part name="lowerRightLon" type="xsd:float"/>
</wsdl:message>
.
.
</wsdl:definitions>
Listing 3•Axis Service Implementation
public Document requestPersonnel(float upperLeftLat, float
upperLeftLon, float lowerRightLat, float lowerRightLon) throws
XDSException {
//Load a HashMap with parameters
HashMap pMap = new HashMap();
pMap.put ("upperLeftLat", String.valueOf(upperLeftLat));
pMap.put ("upperLeftLon", String.valueOf(upperLeftLon));
pMap.put ("lowerRightLat", String.valueOf(lowerRightLat));
pMap.put ("lowerRightLon", String.valueOf(lowerRightLon));
//Instantiate XDS, set mode to XML DOM, execute with
parameters
XMLDataService xds = new XMLDataService("requestPersonnel.xds");
xds.setMode (XDSProcessor.DOM);
return (Document) xds.get(pMap);
}
Listing 4 JSP Service Implementation
<%-- Execute XDS mapping with HTTP parameters --%>
<xds:get map='requestPersonnel.xds' mode='DOM'>
<xds:param name='upperLeftLat' value='<%=request.getParameter("upperLeftLat")%>'/>
<xds:param name='upperLeftLon' value='<%=request.getParameter("upperLeftLon")%>'/>
<xds:param name='lowerRightLat' value='<%=request.getParameter("lowerRightLat")%>'/>
<xds:param name='lowerRightLon' value='<%=request.getParameter("lowerRightLon")%>'/>
</xds:get>
Listing 5 Self-Service SOAP Envelope
<ns1:Envelope>
<ns2:Parameters>
<ns2:Parameter name="upperLeftLat" value="value"/>
<ns2:Parameter name="upperLeftLon" value="value"/>
<ns2:Parameter name="lowerRightLat" value="value"/>
<ns2:Parameter name="lowerRightLon" value="value"/>
</ns2:Parameters>
<ns2:Mapping>
<xdl:querysheet>
...
</xdl:querysheet>
</ns2:Mapping>
</ns1:Envelope>
Listing 6 Self-Service Axis Implementation
public Document service(Document msg) {
//Parse the Parameter Elements and load HashMap
HashMap pMap = new HashMap();
Element parameters = (Element) msg.getElementsByTagNameNS("ns2",
"Parameters").item(0);
NodeList params = parameters.getElementsByTagNameNS("ns2", "Parameter");
for(int i=0; i < params.getLength(); i++) {
Element param = (Element) params.item(i);
pMap.put(param.getAttribute("name"), param. getAttribute("value"));
}
//Get the XDS mapping document from the SOAP Body
Document map =
DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument();
Element mapping = (Element) msg.getElementsByTagNameNS("ns2",
"Mapping").item(0);
Node xdsroot = map.importNode(mapping.getFirstChild(), true);
map.appendChild(xdsroot);
//Instantiate XDS, set mode to XML DOM, execute with parameters
XMLDataService xds = new XMLDataService(map);
xds.setMode(com.saic.xds.XDSProcessor.DOM);
return (Document) xds.get(pMap);
}
Listing 7 Self-Service JSP Implementation
<xds:get map='REQUEST' mode='DOM'>
<%-- create an XDS parameter for each request parameter --%>
<%
Map paramMap = request.getParameterMap();
Iterator paramIter = paramMap.keySet().iterator();
while(paramIter.hasNext()) {
String key = (String) paramIter.next();
String value = ((String []) paramMap.get(key)) [0];
%>
<xds:param name='<%=key%>' value='<%=value%>'/>
<%
}
%>
</xds:get>
|