SuperX-Kernmodul
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

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();
}
}