/** * Copyright 2010 Red Hat, Inc. and/or its affiliates. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.jbpm.process.workitem.rest; import java.io.BufferedReader; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; import java.util.ArrayList; import java.util.List; import java.util.Set; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import org.jbpm.process.workitem.AbstractLogOrThrowWorkItemHandler; import org.kie.api.runtime.process.WorkItem; import org.kie.api.runtime.process.WorkItemManager; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.xml.sax.SAXException; /*@author: salaboy*/ public class RestGeoCodeApiCallWorkItemHandler extends AbstractLogOrThrowWorkItemHandler { private static final Logger logger = LoggerFactory.getLogger(RestGeoCodeApiCallWorkItemHandler.class); private List<ResultGeoCodeApi> results; private int httpResponseCode; public void executeWorkItem(WorkItem workItem, WorkItemManager manager) { try { //APPID from yahoo TIpNDenV34Fwcw_x32k1eX6AlQzq4wajFEFvG501Pwc6w9jKEfy2vGnkIn.r5qSQqVvyhPPaTFo- String URL = (String) workItem.getParameter("URL"); workItem.getParameters().remove("URL"); URL = URL + (String) workItem.getParameter("Service"); workItem.getParameters().remove("Service"); URL = URL + (String) workItem.getParameter("Method"); workItem.getParameters().remove("Method"); Set<String> keys = workItem.getParameters().keySet(); for (String parameter : keys) { URL = URL + parameter + "=" + workItem.getParameter(parameter) + "&"; } HttpURLConnection connection; URL getUrl = new URL(URL); connection = (HttpURLConnection) getUrl.openConnection(); connection.setRequestMethod("GET"); logger.info("Content-Type: {}", connection.getContentType()); BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream())); String line = reader.readLine(); String response = ""; while ((line = reader.readLine()) != null) { response +=line; } setHttpResponseCode(connection.getResponseCode()); this.results = parseResults(response); logger.info("{}" + response); connection.disconnect(); } catch (Exception ex) { handleException(ex); } } private List<ResultGeoCodeApi> parseResults(String xml){ List<ResultGeoCodeApi> results = new ArrayList<ResultGeoCodeApi>(); try { DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.newInstance(); DocumentBuilder docBuilder = docBuilderFactory.newDocumentBuilder(); Document doc = docBuilder.parse(new ByteArrayInputStream(xml.getBytes())); // normalize text representation doc.getDocumentElement ().normalize (); NodeList listOfResults = doc.getElementsByTagName("Result"); for(int i= 0; i< listOfResults.getLength(); i++){ ResultGeoCodeApi result = new ResultGeoCodeApi(); Node nodeResult = listOfResults.item(i); if(nodeResult.getNodeType() == Node.ELEMENT_NODE){ Element elementResult = (Element)nodeResult; result.setPrecision(elementResult.getAttribute("precision")); NodeList latitudes = elementResult.getElementsByTagName("Latitude"); Element latitudeElement = (Element)latitudes.item(0); NodeList latitudeNodes = latitudeElement.getChildNodes(); result.setLatitude(((Node)latitudeNodes.item(0)).getNodeValue().trim()); NodeList longitudes = elementResult.getElementsByTagName("Longitude"); Element longitudeElement = (Element)longitudes.item(0); NodeList longitudeNodes = longitudeElement.getChildNodes(); result.setLongitude(((Node)longitudeNodes.item(0)).getNodeValue().trim()); NodeList addresses = elementResult.getElementsByTagName("Address"); Element addressElement = (Element)addresses.item(0); NodeList addressNodes = addressElement.getChildNodes(); result.setAddress(((Node)addressNodes.item(0)).getNodeValue().trim()); NodeList cities = elementResult.getElementsByTagName("City"); Element cityElement = (Element)cities.item(0); NodeList cityNodes = cityElement.getChildNodes(); result.setCity(((Node)cityNodes.item(0)).getNodeValue().trim()); NodeList states = elementResult.getElementsByTagName("State"); Element stateElement = (Element)states.item(0); NodeList stateNodes = stateElement.getChildNodes(); result.setState(((Node)stateNodes.item(0)).getNodeValue().trim()); NodeList zips = elementResult.getElementsByTagName("Zip"); Element zipElement = (Element)zips.item(0); NodeList zipNodes = zipElement.getChildNodes(); result.setZip(((Node)zipNodes.item(0)).getNodeValue().trim()); NodeList countries = elementResult.getElementsByTagName("Country"); Element countryElement = (Element)countries.item(0); NodeList countryNodes = countryElement.getChildNodes(); result.setCountry(((Node)countryNodes.item(0)).getNodeValue().trim()); results.add(result); } } } catch (SAXException ex) { logger.error("Error durring processing", ex); } catch (IOException ex) { logger.error("Error durring processing", ex); } catch (ParserConfigurationException ex) { logger.error("Error durring processing", ex); } return results; } public void abortWorkItem(WorkItem workItem, WorkItemManager manager) { // Do nothing, this work item cannot be aborted } /** * @return the results */ public List<ResultGeoCodeApi> getResults() { return results; } /** * @return the httpResponseCode */ public int getHttpResponseCode() { return httpResponseCode; } /** * @param httpResponseCode the httpResponseCode to set */ public void setHttpResponseCode(int httpResponseCode) { this.httpResponseCode = httpResponseCode; } }