Use custom Java code to build the cache id
from input SOAP message contentIf you use custom Java code to build the cache id, create an ID
generator Java class that implements the IdGenerator
interface defined in the com.ibm.websphere.cache.webservices.IdGenerator
package and add a reference to the class you create in the cachespec.xml
file by using the idgenerator tag.
You can also implement
the com.ibm.websphere.cache.webservices.MetaDataGenerator package
to assign cache metadata such as timeout, priority, and dependency
ids to cache entries using the metadatagenerator tag.
Implement
the com.ibm.websphere.cache.webservices.InvalidationGenerator interface
and use the invalidationgenerator tag in the cachespec.xml
file to generate cache ids and to invalidate entries in the cache.
The id generated by the invalidation generator can be a cache id or
a dependency id.
For example, if you develop an ID generator
class named SampleIdGeneratorImpl, a metadata generator class named
SampleMetaDataGeneratorImpl, and an invalidation generator class named
SampleInvalidationGeneratorImpl, your cachespec.xml file might contain
the following:
<cache-entry>
<class>JAXRPCClient</class>
<name>http://TradeSample.com:9080/service/getquote</name>
<cache-id>
<idgenerator>com.mycompany.SampleIdGeneratorImpl</idgenerator>
<metadatagenerator>
com.mycompany.SampleMetaDataAndInvalidationGeneratorImpl
</metadatagenerator>
<timeout>60</timeout>
</cache-id>
<invalidation>http://TradeSample.com:9080/service/GetQuote
<invalidationgenerator>
com.mycompany.SampleMetaDataAndInvalidationGeneratorImpl
</invalidationgenerator>
</invalidation>
</cache-entry>
The SampleIdGeneratorImpl class is a
custom Java class that implements the
com.websphere.cache.webservices.IdGenerator interface.
The SampleIdGeneratorImpl class contains the getID method:
String getId(javax.xml.rpc.handler.soap.SOAPMessageContext messageContext)
The
following is an example of the SampleIdGeneratorImpl.java class.
public class SampleIdGeneratorImpl implements IdGenerator {
//The SampleIdGenerator class builds cache keys using SOAP header entries
public String getId(javax.xml.rpc.handler.soap.SOAPMessageContext
messageContext) {
....
// retrieve SOAP header entries from SOAPMessage
SOAPHeader sh = soapEnvelope.getHeader();
if (sh != null) {
Iterator it = sh.examineHeaderElements("com.mycompany.actor");
while (it.hasNext()) {
SOAPHeaderElement element =
(SOAPHeaderElement)it.next();
Name name = element.getElementName();
String headerEntryName = name.getLocalName();
if (headerEntryName.equals("getQuote")){
String sNamespace = element.getNamespaceURI("");
if (sNamespace != null && !sNamespace.equals("")) {
headerEntryName = sNamespace + ":" + headerEntryName;
String quotes = element.getValue();
}
...
...
// create a method "parseAndSort" to parse and sort quotes
// By parsing and sorting quotes, you avoid duplicate cache
// entries.
// quotes e.g. IBM,CSCO,MSFT,INTC
// to return a cache key "urn:stock:getQuote=CSCO,IBM,INTC,MSFT"
String sortQuotes = parseAndSort(quotes);
cacheKey = headerEntryName + "=" + sortQuotes;
}
}
return cacheKey;
}
}
The cache id for this sample is generated as http://TradeSample.com:9080/service/getquote:urn:stock:symbol=CSCO,IBM,INTC,MSFT.
The
SampleMetaDataAndInvalidationGeneratorImpl class is a custom Java class that implements the com.websphere.cache.webservices.MetaDataGenerator interface
and the com.websphere.cache.webservices.InvalidationGenerator interface.
The SampleMetaDataAndInvalidationGeneratorImpl class contains the
setMetaData method and the getInvalidationIds method. You can also
set up two smaller classes instead of this one large class. For example,
create one class for the metadata generator and a different class
for the invalidation generator. The following are method prototypes
for the setMetaData method and the getInvalidationIds method:
void setMetaData (javax.xml.rpc.handler.soap.SOAPMessageContext messageContext,
com.ibm.websphere.cache.webservices.JAXRPCEntryInfo entryInfo)
String[] getInvalidationIds (javax.xml.rpc.handler.soap.SOAPMessageContext messageContext)
An
example of the SampleMetaDataAndInvalidationGeneratorImpl.java class
follows:
public class SampleMetaDataAndInvalidationGeneratorImpl implements
MetaDataGenerator, InvalidationGenerator {
//assigns time limit, and priority metadata
public void setMetadata(javax.xml.rpc.handler.soap.SOAPMessageContext messageContext,
com.ibm.websphere.cache.webservices.JAXRPCEntryInfo entryInfo) {
....
// retrieve SOAP header entries from SOAPMessage
SOAPHeader sh = soapEnvelope.getHeader();
if (sh != null) {
Iterator it = sh.examineHeaderElements("com.mycompany.actor");
while (it.hasNext()) {
SOAPHeaderElement element =
(SOAPHeaderElement)it.next();
Name name = element.getElementName();
String headerEntryName = name.getLocalName();
if (headerEntryName.equals(“metadata”)) {
// retrieve each metadata element and set metadata
entryInfo.setTimeLimit(timeLimit);
entryInfo.setPriority(priority);
}
}
}
//builds invalidation ids using SOAP header.
public String[] getInvalidationIds(javax.xml.rpc.handler.soap.SOAPMessageContext
messageContext) { ....
// retrieve SOAP header entries from SOAPMessage
String[] invalidationIds = new String[1];
SOAPHeader sh = soapEnvelope.getHeader();
if (sh != null) {
Iterator it = sh.examineHeaderElements("com.mycompany.actor");
while (it.hasNext()) {
SOAPHeaderElement element =
(SOAPHeaderElement)it.next();
Name name = element.getElementName();
String headerEntryName = name.getLocalName();
if (headerEntryName.equals("invalidation")) {
String sNamespace = element.getNamespaceURI("");
if (sNamespace != null && !sNamespace.equals("")) {
headerEntryName = sNamespace + ":symbol";
String quotes = element.getValue();
}
...
...
// create a method "parseAndSort" to parse and sort quotes
// By parsing and sorting quotes, you avoid duplicate cache
// entries.
// quotes e.g. SUNW,NT
// to return a cache key "urn:stock:symbol=NT,SUNW"
String sortQuotes = parseAndSort(quotes);
invalidationIds[0] = headerEntryName + "=" sortQuotes;
}
}
return invalidationIds;
}
}
The invalidation id for this sample is generated as:
http://TradeSample.com:9080/service/getquote:urn:stock:symbol=NT,SUNW
An
example of the SOAP request generated by the client when using custom Java code follows:
POST /wsgwsoap1/soaprpcrouter HTTP/1.1
SOAPAction: ""
Context-type: text/xml, charset=utf-8
User-Agent: Java/1.4.1
Host: localhost
Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2
Connection: keep-alive
Content-Length:645
<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope
xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:xsd="https://www.w3.org/2001/XMLSchema"
xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance">
<soapenv:Header>
<getQuote soapenv:actor="com.mycompany.actor"
xmlns="urn:stock">IBM,CSCO,MSFT,INTC</getQuote>
<metaData soapenv:actor="com.mycompany.actor" xmlns="urn:stock">
<priority>10</priority>
<timeLimit>30000</timeLimit>
</metaData>
<invalidation soapenv:actor="com.mycompany.actor"
xmlns="urn:stock">SUNW, NT</invalidation>
</soapenv:Header>
<soapenv:Body
soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding">
<getQuote xmlns="urn:ibmwsgw#GetQuoteSample">
<symbol xsi:type="xsd:string">IBM,CSCO,MSFT,INTC</symbol>
</getQuote>
</soapenv:Body>
</soapenv:Envelope>