package de.superx.bin; import java.io.BufferedWriter; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.PrintWriter; import java.util.Calendar; import java.util.logging.Level; import javax.xml.stream.XMLInputFactory; import javax.xml.stream.XMLStreamConstants; import javax.xml.stream.XMLStreamException; import javax.xml.stream.XMLStreamReader; import org.w3c.dom.Document; import org.w3c.dom.Node; import org.xml.sax.SAXException; import de.memtext.util.DateUtils; import de.memtext.util.GetOpts; import de.memtext.util.GetOpts.Options; import de.memtext.util.LogUtils; import de.memtext.util.StringUtils; import de.memtext.util.XMLUtils; public class WebserviceClientBseg extends AbstractWebserviceClient { private Document configDocument; private XMLInputFactory factory = XMLInputFactory.newInstance(); private String xmlConfig; private String url; private String soap; private String outfilename; private File tmpFile; private File outFileBSEG; private File outFileBKPF; private String jahr; private String hsnr; private int jahrint; private PrintWriter fwBSEG; private PrintWriter fwBKPF; private BufferedWriter bfwBSEG; private BufferedWriter bfwBKPF; private Calendar cal = Calendar.getInstance(); private Calendar targetCal = Calendar.getInstance(); private StringBuilder bseg = new StringBuilder(); private StringBuilder bkpf = new StringBuilder(); public static void main(String[] args) { System.out.println("SuperX-WebserviceClientBseg Version 1.1"); WebserviceClientBseg tc = new WebserviceClientBseg(); tc.run(args); } public void run(String[] args) { try { initLogging(); GetOpts.setOpts((String[]) args); String isdrin = GetOpts.isAllRequiredOptionsPresent(new Options[] {Options.opt_xmlconfig, Options.opt_jahr, Options.opt_hsnr, Options.opt_out}); if (isdrin != null) { System.err.println("Folgende Optionen fehlen: " + isdrin); System.exit(1); } readConfig(); perform(); String msg = " fertig: " + DateUtils.getTodayString() + " " + DateUtils.getNowString(); logger.info(msg); System.out.println(msg); } catch (Exception e) { logger.severe(e.getMessage()); System.out.println("Error " + e.getMessage()); e.printStackTrace(); LogUtils.close((String) "wc"); System.exit(1); } finally { LogUtils.close((String) "wc"); } } private void perform() throws Exception { Node n = XMLUtils.getFirstNode((Document) configDocument, (String) "url"); url = XMLUtils.getTheValue((Node) n); url = adaptURL(url); logger.log(Level.INFO, "URL " + url); System.out.println("URL " + url); n = XMLUtils.getFirstNode((Document) configDocument, (String) "soap"); soap = XMLUtils.getTheValue((Node) n); soap = soap.replace("XXHSNRXX", hsnr); soap = soap.replace("XXJAHRXX", jahr); System.out.println(soap); initOutFiles(); int i = 0; int jahrint = Integer.parseInt(jahr); while (cal.get(1) == jahrint && cal.before(targetCal)) { i++; String msg = "starte Aufruf " + i+ " (" + getDateString() + ") "; String tmpsoap = getTmpSoap(); logger.fine("SOAP Aufruf:\n" + tmpsoap); System.out.print(msg); tmpFile = createSoapFile(tmpsoap, url); msg = " - empfangen "; if (!isDeleteTmpXmlFileWanted) { msg = msg + " (" + tmpFile + ")"; } msg = msg + " " + DateUtils.getNowString(); System.out.println(msg); if (isReplyOk(tmpFile)) { readData(); if (bseg.length() > 0) { bfwBSEG.write(bseg.toString()); bfwBSEG.flush(); } if (bkpf.length() > 0) { bfwBKPF.write(bkpf.toString()); bfwBKPF.flush(); } if (isDeleteTmpXmlFileWanted) tmpFile.delete(); } else { msg = "Error: Aufruf von Webservice fuer Beseg (" + xmlConfig + ") fehlgeschlagen"; System.out.println(msg); System.out.println(StringUtils.readFile((File) tmpFile)); logger.severe(msg); LogUtils.close((String) "wc"); System.exit(-1); } } closeFile(); } private String getDateString() { int month = cal.get(2) + 1; String monthstr = "" + month + ""; if (month < 10) { monthstr = "0" + month; } int day = cal.get(5); String daystring = "" + day + ""; if (day < 10) { daystring = "0" + day; } String result = "" + cal.get(1) + "-" + monthstr + "-" + daystring; return result; } private String getTmpSoap() { String tempsoap = soap; String start = getDateString(); String end = getDateString(); if (cal.get(1) != jahrint) { end = jahr + "-12-31"; } tempsoap = tempsoap.replaceAll("XXSTARTXX", start); tempsoap = tempsoap.replaceAll("XXENDEXX", end); cal.add(6, 1); return tempsoap; } private void readConfig() throws IOException, SAXException { xmlConfig = GetOpts.getValue(Options.opt_xmlconfig); hsnr = GetOpts.getValue(Options.opt_hsnr); outfilename = GetOpts.getValue(Options.opt_out); jahr = GetOpts.getValue(Options.opt_jahr); jahrint = Integer.parseInt(jahr); cal.set(jahrint, 0, 1); System.out.println("\n" + DateUtils.getTodayString() + " " + DateUtils.getNowString()); if (GetOpts.isPresent(Options.opt_noDelete)) { isDeleteTmpXmlFileWanted = false; } logger.log(Level.INFO, "Geschaeftsjahr " + jahr); System.out.println("Geschaeftsjahr " + jahr); logger.log(Level.INFO, "HSNR " + hsnr); System.out.println("HSNR " + hsnr); logger.log(Level.INFO, "Verarbeite " + xmlConfig); System.out.println("Verarbeite " + xmlConfig); configDocument = XMLUtils.buildDocument((File) new File(xmlConfig)); } private void initOutFiles() throws Exception { outFileBSEG = new File(outfilename); if (outFileBSEG.exists()) { outFileBSEG.delete(); } outFileBKPF = new File(StringUtils.replace((String) outfilename, (String) ".", (String) "_bkpf.")); fwBSEG = new PrintWriter(outFileBSEG); fwBKPF = new PrintWriter(outFileBKPF); bfwBSEG = new BufferedWriter(fwBSEG); bfwBKPF = new BufferedWriter(fwBKPF); } private void closeFile() throws Exception { bfwBSEG.close(); fwBSEG.close(); bfwBKPF.close(); fwBKPF.close(); if (isDeleteTmpXmlFileWanted && tmpFile.exists()) { tmpFile.delete(); } } private void readData() throws XMLStreamException, IOException { FileInputStream in = new FileInputStream(tmpFile); XMLStreamReader parser = factory.createXMLStreamReader(in); bseg.setLength(0); bkpf.setLength(0); boolean getDataBSEG = false; boolean getDataBKPF = false; boolean isBSEG = false; boolean isBKPF = false; String name; while (parser.hasNext()) { switch (parser.getEventType()) { case XMLStreamConstants.START_ELEMENT: { name = parser.getLocalName(); if (name.equals("EX_BSEG")) { isBSEG = true; } if (isBSEG && isRelevantNodeNameBSEG(name)) { getDataBSEG = true; } if (name.equals("EX_BKPF")) { isBKPF = true; } if (!isBKPF || !isRelevantNodeNameBKPF(name)) break; getDataBKPF = true; break; } case XMLStreamConstants.CHARACTERS: { if (isBSEG && getDataBSEG && !parser.isWhiteSpace()) { bseg.append(WebserviceClientBseg.purge((String) parser.getText(), true)); } if (!isBKPF || !getDataBKPF || parser.isWhiteSpace()) break; bkpf.append(WebserviceClientBseg.purge((String) parser.getText(), true)); break; } case XMLStreamConstants.END_ELEMENT: { name = parser.getLocalName(); if (name.equals("EX_BSEG")) { isBSEG = false; } if (isBSEG && getDataBSEG && isRelevantNodeNameBSEG(name)) { getDataBSEG = false; bseg.append("^"); } if (name.equals("EX_BKPF")) { isBKPF = false; } if (isBKPF && getDataBKPF && isRelevantNodeNameBKPF(name)) { getDataBKPF = false; bkpf.append("^"); } if (isBSEG && name.equals("item")) { bseg.append("\n"); } if (!isBKPF || !name.equals("item")) break; bkpf.append("\n"); break; } case XMLStreamConstants.END_DOCUMENT: { parser.close(); } } parser.next(); } in.close(); } private boolean isRelevantNodeNameBSEG(String name) { return name.equals("GJAHR") || name.equals("BELNR") || name.equals("BUZEI") || name.equals("ZUONR") || name.equals("ANLN1"); } private boolean isRelevantNodeNameBKPF(String name) { return name.equals("GJAHR") || name.equals("BELNR") || name.equals("XBLNR"); } }