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.
409 lines
12 KiB
409 lines
12 KiB
package de.superx.bin; |
|
|
|
import java.io.BufferedWriter; |
|
import java.io.ByteArrayInputStream; |
|
import java.io.File; |
|
import java.io.FileInputStream; |
|
import java.io.IOException; |
|
import java.io.InputStream; |
|
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.Calendar; |
|
import java.util.GregorianCalendar; |
|
import java.util.logging.Level; |
|
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.stream.XMLInputFactory; |
|
import javax.xml.stream.XMLStreamConstants; |
|
import javax.xml.stream.XMLStreamException; |
|
import javax.xml.stream.XMLStreamReader; |
|
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 org.w3c.dom.Document; |
|
import org.w3c.dom.Node; |
|
|
|
import de.memtext.util.DateUtils; |
|
import de.memtext.util.GetOpts; |
|
import de.memtext.util.LogUtils; |
|
import de.memtext.util.StringUtils; |
|
import de.memtext.util.XMLUtils; |
|
|
|
public class WebserviceClientBewegungsdaten extends AbstractWebserviceClient { |
|
|
|
private Document configDocument; |
|
private XMLInputFactory factory = XMLInputFactory.newInstance(); |
|
|
|
private String hsnr; |
|
|
|
private String xmlConfig, datentyp; |
|
private String url; |
|
|
|
private String soap; |
|
|
|
private String outfilename; |
|
private boolean columnNamesWritten = false, columnNamesHdWritten = false; |
|
private File tmpFile, outFile, outFileHd; |
|
private String jahr; |
|
private PrintWriter fw, fwhd; |
|
private BufferedWriter bfw, bfwhd; |
|
private static final Logger log = Logger.getLogger("wc"); |
|
|
|
public static void main(String args[]) { |
|
System.out |
|
.println("SuperX-WebserviceClientBewegungsdaten Version 0.9.3"); |
|
WebserviceClientBewegungsdaten tc = new WebserviceClientBewegungsdaten(); |
|
tc.run(args); |
|
|
|
} |
|
|
|
public WebserviceClientBewegungsdaten() { |
|
|
|
} |
|
|
|
public void run(String args[]) { |
|
try { |
|
|
|
XMLUtils.getExceptionHandler().setWithGui(false); |
|
XMLUtils.getExceptionHandler().setExitWanted(true); |
|
// LogUtils.initRaw(log); |
|
LogUtils.initRawFileDateTime("wc", "WebserviceClient.log", 100000, |
|
1, true, false); |
|
|
|
log.setLevel(Level.FINEST); |
|
log.getHandlers()[0].setLevel(Level.FINEST); |
|
GetOpts.setOpts(args); |
|
String isdrin = GetOpts |
|
.isAllRequiredOptionsPresent("-xmlconfig,-hsnr,-jahr,-out,-datentyp"); |
|
if (isdrin != null) { |
|
System.err.println("Folgende Optionen fehlen: " + isdrin); |
|
// System.err.println(usage); |
|
System.exit(1); |
|
} |
|
readConfig(); |
|
|
|
perform(); |
|
|
|
String msg = " fertig: " + DateUtils.getTodayString() + " " |
|
+ DateUtils.getNowString(); |
|
log.info(msg); |
|
System.out.println(msg); |
|
} catch (Exception e) { |
|
log.severe(e.getMessage()); |
|
System.out.println("Error " + e.getMessage()); |
|
e.printStackTrace(); |
|
LogUtils.close("wc"); |
|
System.exit(1); |
|
} finally { |
|
LogUtils.close("wc"); |
|
|
|
} |
|
} |
|
|
|
private void perform() throws Exception { |
|
|
|
Node n = XMLUtils.getFirstNode(configDocument, datentyp + "detailurl"); |
|
url = XMLUtils.getTheValue(n); |
|
url = adaptURL(url); |
|
n = XMLUtils.getFirstNode(configDocument, datentyp + "detailsoap"); |
|
soap = XMLUtils.getTheValue(n); |
|
soap = soap.replace("XXHSNRXX", hsnr); |
|
soap = soap.replace("XXJAHRXX", jahr); |
|
System.out.println(datentyp + "\n12x " + soap); |
|
//n = XMLUtils.getFirstNode(configDocument, datentyp + "detailreplacenode"); |
|
|
|
initOutFile(); |
|
//Laut Herrn Schweitzer (SAP) keine Daten für Vorjahr und Folgejahr abrufen |
|
// monat 0 ist Vorjahr, Monat 13 ist Folgejahr |
|
for (int monat = 1; monat <= 12; monat++) { |
|
|
|
String monatssoap = getMonatsoap(monat); |
|
log.fine(datentyp + "\nSOAP Aufruf:\n" + monatssoap); |
|
String msg = "starte Aufruf " + (monat ); |
|
|
|
System.out.print(msg); |
|
tmpFile = createSoapFile(monatssoap, url); |
|
msg =" - empfangen "; |
|
if (!isDeleteTmpXmlFileWanted) |
|
msg += " (" + tmpFile+")"; |
|
msg+=" "+DateUtils.getNowString(); |
|
System.out.println(msg); |
|
|
|
String nodeName = "EX_" + datentyp.toUpperCase(); |
|
|
|
if (isReplyOk()) { |
|
String columnNames = getColumnNames(nodeName).toString(); |
|
if (!columnNamesWritten && !columnNames.equals("")) { |
|
bfw.write(columnNames); |
|
columnNamesWritten = true; |
|
} |
|
String data = getData(nodeName).toString(); |
|
if (!data.equals("")) |
|
bfw.write(data); |
|
bfw.flush(); |
|
|
|
// Header |
|
if (datentyp.equals("fmifiit")) { |
|
columnNames = getColumnNames("EX_FMIFIHD").toString(); |
|
if (!columnNamesHdWritten && !columnNames.equals("")) { |
|
bfwhd.write(columnNames); |
|
columnNamesHdWritten = true; |
|
} |
|
data = getData("EX_FMIFIHD").toString(); |
|
if (!data.equals("")) |
|
bfwhd.write(data); |
|
bfwhd.flush(); |
|
} |
|
if (isDeleteTmpXmlFileWanted) |
|
tmpFile.delete(); |
|
|
|
} else { |
|
msg = "Error: Aufruf von Webservice für Bewegungsdaten " |
|
+ datentyp + " (" + xmlConfig + ") fehlgeschlagen"; |
|
System.out.println(msg); |
|
System.out.println(StringUtils.readFile(tmpFile)); |
|
log.severe(msg); |
|
LogUtils.close("wc"); |
|
System.exit(-1); |
|
} |
|
|
|
} |
|
closeFile(); |
|
} |
|
|
|
private String getMonatsoap(int monat) { |
|
String tempsoap = soap; |
|
if (monat == 0) { |
|
int vorjahr = Integer.parseInt(jahr); |
|
vorjahr--; |
|
tempsoap = tempsoap.replaceAll("XXSTARTXX", vorjahr + "-01-01"); |
|
tempsoap = tempsoap.replaceAll("XXENDEXX", vorjahr + "-12-31"); |
|
} |
|
|
|
if (monat >= 1 && monat <= 12) { |
|
int jahrint = Integer.parseInt(jahr); |
|
GregorianCalendar cal = new GregorianCalendar(jahrint,monat-1, 1); |
|
String monatstr; |
|
if (monat < 10) |
|
monatstr = "0" + monat; |
|
else |
|
monatstr = monat + ""; |
|
tempsoap = tempsoap.replaceAll("XXSTARTXX", jahr + "-" + monatstr |
|
+ "-01"); |
|
int maxDay = cal.getActualMaximum(Calendar.DAY_OF_MONTH); |
|
// System.out.println(maxDay); |
|
tempsoap = tempsoap.replaceAll("XXENDEXX", jahr + "-" + monatstr |
|
+ "-" + maxDay); |
|
} |
|
|
|
if (monat == 13) { |
|
int folgejahr = Integer.parseInt(jahr); |
|
folgejahr++; |
|
tempsoap = tempsoap.replaceAll("XXSTARTXX", folgejahr + "-01-01"); |
|
tempsoap = tempsoap.replaceAll("XXENDEXX", folgejahr + "-12-31"); |
|
} |
|
return tempsoap; |
|
} |
|
|
|
private void readConfig() { |
|
|
|
xmlConfig = GetOpts.getValue("-xmlconfig"); |
|
outfilename = GetOpts.getValue("-out"); |
|
|
|
hsnr = GetOpts.getValue("-hsnr"); |
|
jahr = GetOpts.getValue("-jahr"); |
|
datentyp = GetOpts.getValue("-datentyp"); |
|
System.out.println("\n" + DateUtils.getTodayString() + " " |
|
+ DateUtils.getNowString() + "\nHochschulnummer " + hsnr); |
|
log.info("\nHochschulnummer " + hsnr); |
|
if (GetOpts.isPresent("-nodelete")) |
|
isDeleteTmpXmlFileWanted = false; |
|
log.log(Level.INFO, "Geschaeftsjahr " + jahr); |
|
System.out.println("Geschaeftsjahr " + jahr); |
|
|
|
log.log(Level.INFO, "Verarbeite " + xmlConfig); |
|
System.out.println("Verarbeite " + xmlConfig); |
|
configDocument = XMLUtils.buildDocument(new File(xmlConfig)); |
|
|
|
} |
|
|
|
private void initOutFile() throws Exception { |
|
outFile = new File(outfilename); |
|
if (outFile.exists()) |
|
outFile.delete(); |
|
// FileWriter fw = new FileWriter(f); |
|
fw = new PrintWriter(outFile); |
|
// FileOutputStream fos = new FileOutputStream(f, false); |
|
// BufferedWriter bfw = new BufferedWriter(new OutputStreamWriter(fos)); |
|
|
|
bfw = new BufferedWriter(fw); |
|
|
|
if (datentyp.equals("fmifiit")) { |
|
|
|
String hdfilename = StringUtils.replace(outfilename, ".", "hd."); |
|
outFileHd = new File(hdfilename); |
|
String msg = "Erzeuge zusaetzliche Header_Datei " + hdfilename; |
|
log.log(Level.INFO, msg); |
|
System.out.println(msg); |
|
fwhd = new PrintWriter(outFileHd); |
|
bfwhd = new BufferedWriter(fwhd); |
|
} |
|
|
|
} |
|
|
|
private void closeFile() throws Exception { |
|
|
|
bfw.close(); |
|
fw.close(); |
|
|
|
if (datentyp.equals("fmifiit")) { |
|
bfwhd.close(); |
|
fwhd.close(); |
|
} |
|
|
|
if (isDeleteTmpXmlFileWanted) |
|
if (tmpFile.exists()) tmpFile.delete(); |
|
} |
|
|
|
private boolean isReplyOk() throws XMLStreamException, IOException { |
|
InputStream in = new FileInputStream(tmpFile); |
|
XMLStreamReader parser = factory.createXMLStreamReader(in); |
|
boolean checkReturn = false; |
|
String result = ""; |
|
while (parser.hasNext()) { |
|
switch (parser.getEventType()) { |
|
case XMLStreamConstants.START_ELEMENT: |
|
if (parser.getLocalName().equals("RETURN")) { |
|
checkReturn = true; |
|
|
|
} |
|
break; |
|
|
|
case XMLStreamConstants.CHARACTERS: |
|
if (checkReturn && !parser.isWhiteSpace()) { |
|
result = parser.getText(); |
|
checkReturn = false; |
|
} |
|
break; |
|
case XMLStreamConstants.END_DOCUMENT: |
|
|
|
parser.close(); |
|
break; |
|
|
|
} |
|
|
|
parser.next(); |
|
|
|
} |
|
in.close(); |
|
return result.equals("I"); |
|
} |
|
|
|
private StringBuilder getData(String topnode) throws XMLStreamException, |
|
IOException { |
|
InputStream in = new FileInputStream(tmpFile); |
|
XMLStreamReader parser = factory.createXMLStreamReader(in); |
|
final String datumspattern = "(\\d\\d\\d\\d)-(\\d\\d)-(\\d\\d)"; |
|
|
|
StringBuilder result = new StringBuilder(); |
|
boolean getData = false; |
|
while (parser.hasNext()) { |
|
|
|
switch (parser.getEventType()) { |
|
case XMLStreamConstants.START_ELEMENT: |
|
String name = parser.getLocalName(); |
|
if (name.equals(topnode)) |
|
getData = true; |
|
// Spaltennamen zu Debugzwecken anzeigen |
|
// else if (getData && !name.equals("item")) |
|
// result.append(prefix + "_" + parser.getLocalName()); |
|
break; |
|
case XMLStreamConstants.CHARACTERS: |
|
if (getData && !parser.isWhiteSpace()) { |
|
String data = parser.getText(); |
|
|
|
if (data.matches(datumspattern)) |
|
data = data.replaceAll(datumspattern, "$3.$2.$1"); |
|
else |
|
data = purge(data); |
|
|
|
result.append(data); |
|
} |
|
break; |
|
case XMLStreamConstants.END_ELEMENT: |
|
if (parser.getLocalName().equals(topnode)) |
|
getData = false; |
|
else if (getData && parser.getLocalName().equals("item")) |
|
result.append("\n"); |
|
else if (getData) { |
|
result.append("^"); |
|
} |
|
break; |
|
|
|
case XMLStreamConstants.END_DOCUMENT: |
|
parser.close(); |
|
break; |
|
} |
|
parser.next(); |
|
} |
|
in.close(); |
|
// abschließendes ^ entfernen |
|
//if (result.length() > 0) result.setLength(result.length() - 1); |
|
return result; |
|
|
|
} |
|
|
|
private String getColumnNames(String topnode) |
|
throws XMLStreamException, IOException { |
|
InputStream in = new FileInputStream(tmpFile); |
|
XMLStreamReader parser = factory.createXMLStreamReader(in); |
|
|
|
String prefix = topnode.replaceAll("EX_", ""); |
|
StringBuilder result = new StringBuilder(); |
|
boolean getNames = false; |
|
while (parser.hasNext()) { |
|
|
|
switch (parser.getEventType()) { |
|
case XMLStreamConstants.START_ELEMENT: |
|
String name = parser.getLocalName(); |
|
if (parser.getLocalName().equals(topnode)) |
|
getNames = true; |
|
else if (getNames && !name.equals("item")) |
|
result.append(prefix + "_" + parser.getLocalName() + "^"); |
|
break; |
|
case XMLStreamConstants.END_ELEMENT: |
|
if (parser.getLocalName().equals(topnode)||parser.getLocalName().equals("item")) |
|
getNames = false; |
|
break; |
|
|
|
case XMLStreamConstants.END_DOCUMENT: |
|
parser.close(); |
|
break; |
|
} |
|
parser.next(); |
|
} |
|
in.close(); |
|
// abschließendes ^ entfernen |
|
if (result.length() > 0) |
|
result.setLength(result.length() - 1); |
|
if (result.length() > 0) |
|
result.append("\n"); |
|
return result.toString().toLowerCase(); |
|
} |
|
} |