/* * Copyright(c) 2005 Center for E-Commerce Infrastructure Development, The * University of Hong Kong (HKU). All Rights Reserved. * * This software is licensed under the GNU GENERAL PUBLIC LICENSE Version 2.0 [1] * * [1] http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt */ package hk.hku.cecid.corvus.ws; import hk.hku.cecid.corvus.ws.data.AS2MessageData; import hk.hku.cecid.corvus.ws.data.AS2MessageHistoryRequestData; import hk.hku.cecid.corvus.ws.data.AS2StatusQueryData; import hk.hku.cecid.corvus.ws.data.AS2StatusQueryResponseData; import hk.hku.cecid.corvus.ws.data.DataFactory; import hk.hku.cecid.piazza.commons.soap.SOAPSender; import hk.hku.cecid.piazza.commons.util.FileLogger; import hk.hku.cecid.piazza.commons.util.PropertyTree; import hk.hku.cecid.piazza.commons.util.SOAPUtilities; import java.io.BufferedReader; import java.io.File; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.Date; import java.util.Iterator; import java.util.List; import javax.xml.soap.SOAPElement; import javax.xml.soap.SOAPException; public class AS2MessageHistoryQuerySender extends SOAPSender{ public static String NAMESPACE = "http://service.as2.edi.cecid.hku.hk/"; private ArrayList resultMessages = new ArrayList(); public AS2MessageHistoryQuerySender(FileLogger l,AS2MessageHistoryRequestData m) { super(l, m); AS2MessageHistoryRequestData d = (AS2MessageHistoryRequestData) m; // Setup the sender config. // this.setLoopTimes(1); this.setServiceEndPoint(d.getEndPoint()); } public void onStart(){ super.onStart(); if (this.log != null){ // Log all information for this sender. this.log.log("AS2 Message History Query init at " + new Date().toString()); this.log.log("----------------------------------------------------"); this.log.log("Configuration Data using: "); this.log.log("----------------------------------------------------"); if (this.properties != null){ this.log.log(this.properties.toString()); } this.log.log("----------------------------------------------------"); } try{ this.initializeMessage(); this.setRequestDirty(false); }catch(Exception e){ if (this.log != null) this.log.log("Unable to initialize the SOAP Message"); this.onError(e); } } public void onResponse() throws Exception{ List msgList = this.getResponseElementList("messageList", NAMESPACE, 0); this.log.log("Available Message(s): "); this.log.log("----------------------------------------------------"); if(msgList == null) return; Iterator msgIterator = msgList.iterator(); while(msgIterator.hasNext()){ List msgElement = (List)msgIterator.next(); this.resultMessages.add(msgElement); if (this.log != null) this.log.log("Message Id: " + (String)msgElement.get(0) + " MessageBox: " + (String)msgElement.get(1)); } for(int i =0; i < this.resultMessages.size(); i ++){ int swapIndex = this.resultMessages.size()-1-i; if((swapIndex) == i || ((swapIndex-1) != i &&(swapIndex+1) == i)) break; List temp = (List) this.resultMessages.get(swapIndex); // Get the last index to temp this.resultMessages.set(swapIndex, this.resultMessages.get(i)); this.resultMessages.set(i, temp); } } public void initializeMessage() throws Exception{ if (!(this.properties instanceof AS2MessageHistoryRequestData)) throw new Exception("Invalid AS2 Quest Request class data"); if (this.properties == null) throw new Exception("Invalid AS2 Quest Request: Object null"); AS2MessageHistoryRequestData requestData = (AS2MessageHistoryRequestData) this.properties; this.addRequestElementText(AS2MessageHistoryRequestData.PARAM_KEY_SET[0] , requestData.getMessageBox(), NS_PREFIX, NAMESPACE); this.addRequestElementText(AS2MessageHistoryRequestData.PARAM_KEY_SET[1] , requestData.getStatus(), NS_PREFIX, NAMESPACE); this.addRequestElementText(AS2MessageHistoryRequestData.PARAM_AS2_KEY_SET[0] , requestData.getMessageId(),NS_PREFIX, NAMESPACE); this.addRequestElementText(AS2MessageHistoryRequestData.PARAM_AS2_KEY_SET[1] , requestData.getAS2FromParty(), NS_PREFIX, NAMESPACE); this.addRequestElementText(AS2MessageHistoryRequestData.PARAM_AS2_KEY_SET[2] , requestData.getAS2ToParty(), NS_PREFIX, NAMESPACE); } public List getResponseElementList(String tagname ,String nsURI ,int whichOne) throws SOAPException{ SOAPElement msgList = SOAPUtilities.getElement(this.response, tagname, nsURI, whichOne); List resultList = new ArrayList(); if (msgList != null){ try{ Iterator msgIterator = msgList.getChildElements(); while(msgIterator.hasNext()){ List elementList = new ArrayList(); SOAPElement messageElement = (SOAPElement)msgIterator.next(); Iterator elements = messageElement.getChildElements(); // MessageId SOAPElement msgId = (SOAPElement)(elements.next()); elementList.add(msgId.getValue()); // MessageBox SOAPElement msgBox = (SOAPElement)(elements.next()); elementList.add(msgBox.getValue()); resultList.add(elementList); } return resultList; }catch(NullPointerException nullExp){ throw new SOAPException("A NULL value was found in response.\n"+nullExp.getMessage(), nullExp); } } return null; } public List getAvailableMessages(){ return this.resultMessages; } /** * The main method is for CLI mode. */ public static void main(String [] args){ try{ if (args.length < 2){ System.out.println("Usage: as2-history [config-xml] [log-path]"); System.out.println(); System.out.println("Example: as2-history " + "./config/as2-config/as2-request.xml " + "./logs/as2-config.log "); System.exit(1); } System.out.println("----------------------------------------------------"); System.out.println(" AS2 Message History Web Service Client "); System.out.println("----------------------------------------------------"); // Initialize the logger. System.out.println("Initialize Logger ... "); FileLogger logger = new FileLogger(new java.io.File(args[1])); // Initialize the query parameter. System.out.println("Importing AS2 config parameters ... " + args[0]); AS2MessageHistoryRequestData requestData = DataFactory.getInstance() .createAs2MessageHistoryQueryDataFromXML(new PropertyTree(new java.io.File(args[0]).toURI().toURL())); // Initialize the sender. System.out.println("Initialize AS2 messsage history queryer ... "); AS2MessageHistoryQuerySender sender = new AS2MessageHistoryQuerySender(logger, requestData); // Send the message. System.out.println("Sending AS2 message history query request ... "); sender.run(); // Get the receiver list. List msgList = sender.getAvailableMessages(); System.out.println(); System.out.println(" Sending Done: "); System.out.println("----------------------------------------------------"); System.out.println(" AS2 Message that are matched "); System.out.println("----------------------------------------------------"); if (msgList.size() == 0){ System.out.println("No message found .."); } else{ System.out.println("No. of message: " + msgList.size()); int msgIdx = -1; // Ask the user to choose which message to download. BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); boolean askSelection = true; while (askSelection) { for (int i = 0; i < msgList.size(); i++){ String messageId = (String)((List)msgList.get(i)).get(0); String messageBox = (String)((List)msgList.get(i)).get(1); System.out.println(i + "\t| Message id : " + messageId +" MessageBox: " + messageBox); } System.out.println("----------------------------------------------------"); System.out.println(""); System.out.print("Select message (0 - " + (msgList.size()-1) + "), -1 to exit: "); try{ msgIdx = Integer.parseInt(br.readLine()); if (msgIdx < -1) { System.out.println("Input must be greater than or equal to -1"); } else if (msgIdx >= msgList.size()) { System.out.println("Input must be less than " + msgList.size()); } else { askSelection = false; } }catch(Exception e){ System.out.println("Invalid Input. It must be number"); } } if (msgIdx == -1){ System.out.println("System exits ..."); System.exit(0); } String messageId = (String)((List)msgList.get(msgIdx)).get(0); String messageBox = (String)((List)msgList.get(msgIdx)).get(1); /** * */ if(messageBox.equalsIgnoreCase("inbox")){ AS2MessageData msgData = new AS2MessageData(); String host = requestData.getEndPoint().substring(0, requestData.getEndPoint().indexOf("/corvus")); host += "/corvus/httpd/as2/receiver"; msgData.setRecvEndpoint(host); msgData.setMessageIdForReceive(messageId); //Ask for output folder File outDir = null; do{ File currentDir = new File(""); System.out.println("Currrent Dir: " + currentDir.getAbsolutePath()); System.out.print("Please provide the folder to store the payload(s): "); outDir = new File( br.readLine().trim()); if(outDir.exists() && !outDir.isDirectory()){ System.out.println("That is not a valid directory"); outDir = null; continue; } }while(outDir == null); AS2MessageReceiver msgReceiver = new AS2MessageReceiver(logger, msgData); msgReceiver.setOutputDirectory(outDir.getAbsolutePath()); msgReceiver.run(); }else if(messageBox.equalsIgnoreCase("outbox")){ AS2StatusQueryData statusQuery = new AS2StatusQueryData(); String host = requestData.getEndPoint().substring(0, requestData.getEndPoint().indexOf("/corvus")); host += "/corvus/httpd/as2/status"; statusQuery.setSendEndpoint(host); statusQuery.setQueryMessageId(messageId); AS2StatusQuerySender statusQueryer = new AS2StatusQuerySender(logger, statusQuery); statusQueryer.run(); AS2StatusQueryResponseData response = statusQueryer.getLastResponseData(); System.out.println("Query Message ID : " + response.getMessageId()); System.out.println("Query Message Status : " + response.getStatus()); System.out.println("Query Message Status Desc : " + response.getStatusDescription()); System.out.println("ACK Message ID : " + response.getACKMessageId()); System.out.println("ACK Message Status : " + response.getACKStatus()); System.out.println("ACK Message Status Desc : " + response.getACKStatusDescription()); } } System.out.println("----------------------------------------------------"); System.out.println(); System.out.println("Please view log for details .. "); }catch(Exception e){ e.printStackTrace(System.err); } } }