Skip to content

Instantly share code, notes, and snippets.

@mh-github
Last active August 29, 2015 14:27
Show Gist options
  • Select an option

  • Save mh-github/f2d7220394aa8f3d9c71 to your computer and use it in GitHub Desktop.

Select an option

Save mh-github/f2d7220394aa8f3d9c71 to your computer and use it in GitHub Desktop.
package com.mh.project.service;
import java.io.ByteArrayOutputStream;
import java.io.StringReader;
import java.io.StringWriter;
import java.util.List;
import java.util.logging.Logger;
import javax.annotation.Resource;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;
import javax.xml.ws.Provider;
import javax.xml.ws.Service;
import javax.xml.ws.ServiceMode;
import javax.xml.ws.WebServiceContext;
import javax.xml.ws.WebServiceProvider;
import org.jdom2.Element;
import org.jdom2.filter.Filters;
import org.jdom2.input.DOMBuilder;
import org.jdom2.xpath.XPathExpression;
import org.jdom2.xpath.XPathFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Text;
import org.xml.sax.InputSource;
import com.mh.project.util.Customer;
import com.mh.project.util.CustomerCalculator;
@ServiceMode(Service.Mode.PAYLOAD)
@WebServiceProvider(serviceName = "CustomerService", portName = "CustomerPort", wsdlLocation = "WEB-INF/wsdl/Customer.wsdl", targetNamespace = "http://www.mh.org/")
public class CustomerEndpoint implements Provider<Source> {
@Resource
WebServiceContext webServiceContext;
private static final Logger LOG = Logger
.getLogger(CustomerEndpoint.class.getName());
public Source invoke(Source request) {
LOG.info("Entered invoke method ... ");
ByteArrayOutputStream baos = null;
try {
// 1. get XML from request
final StringWriter requestXmlWriter = new StringWriter();
final Transformer trans = TransformerFactory.newInstance().newTransformer();
trans.transform(request, new StreamResult(requestXmlWriter));
final String requestXml = requestXmlWriter.toString();
LOG.info(requestXml);
// 2. convert xml string to Document
DocumentBuilderFactory dbfac = DocumentBuilderFactory.newInstance();
DocumentBuilder docBuilder = dbfac.newDocumentBuilder();
dbfac.setNamespaceAware(true);
Document reqDoc = docBuilder.parse(new InputSource(new StringReader(requestXml)));
// convert w3c Document to jdom2 Document
DOMBuilder builder = new DOMBuilder();
org.jdom2.Document inputDoc = builder.build(reqDoc);
// 3. business logic: parse document and calculate score
XPathFactory xFactory = XPathFactory.instance();
XPathExpression<Element> expr;
List<Element> elements;
Element element;
// fetch first and last name
expr = xFactory.compile("/req/prospect/customer/contact/name",
Filters.element());
elements = expr.evaluate(inputDoc);
for (Element elmnt : elements) {
String name = elmnt.getValue();
switch (elmnt.getAttributeValue("part")) {
case "first":
customer.setFirstName(name);
break;
case "last":
customer.setLastName(name);
}
}
// fetch email
expr = xFactory.compile("/req/prospect/customer/contact/email",
Filters.element());
element = expr.evaluateFirst(inputDoc);
if (element != null)
customer.setEmail(element.getValue());
// fetch zip code
expr = xFactory.compile(
"/req/prospect/customer/contact/address/postalcode",
Filters.element());
element = expr.evaluateFirst(inputDoc);
if (element != null)
customer.setZip(element.getValue());
// fetch city
expr = xFactory.compile(
"/req/prospect/customer/contact/address/city",
Filters.element());
element = expr.evaluateFirst(inputDoc);
if (element != null)
customer.setCity(element.getValue());
// fetch state
expr = xFactory.compile(
"/req/prospect/customer/contact/address/regioncode",
Filters.element());
element = expr.evaluateFirst(inputDoc);
if (element != null)
customer.setState(element.getValue());
// fetch phone number
expr = xFactory.compile("/req/prospect/customer/contact/phone",
Filters.element());
element = expr.evaluateFirst(inputDoc);
if (element != null)
customer.setPhone(element.getValue());
// fetch time frame
expr = xFactory.compile("/adf/prospect/customer/timeframe",
Filters.element());
element = expr.evaluateFirst(inputDoc);
if (element != null)
customer.setTimeframe(element.getValue());
// fetch purchase type
expr = xFactory.compile("/req/prospect/vehicle/finance/method",
Filters.element());
element = expr.evaluateFirst(inputDoc);
if (element != null)
customer.setPurchaseType(element.getValue());
// contact type preference
expr = xFactory.compile("/req/prospect/customer/contact/phone",
Filters.element());
element = expr.evaluateFirst(inputDoc);
if (element != null) {
customer.setContactType(element.getAttributeValue("type"));
customer.setContactTimePreference(element
.getAttributeValue("time"));
}
Customer customer = new Customer();
double score = new CustomerCalculator().calculate(customer);
LOG.info(Double.valueOf(score).toString());
// 4. return the score
Document respDoc = docBuilder.newDocument();
org.w3c.dom.Element rootElement = respDoc
.createElement("customer");
org.w3c.dom.Element childElement = respDoc.createElement("score");
Text textNode = respDoc.createTextNode(Double.valueOf(score)
.toString());
respDoc.appendChild(rootElement);
rootElement.appendChild(childElement);
childElement.appendChild(textNode);
Transformer xformer = TransformerFactory.newInstance()
.newTransformer();
baos = new ByteArrayOutputStream();
xformer.transform(new DOMSource(respDoc), new StreamResult(baos));
} catch (Exception e) {
e.printStackTrace();
}
return new StreamSource(new StringReader(baos.toString()));
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment