/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You 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.apache.stanbol.enhancer.engines.celi.sentimentanalysis.impl; import java.io.BufferedWriter; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.net.HttpURLConnection; import java.net.URL; import java.nio.charset.Charset; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Vector; import javax.xml.soap.MessageFactory; import javax.xml.soap.SOAPBody; import javax.xml.soap.SOAPException; import javax.xml.soap.SOAPMessage; import javax.xml.soap.SOAPPart; import javax.xml.transform.stream.StreamSource; import org.apache.clerezza.rdf.core.impl.util.Base64; import org.apache.commons.io.IOUtils; import org.apache.stanbol.enhancer.engines.celi.utils.Utils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.w3c.dom.Element; import org.w3c.dom.NodeList; public class SentimentAnalysisServiceClientHttp { static public final String positive="POSITIVE", negative="NEGATIVE"; /** * The UTF-8 {@link Charset} */ private static final Charset UTF8 = Charset.forName("UTF-8"); /** * The content type "text/xml; charset={@link #UTF8}" */ private static final String CONTENT_TYPE = "text/xml; charset="+UTF8.name(); /** * The XML version, encoding; SOAP envelope, heder and starting element of the body; * processTextRequest and text starting element. */ private static final String SOAP_PREFIX = "<?xml version=\"1.0\" encoding=\""+UTF8.name()+"\"?>" + "<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" " + "xmlns:sen=\"http://SentimentAnalysis.service.celi.it/\"><soapenv:Header/>" + "<soapenv:Body>"; /** * closes the text, processTextRequest, SOAP body and envelope */ private static final String SOAP_SUFFIX = "</soapenv:Body></soapenv:Envelope>"; private final URL serviceEP; private final String licenseKey; private final Map<String,String> requestHeaders; private final Logger log = LoggerFactory.getLogger(getClass()); private int connectionTimeout; public SentimentAnalysisServiceClientHttp(URL serviceUrl, String licenseKey, int connectionTimeout){ this.serviceEP=serviceUrl; this.licenseKey = licenseKey; this.connectionTimeout = connectionTimeout; Map<String,String> headers = new HashMap<String,String>(); headers.put("Content-Type", CONTENT_TYPE); if(licenseKey != null){ String encoded = Base64.encode(this.licenseKey.getBytes(UTF8)); headers.put("Authorization", "Basic "+encoded); } this.requestHeaders = Collections.unmodifiableMap(headers); } public List<SentimentExpression> extractSentimentExpressions(String text, String lang) throws SOAPException, IOException { if(text == null || text.isEmpty()){ //no text -> no extractions return Collections.emptyList(); } //create the POST request HttpURLConnection con = Utils.createPostRequest(serviceEP, requestHeaders,connectionTimeout); //write content BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(con.getOutputStream(),UTF8)); writer.write(SOAP_PREFIX); writer.write("<sen:analyzeText><arg0><![CDATA["+text+"]]></arg0><arg1>"+lang+"</arg1></sen:analyzeText>"); writer.write(SOAP_SUFFIX); writer.close(); //Call the service long start = System.currentTimeMillis(); InputStream stream = con.getInputStream(); log.debug("Request to {} took {}ms",serviceEP,System.currentTimeMillis()-start); // Create SoapMessage and parse the results MessageFactory msgFactory = MessageFactory.newInstance(); SOAPMessage message = msgFactory.createMessage(); SOAPPart soapPart = message.getSOAPPart(); // Load the SOAP text into a stream source StreamSource source = new StreamSource(new InputStreamReader(stream,UTF8)); // Set contents of message soapPart.setContent(source); SOAPBody soapBody = message.getSOAPBody(); //extract the results List<SentimentExpression> sentExpressions = new Vector<SentimentExpression>(); NodeList nlist = soapBody.getElementsByTagName("relation"); String snippetStr=null; for (int i = 0; i < nlist.getLength(); i++) { Element relation = (Element) nlist.item(i); String sentimentType=relation.getAttribute("type"); int startSnippet = Integer.parseInt( relation.getAttribute("start") ); int endSnippet = Integer.parseInt( relation.getAttribute("end") ); NodeList snippet = relation.getElementsByTagName("snippet"); if(snippet.getLength()>0){ snippetStr=snippet.item(0).getTextContent(); } List<String> arguments=new Vector<String>(); NodeList argsList = relation.getElementsByTagName("arguments"); for (int x = 0; x < argsList.getLength(); x++) { NodeList lemmas=((Element)argsList.item(x)).getElementsByTagName("lemma"); for (int y = 0; y < lemmas.getLength(); y++) { Element lemma=(Element)lemmas.item(y); String lemmaStr = lemma.getAttribute("lemma"); if(lemmaStr!=null && lemmaStr.length()>0) arguments.add(lemmaStr); } } SentimentExpression expr=new SentimentExpression(sentimentType, snippetStr,startSnippet,endSnippet,arguments); sentExpressions.add(expr); } return sentExpressions; } }