Last active
August 29, 2015 14:27
-
-
Save mh-github/f2d7220394aa8f3d9c71 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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