/*
* 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 java.util.Date;
import java.util.List;
import java.util.ArrayList;
import hk.hku.cecid.corvus.ws.data.DataFactory;
import hk.hku.cecid.corvus.ws.data.AS2MessageData;
import hk.hku.cecid.corvus.ws.data.AS2PartnershipData;
import hk.hku.cecid.piazza.commons.util.FileLogger;
import hk.hku.cecid.piazza.commons.util.PropertyTree;
/**
* The <code>AS2ReceiverListSender</code> is a client sender sending
* SOAP web services request to B2BCollector <code>AS2</code>
* plugin for query whether if there is any message
* that are available.<br/><br/>
*
* The web service parameters are defined in the below:
* <pre>
* <part name="as2From" type="s:string" />
* <part name="as2To" type="s:string" />
* <part name="numOfMessages" type="s:int" />
* </pre>
*
* @author Twinsen Tsang
* @version 1.0.0
* @since Dwarf 10315
*/
public class AS2ReceiverListSender extends MessageSender {
private final String NS_URI = AS2MessageSender.NS_URI;
/**
* Number of message to retreive for one soap call.
*/
private int numMessageToRetreive = 100;
/**
* The result message id list.
*/
private ArrayList resultMessages = new ArrayList();
/**
* Explicit Constructor.
*
* @param l The logger used for log message and exception.
* @param m The message data for party information and send/recv configuration.
* @param p The partnership data.
*/
public AS2ReceiverListSender(FileLogger l
,AS2MessageData m
,AS2PartnershipData p){
super(l, m, p);
AS2MessageData d = (AS2MessageData) m;
// Setup the sender config.
this.setLoopTimes(1);
this.setServiceEndPoint(d.getRecvlistEndpoint());
}
/**
* Initialize the SOAP Message.
*/
public void onStart(){
super.onStart();
if (this.log != null){
// Log all information for this sender.
this.log.log("AS2 Recevier List Client init at " + new Date().toString());
this.log.log("----------------------------------------------------");
this.log.log("Partnership Data using: ");
this.log.log("----------------------------------------------------");
if (this.ps != null){
this.log.log(this.ps.toString());
}
this.log.log("");
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);
}
}
/**
* Initialize the message using the properties in the MessageProps.
*/
public void initializeMessage() throws Exception {
if (!(this.properties instanceof AS2MessageData))
throw new Exception("Invalid AS2 Message class data");
if (!(this.ps instanceof AS2PartnershipData))
throw new Exception("Invalid AS2 Partnership class data");
AS2MessageData d = (AS2MessageData) this.properties;
AS2PartnershipData ps = (AS2PartnershipData) this.ps;
String numOfMessages = String.valueOf(this.numMessageToRetreive);
this.addRequestElementText("as2From" , ps.getAS2From(), NS_PREFIX, NS_URI);
this.addRequestElementText("as2To" , ps.getAs2To(), NS_PREFIX, NS_URI);
this.addRequestElementText("numOfMessages" , numOfMessages, NS_PREFIX, NS_URI);
}
/**
* [@EVENT] Record all the AS2 message that ready to download.<br/><br/>
*
* Developer should invocate {@link #getAvailableMessages()} to
* get a list of all ready AS2 message.
*/
public void onResponse() throws Exception{
AS2MessageData d = (AS2MessageData) this.properties;
String [] messageIds = this.getResponseElementAsList("messageId", NS_URI);
this.log.log("Available Message(s): ");
this.log.log("----------------------------------------------------");
for(int i = messageIds.length -1; i >= 0; i--){
this.resultMessages.add(messageIds[i]);
if (this.log != null)
this.log.log("Message Id: " + messageIds[i]);
}
}
/**
* Set number of message to retrieve for one soap call.
*
* @param numMsgs number of message to retrieve for one soap call.
*/
public void setNumOfMessageToRetrieve(int numMsgs){
this.numMessageToRetreive = numMsgs;
this.setRequestDirty(true);
}
/**
* @return number of message to retrieve for one soap call.
*/
public int getNumOfMessageToRetrieve(){
return this.numMessageToRetreive;
}
/**
* This method should be called after the event {@link #onResponse()}
*
* @return a list of message id that are ready to download.
*/
public List getAvailableMessages(){
return this.resultMessages;
}
/**
* The main method is for CLI mode.
*/
public static void main(String [] args){
try{
if (args.length < 3){
System.out.println("Usage: as2-recvlist [partnership-xml] [config-xml] [log-path]");
System.out.println();
System.out.println("Example: as2-recvlist " +
"./config/as2-partnership.xml " +
"./config/as2-recvlist/as2-request.xml " +
"./logs/as2-recvlist.log ");
System.exit(1);
}
System.out.println("----------------------------------------------------");
System.out.println(" AS2 Receiver List Queryer ");
System.out.println("----------------------------------------------------");
// Initialize the logger.
System.out.println("Initialize Logger ... ");
FileLogger logger = new FileLogger(new java.io.File(args[2]));
// Initialize the query parameter.
System.out.println("Importing AS2 sending parameters ... " + args[1] );
AS2MessageData emd =
DataFactory.getInstance()
.createAS2MessageDataFromXML(
new PropertyTree(
new java.io.File(args[1]).toURI().toURL()));
// Grab the partnership data from the XML file.
System.out.println("Importing AS2 partnership parameters ... " + args[0] );
AS2PartnershipData ps =
DataFactory.getInstance()
.createAS2PartnershipFromXML(
new PropertyTree(
new java.io.File(args[0]).toURI().toURL()));
// Initialize the sender.
System.out.println("Initialize AS2 receiver list queryer... ");
AS2ReceiverListSender sender = new AS2ReceiverListSender(logger, emd, ps);
// Send the message.
System.out.println("Sending AS2 receiving list request ... ");
sender.run();
// Get the receiver list.
List l = sender.getAvailableMessages();
System.out.println();
System.out.println(" Sending Done: ");
System.out.println("----------------------------------------------------");
System.out.println(" AS2 Message that can be download ");
System.out.println("----------------------------------------------------");
if (l.size() == 0){
System.out.println("No message found ..");
} else{
for (int i = 0; i < l.size(); i++)
System.out.println(i + " Message id : " + l.get(i));
}
System.out.println("----------------------------------------------------");
System.out.println();
System.out.println("Please view log for details .. ");
}catch(Exception e){
e.printStackTrace(System.err);
}
}
}