/* * 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.http; import java.util.HashMap; import java.util.Map; import hk.hku.cecid.piazza.commons.util.FileLogger; import hk.hku.cecid.piazza.commons.util.PropertyTree; import hk.hku.cecid.corvus.ws.data.AS2PartnershipData; import hk.hku.cecid.corvus.ws.data.AS2AdminData; import hk.hku.cecid.corvus.ws.data.DataFactory; /** * The <code>AS2PartnershipSender</code> is a client service sender using HTTP protocol * for maintaining the set of AS2 Partnership in Hermes 2 Messaging Gateway. * <br/><br/> * To use it you have to provide the configuration instance called <code>AS2AdminData</code>. * it defines the URL end-point and credential for connecting to your Hermes 2 Restricted area. * <br/><br/> * An Example for adding partnership : * <pre> * // Create an administrative data for configuration. * AS2AdminData adminData = new AS2AdminData(); * adminData.setManagePartnershipEndpoint("Your H2O location"); * adminData.setUsername("Your username for logging H2O"); * adminData.setPassword("Your password for logging H2O"); * // Create a partnership data for doing maintenance operation. * AS2PartnershipData pData = new AS2PartnershipData(); * . * . * . * AS2PartnershipSender sender = new AS2PartnershipSender(someLogger, adminData, pData); * sender.setExecuteOperation(PartnershipOp.Add); * sender.run(); * </pre> * * <b>Note for setting the manage partnership end-point</b> * You should add <WEB-APP-NAME>/admin/as2/partnership to your H2O host. * For example, 'http://localhost:8080/admin/as2/partnership'. * * <b>Technical Information</b> * The <code>AS2PartnershipSender</code> will generate a HTTP multi-part request to * the manage partnership end-point. The request includes all parameter extracted * from the <code>AS2Partnership</code>, each of them is represented as either text/plain multi-part, * or application binary multi-part (for the <code>certificates</code>). The type * of partnership operation to execute also append at the end of the HTTP request in * a text multi-part form. * * @author Twinsen Tsang * @version 1.0.0 * @since H2O 28/11 * * @see hk.hku.cecid.corvus.ws.data.AS2AdminData * @see hk.hku.cecid.corvus.ws.data.AS2PartnershipData * @see hk.hku.cecid.corvus.http.PartnershipOp */ public class AS2PartnershipSender extends PartnershipSender { /* * A mapping containing the mapping from the partnership data hash key to * the HTTP multi-part request parameters. */ static final Map PARTNERSHIP_DATA_2_FROM_PARAM_NAME_MAPPING = new HashMap() { private static final long serialVersionUID = 8744122089368239608L; { // The array containing the partnership data to HTTP request parameters String [] pdata2param = { "partnership_id" , "disabled" , "is_sync_reply" , "subject" , "recipient_address" , "is_hostname_verified" , "receipt_address" , "is_receipt_requested", "is_outbound_sign_required" , "is_outbound_encrypt_required" , "is_outbound_compress_required", "is_receipt_sign_required" , "is_inbound_sign_required", "is_inbound_encrypt_required" , "retries", "retry_interval" , "sign_algorithm" , "encrypt_algorithm" , "mic_algorithm" , "as2_from" , "as2_to" , "encrypt_cert" , "verify_cert" }; /* Create the partnership data to web form mapping */ for (int i = 0; i < AS2PartnershipData.PARAM_KEY_SET.length; i++){ this.put(AS2PartnershipData.PARAM_KEY_SET[i], pdata2param[i]); } } }; /* * A mapping containing the partnership operation to the actual action textual * in the web form at the HTTP request. */ static final Map PARTNERSHIP_OP_2_WORD = new HashMap() { private static final long serialVersionUID = -4083408040950444946L; { this.put(new Integer(PartnershipOp.ADD) , "add"); this.put(new Integer(PartnershipOp.DELETE), "delete"); this.put(new Integer(PartnershipOp.UPDATE), "update"); }}; // The administration data for setting the end-point and authentication // private AS2AdminData ad; /** * Explicit Constructor. Create an instance of <code>AS2PartnershipSender</code>. * * @param logger The logger for log the sending process. * @param ad The <code>AS2AdminData</code> for locating the HTTP end-point the request send to. * @param p The <code>AS2PartnershipData</code> you want to add/delete/update. * * @throws NullPointerException * When <code>p</code> is null. * When the manage partnership end-point from <code>ad</code> is null or empty. */ public AS2PartnershipSender(FileLogger logger, AS2AdminData ad, AS2PartnershipData p) { super(logger, p); if (p == null) throw new NullPointerException("Missing 'partnershipData' for creating partnerhsip sender."); String endpoint = ad.getManagePartnershipEndpoint(); if (endpoint == null || endpoint.equals("")) throw new NullPointerException("Missing 'Manage Partnership endpoint' in AS2 Admin Data."); this.setServiceEndPoint(endpoint); this.setBasicAuthentication(ad.getUsername(), new String(ad.getPassword())); this.setExecuteOperation(ad.getPartnershipOperation()); //this.ad = ad; } /* (non-Javadoc) * @see hk.hku.cecid.corvus.http.PartnershipSender#getPartnershipMapping() */ public Map getPartnershipMapping() { return PARTNERSHIP_DATA_2_FROM_PARAM_NAME_MAPPING; } /* (non-Javadoc) * @see hk.hku.cecid.corvus.http.PartnershipSender#getPartnershipOperationMapping() */ public Map getPartnershipOperationMapping() { return PARTNERSHIP_OP_2_WORD; } /** * The main method for executing the partnership operation request. * * @see hk.hku.cecid.corvus.http.HttpSender#run() */ // Override to give some javadoc. public void run() { super.run(); } /** * The main method is for CLI mode. */ public static void main(String [] args){ try{ java.io.PrintStream out = System.out; if (args.length < 3){ out.println("Usage: as2-partnership [partnership-xml] [config-xml] [log-path]"); out.println(); out.println("Example: as2-partnership ./config/as2-partnership.xml ./config/as2-partnership/as2-request.xml ./logs/as2-partnership.log"); System.exit(1); } out.println("----------------------------------------------------"); out.println(" AS2 Partnership Maintainance Tool "); out.println("----------------------------------------------------"); // Initialize the logger. out.println("Initialize logger .. "); // The logger path is specified at the last argument. FileLogger logger = new FileLogger(new java.io.File(args[args.length-1])); out.println("Importing AS2 partnership parameters ..."); AS2PartnershipData pd = DataFactory.getInstance() .createAS2PartnershipFromXML( new PropertyTree(new java.io.File(args[0]).toURI().toURL())); // Initialize the query parameter. out.println("Importing AS2 sending parameters ... "); AS2AdminData acd = DataFactory.getInstance() .createAS2AdminDataFromXML( new PropertyTree(new java.io.File(args[1]).toURI().toURL())); // Initialize the sender. out.println("Initialize AS2 HTTP data service client... "); AS2PartnershipSender sender = new AS2PartnershipSender(logger, acd, pd); out.println("Sending AS2 HTTP partnership maintenance request ... "); sender.run(); out.println(); out.println(" Sending Done: "); out.println("----------------------------------------------------"); out.println("The result status : " + sender.getStatus()); out.println("Please view log for details .. "); } catch(Exception e){ e.printStackTrace(System.err); } } }