You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
257 lines
7.4 KiB
257 lines
7.4 KiB
package de.superx.bin; |
|
|
|
import java.io.BufferedReader; |
|
import java.io.ByteArrayInputStream; |
|
import java.io.File; |
|
import java.io.FileReader; |
|
import java.io.IOException; |
|
import java.io.PrintWriter; |
|
import java.io.StringWriter; |
|
import java.net.Authenticator; |
|
import java.net.PasswordAuthentication; |
|
import java.net.Authenticator.RequestorType; |
|
import java.nio.charset.Charset; |
|
import java.util.logging.Logger; |
|
|
|
import javax.xml.soap.MessageFactory; |
|
import javax.xml.soap.MimeHeaders; |
|
import javax.xml.soap.SOAPConnection; |
|
import javax.xml.soap.SOAPConnectionFactory; |
|
import javax.xml.soap.SOAPException; |
|
import javax.xml.soap.SOAPMessage; |
|
import javax.xml.transform.OutputKeys; |
|
import javax.xml.transform.Transformer; |
|
import javax.xml.transform.TransformerConfigurationException; |
|
import javax.xml.transform.TransformerException; |
|
import javax.xml.transform.TransformerFactory; |
|
import javax.xml.transform.TransformerFactoryConfigurationError; |
|
import javax.xml.transform.dom.DOMSource; |
|
import javax.xml.transform.stream.StreamResult; |
|
|
|
import de.memtext.util.DateUtils; |
|
import de.memtext.util.StringUtils; |
|
import de.memtext.util.XMLUtils; |
|
|
|
public class AbstractWebserviceClient { |
|
int pause = 0; |
|
boolean isDeleteTmpXmlFileWanted = true; |
|
|
|
public AbstractWebserviceClient() { |
|
|
|
Authenticator.setDefault(new Authenticator() { |
|
@Override |
|
protected PasswordAuthentication getPasswordAuthentication() { |
|
if (getRequestorType() == RequestorType.PROXY) { |
|
String prot = getRequestingProtocol().toLowerCase(); |
|
String host = System.getProperty(prot + ".proxyHost", ""); |
|
String port = System.getProperty(prot + ".proxyPort", ""); |
|
String user = System.getProperty(prot + ".proxyUser", ""); |
|
String password = System.getProperty(prot |
|
+ ".proxyPassword", ""); |
|
|
|
if (getRequestingHost().toLowerCase().equals( |
|
host.toLowerCase())) { |
|
if (Integer.parseInt(port) == getRequestingPort()) { |
|
// Seems to be OK. |
|
return new PasswordAuthentication(user, password |
|
.toCharArray()); |
|
} |
|
} |
|
} |
|
return null; |
|
} |
|
}); |
|
} |
|
|
|
/** |
|
* macht bei Netzwerkproblemen vier Versuche |
|
* |
|
* @param soapxml |
|
* @param url |
|
* @return |
|
* @throws Exception |
|
*/ |
|
protected StringBuffer readSOAP(String soapxml, String url) |
|
throws Exception { |
|
int attempt = 1; |
|
boolean allDone = false; |
|
StringWriter sw = null; |
|
Exception exception = null; |
|
while (allDone == false && attempt < 4) { |
|
try { |
|
sw = new StringWriter(); |
|
if (pause > 0) { |
|
Thread.sleep(pause * 1000); |
|
// System.out.println("pause "+pause); |
|
} |
|
SOAPConnectionFactory soapConnectionFactory = SOAPConnectionFactory |
|
.newInstance(); |
|
SOAPConnection soapConnection = soapConnectionFactory |
|
.createConnection(); |
|
|
|
SOAPMessage sr = getSoapMessageFromString(soapxml); |
|
sr.getMimeHeaders().addHeader("SOAPAction", |
|
"http://sap.com/xi/WebService/soap1.1"); |
|
|
|
SOAPMessage soapResponse = soapConnection.call(sr, url); |
|
|
|
// soapResponse.writeTo(System.out); |
|
|
|
Transformer transformer = TransformerFactory.newInstance() |
|
.newTransformer(); |
|
// optional indenting |
|
transformer.setOutputProperty(OutputKeys.INDENT, "yes"); |
|
transformer.setOutputProperty( |
|
"{http://xml.apache.org/xslt}indent-amount", "2"); |
|
|
|
// File tmpF = File.createTempFile("soapdata", ".xml"); |
|
transformer.transform( |
|
new DOMSource(soapResponse.getSOAPPart()), |
|
new StreamResult(sw)); |
|
|
|
soapConnection.close(); |
|
System.gc(); |
|
// if (attempt < 3) throw new RuntimeException("RUntime"); |
|
// StringBuffer result=readFile(tmpF); |
|
// if (isDeleteTmpXmlFileWanted) tmpF.delete(); |
|
// else System.out.println(" tmp File "+tmpF); |
|
allDone = true; |
|
} catch (Exception e) { |
|
exception = e; |
|
System.out |
|
.println(DateUtils.getNowString() |
|
+ " Aufruf fehlgeschlagen (s. WebserviceLog) - versuche erneut"); |
|
StringWriter swException = new StringWriter(); |
|
PrintWriter pw = new PrintWriter(swException); |
|
e.printStackTrace(pw); |
|
|
|
Logger.getLogger("wc").severe( |
|
" Problem bei Aufruf von " + url + "\n" + soapxml |
|
+ "\n" + swException.toString()); |
|
attempt++; |
|
|
|
} |
|
} |
|
if (allDone == false) |
|
throw exception; |
|
StringBuffer result = new StringBuffer(sw.toString()); |
|
return result; |
|
} |
|
|
|
protected File createSoapFile(String soapxml, String url) throws Exception { |
|
int attempt = 1; |
|
boolean allDone = false; |
|
|
|
Exception exception = null; |
|
File tmpF = File.createTempFile("soapdata", ".xml"); |
|
while (allDone == false && attempt < 4) { |
|
try { |
|
if (tmpF.exists()) |
|
tmpF.delete(); |
|
|
|
if (pause > 0) { |
|
Thread.sleep(pause * 1000); |
|
// System.out.println("pause "+pause); |
|
} |
|
SOAPConnectionFactory soapConnectionFactory = SOAPConnectionFactory |
|
.newInstance(); |
|
SOAPConnection soapConnection = soapConnectionFactory |
|
.createConnection(); |
|
|
|
SOAPMessage sr = getSoapMessageFromString(soapxml); |
|
sr.getMimeHeaders().addHeader("SOAPAction", |
|
"http://sap.com/xi/WebService/soap1.1"); |
|
|
|
SOAPMessage soapResponse = soapConnection.call(sr, url); |
|
|
|
Transformer transformer = TransformerFactory.newInstance() |
|
.newTransformer(); |
|
// optional indenting |
|
transformer.setOutputProperty(OutputKeys.INDENT, "yes"); |
|
transformer.setOutputProperty( |
|
"{http://xml.apache.org/xslt}indent-amount", "2"); |
|
|
|
transformer.transform( |
|
new DOMSource(soapResponse.getSOAPPart()), |
|
new StreamResult(tmpF)); |
|
|
|
soapConnection.close(); |
|
System.gc(); |
|
// if (attempt<3) throw new RuntimeException("runtime"); |
|
allDone = true; |
|
} catch (Exception e) { |
|
exception = e; |
|
System.out |
|
.println("\n" |
|
+ DateUtils.getNowString() |
|
+ " Aufruf fehlgeschlagen (s. WebserviceLog) - versuche erneut"); |
|
StringWriter swException = new StringWriter(); |
|
PrintWriter pw = new PrintWriter(swException); |
|
e.printStackTrace(pw); |
|
|
|
Logger.getLogger("wc").severe( |
|
" Problem bei Aufruf von " + url + "\n" + soapxml |
|
+ "\n" + swException.toString()); |
|
attempt++; |
|
|
|
} |
|
} |
|
if (allDone == false) |
|
throw exception; |
|
return tmpF; |
|
} |
|
|
|
private SOAPMessage getSoapMessageFromString(String xml) |
|
throws SOAPException, IOException { |
|
MessageFactory factory = MessageFactory.newInstance(); |
|
SOAPMessage message = factory |
|
.createMessage( |
|
new MimeHeaders(), |
|
new ByteArrayInputStream(xml.getBytes(Charset |
|
.forName("UTF-8")))); |
|
return message; |
|
} |
|
|
|
/** |
|
* Entferne unnötige Zeichen und EX_JEST Block |
|
* |
|
* @param data |
|
* @return |
|
*/ |
|
static String purge(String data) { |
|
data = XMLUtils.removeTroublesomeCharacters(data); |
|
|
|
data = data.replaceAll("\u20AC", "EUR"); |
|
|
|
data = data.replaceAll("\u2013", "-");// dash |
|
|
|
data = data.replaceAll("\u2026", "...");// ... |
|
data = data.replace('^', ' '); |
|
data = data.replaceAll("<EX_JEST>(?s).*</EX_JEST>", ""); |
|
data = data.replaceAll("<EX_JEST></EX_JEST>", ""); |
|
data = data.replaceAll("<EX_JEST/>", ""); |
|
return data; |
|
} |
|
|
|
String adaptURL(String url) { |
|
String result = url; |
|
if (System.getProperty("WS_HOST") != null) |
|
result = url.replaceAll("WS_HOST", System.getProperty("WS_HOST")); |
|
return result; |
|
} |
|
|
|
private StringBuffer readFile(File f) throws IOException { |
|
FileReader fr = new FileReader(f); |
|
BufferedReader bfr = new BufferedReader(fr); |
|
String line; |
|
StringBuffer result = new StringBuffer(); |
|
while ((line = bfr.readLine()) != null) { |
|
result.append(line + "\n"); |
|
|
|
} |
|
bfr.close(); |
|
fr.close(); |
|
return result; |
|
} |
|
|
|
} |