You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ofbiz.apache.org by ap...@apache.org on 2007/07/21 05:34:08 UTC

svn commit: r558234 - in /ofbiz/trunk/specialpurpose/oagis: servicedef/secas.xml servicedef/services.xml src/org/ofbiz/oagis/OagisShipmentServices.java

Author: apatel
Date: Fri Jul 20 20:34:07 2007
New Revision: 558234

URL: http://svn.apache.org/viewvc?view=rev&rev=558234
Log:
adding cc auth process before processing shipment.

Modified:
    ofbiz/trunk/specialpurpose/oagis/servicedef/secas.xml
    ofbiz/trunk/specialpurpose/oagis/servicedef/services.xml
    ofbiz/trunk/specialpurpose/oagis/src/org/ofbiz/oagis/OagisShipmentServices.java

Modified: ofbiz/trunk/specialpurpose/oagis/servicedef/secas.xml
URL: http://svn.apache.org/viewvc/ofbiz/trunk/specialpurpose/oagis/servicedef/secas.xml?view=diff&rev=558234&r1=558233&r2=558234
==============================================================================
--- ofbiz/trunk/specialpurpose/oagis/servicedef/secas.xml (original)
+++ ofbiz/trunk/specialpurpose/oagis/servicedef/secas.xml Fri Jul 20 20:34:07 2007
@@ -28,9 +28,9 @@
         <condition-field field-name="statusId" operator="not-equals" to-field-name="oldStatusId"/>
         <action service="oagisProcessShipment" mode="sync"/>
     </eca-->
-    <eca service="oagisPocessShipment" event="commit" run-on-error="false">
+    <!--eca service="oagisPocessShipment" event="commit" run-on-error="false">
         <action service="createOagisMessageInfo" mode="sync"/>
-    </eca>
+    </eca-->
     
     <!--<eca service="receiveConfirmBod" event="commit" run-on-error="true">
         <action service="createOagisMessageInfo" mode="sync"/>

Modified: ofbiz/trunk/specialpurpose/oagis/servicedef/services.xml
URL: http://svn.apache.org/viewvc/ofbiz/trunk/specialpurpose/oagis/servicedef/services.xml?view=diff&rev=558234&r1=558233&r2=558234
==============================================================================
--- ofbiz/trunk/specialpurpose/oagis/servicedef/services.xml (original)
+++ ofbiz/trunk/specialpurpose/oagis/servicedef/services.xml Fri Jul 20 20:34:07 2007
@@ -45,7 +45,7 @@
         <attribute name="errorMapList" type="java.util.List" mode="OUT" optional="true"/>
     </service>
 
-    <service name="createOagisMessageInfo" engine="simple" default-entity-name="OagisMessageInfo" 
+    <service name="createOagisMessageInfo" engine="simple" default-entity-name="OagisMessageInfo"
             location="org/ofbiz/oagis/OagisMessageServices.xml" invoke="createOagisMessageInfo" auth="true">
          <description>Create MessageInfo</description>
          <auto-attributes mode="IN" include="pk" optional="false"/>
@@ -65,7 +65,7 @@
          <auto-attributes mode="IN" include="pk" optional="false"/>
          <auto-attributes mode="IN" include="nonpk" optional="true"/>
          <override name="errorSeqId" optional="true"/>        
-    </service>        
+    </service>
     
     <service name="updateOagisMessageErrorInfo" engine="simple" default-entity-name="OagisMessageErrorInfo"
              location="org/ofbiz/oagis/OagisMessageServices.xml" invoke="updateOagisMessageErrorInfo" auth="true">
@@ -119,17 +119,17 @@
         <attribute name="bodyParameters" type="Map" mode="IN" optional="true"/>
         <attribute name="body" type="String" mode="OUT" optional="true"/>
     </service>
-    <service name="oagisProcessShipment" max-retry="0" engine="java"
+    <service name="oagisProcessShipment" max-retry="0" engine="java" 
         location="org.ofbiz.oagis.OagisShipmentServices" invoke="oagisProcessShipment">
         <description>Prepare and Optionally Send OAGIS Process Shipment Message.
             Note on usage: you can pass in either sendToUrl, saveToFilename, or outputStream. 
             If none are passed in the URL in oagis.properties will be used at the target for the message.</description>
-        <implements service="oagisMessageInfoInterface"/>
+        <!--implements service="oagisMessageInfoInterface"/-->
         <attribute name="sendToUrl" type="String" mode="IN" optional="true"/>
         <attribute name="saveToFilename" type="String" mode="IN" optional="true"/>
         <attribute name="saveToDirectory" type="String" mode="IN" optional="true"/>
         <attribute name="outputStream" type="java.io.OutputStream" mode="IN" optional="true"/>
-        <override name="orderId" mode="INOUT" type="String" optional="false"/>
+        <attribute name="orderId" mode="IN" type="String" optional="false"/>
     </service>
     <service name="sendProcessShipmentMsg" max-retry="0" engine="simple"
         location="org/ofbiz/oagis/OagisMessageServices.xml" invoke="sendProcessShipmentMsg">

Modified: ofbiz/trunk/specialpurpose/oagis/src/org/ofbiz/oagis/OagisShipmentServices.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/specialpurpose/oagis/src/org/ofbiz/oagis/OagisShipmentServices.java?view=diff&rev=558234&r1=558233&r2=558234
==============================================================================
--- ofbiz/trunk/specialpurpose/oagis/src/org/ofbiz/oagis/OagisShipmentServices.java (original)
+++ ofbiz/trunk/specialpurpose/oagis/src/org/ofbiz/oagis/OagisShipmentServices.java Fri Jul 20 20:34:07 2007
@@ -36,6 +36,7 @@
 import java.util.Iterator;
 import java.util.LinkedList;
 import java.util.List;
+import java.util.Locale;
 import java.util.Map;
 import java.util.Set;
 import java.util.TreeSet;
@@ -43,6 +44,7 @@
 import javax.xml.parsers.ParserConfigurationException;
 
 import javolution.util.FastList;
+import javolution.util.FastMap;
 import javolution.util.FastSet;
 
 import org.ofbiz.base.util.Debug;
@@ -247,8 +249,10 @@
         String saveToFilename = (String) context.get("saveToFilename");
         String saveToDirectory = (String) context.get("saveToDirectory");
         OutputStream out = (OutputStream) context.get("outputStream");
+        Locale locale = (Locale) context.get("locale");
         
         Map result = ServiceUtil.returnSuccess();
+        Map comiCtx = new HashMap();
         MapStack bodyParameters =  MapStack.create();
         if (userLogin == null) {
             try {
@@ -257,215 +261,251 @@
                 Debug.logError(e, "Error getting userLogin", module);
             }
         }
-        GenericValue orderHeader = null;
-        GenericValue orderItemShipGroup = null;
-        try {
-            orderHeader = delegator.findByPrimaryKey("OrderHeader", UtilMisc.toMap("orderId", orderId));
-        } catch (GenericEntityException e) {
-            Debug.logError(e, module);
-            return ServiceUtil.returnError(e.getMessage());
-        }
-        GenericValue shipment =null;
-        if (orderHeader != null) {
-            String orderStatusId = orderHeader.getString("statusId");
-            if (orderStatusId.equals("ORDER_APPROVED")) {
-                try {
-                    Map  cospResult= dispatcher.runSync("createOrderShipmentPlan", UtilMisc.toMap("orderId", orderId, "userLogin", userLogin));
-                    shipmentId = (String) cospResult.get("shipmentId");
-                } catch (GenericServiceException e) {
-                    Debug.logError(e, module);
-                    return ServiceUtil.returnError(e.getMessage());
+        // check payment authorization
+        boolean checkPaymentAuth = false;
+        if (orderId != null) {
+            Map serviceContext = FastMap.newInstance();
+            serviceContext.put("orderId", orderId);
+            serviceContext.put("userLogin", userLogin);
+            Map authResult = null;
+            try {
+                authResult = dispatcher.runSync("authOrderPayments", serviceContext);
+                String processResult = (String) authResult.get("processResult");
+                if (processResult.equals("APPROVED")) {
+                    checkPaymentAuth = true;
+                    Debug.logInfo("payment authorization completed: ", module);
+                } else {
+                    Debug.logInfo("payment authorization could not completed: ", module);
                 }
-                try {
-                    shipment = delegator.findByPrimaryKey("Shipment", UtilMisc.toMap("shipmentId", shipmentId));
-                    bodyParameters.put("shipment", shipment);
-                    OrderReadHelper orderReadHelper = new OrderReadHelper(orderHeader);
-                    if(orderReadHelper.hasShippingAddress()) {
-                        GenericValue  address = EntityUtil.getFirst(orderReadHelper.getShippingLocations());
-                        bodyParameters.put("address", address);
+            } catch (GenericServiceException e) {
+                String errMsg = "Error authorizing payment: " + e.toString();
+                Debug.logError(e, errMsg, module);
+                return ServiceUtil.returnError(errMsg);
+            }
+        }
+        if (checkPaymentAuth) {
+            GenericValue orderHeader = null;
+            GenericValue orderItemShipGroup = null;
+            try {
+                orderHeader = delegator.findByPrimaryKey("OrderHeader", UtilMisc.toMap("orderId", orderId));
+            } catch (GenericEntityException e) {
+                Debug.logError(e, module);
+                return ServiceUtil.returnError(e.getMessage());
+            }
+            GenericValue shipment =null;
+            if (orderHeader != null) {
+                String orderStatusId = orderHeader.getString("statusId");
+                if (orderStatusId.equals("ORDER_APPROVED")) {
+                    try {
+                        Map  cospResult= dispatcher.runSync("createOrderShipmentPlan", UtilMisc.toMap("orderId", orderId, "userLogin", userLogin));
+                        shipmentId = (String) cospResult.get("shipmentId");
+                    } catch (GenericServiceException e) {
+                        Debug.logError(e, module);
+                        return ServiceUtil.returnError(e.getMessage());
+                    }
+                    try {
+                        shipment = delegator.findByPrimaryKey("Shipment", UtilMisc.toMap("shipmentId", shipmentId));
+                        bodyParameters.put("shipment", shipment);
+                        OrderReadHelper orderReadHelper = new OrderReadHelper(orderHeader);
+                        if(orderReadHelper.hasShippingAddress()) {
+                            GenericValue  address = EntityUtil.getFirst(orderReadHelper.getShippingLocations());
+                            bodyParameters.put("address", address);
+                        }
+                        String emailString = orderReadHelper.getOrderEmailString();
+                        bodyParameters.put("emailString", emailString);
+    
+                        String contactMechId = shipment.getString("destinationTelecomNumberId");
+                        GenericValue telecomNumber = delegator.findByPrimaryKey("TelecomNumber", UtilMisc.toMap("contactMechId", contactMechId));
+                        bodyParameters.put("telecomNumber", telecomNumber);
+    
+                        List shipmentItems = delegator.findByAnd("ShipmentItem", UtilMisc.toMap("shipmentId", shipmentId));
+                        bodyParameters.put("shipmentItems", shipmentItems);
+                        
+                        orderItemShipGroup = EntityUtil.getFirst(delegator.findByAnd("OrderItemShipGroup", UtilMisc.toMap("orderId", orderId)));
+                        bodyParameters.put("orderItemShipGroup", orderItemShipGroup);
+                    } catch (GenericEntityException e) {
+                        Debug.logError(e, module);
                     }
-                    String emailString = orderReadHelper.getOrderEmailString();
-                    bodyParameters.put("emailString", emailString);
-
-                    String contactMechId = shipment.getString("destinationTelecomNumberId");
-                    GenericValue telecomNumber = delegator.findByPrimaryKey("TelecomNumber", UtilMisc.toMap("contactMechId", contactMechId));
-                    bodyParameters.put("telecomNumber", telecomNumber);
-
-                    List shipmentItems = delegator.findByAnd("ShipmentItem", UtilMisc.toMap("shipmentId", shipmentId));
-                    bodyParameters.put("shipmentItems", shipmentItems);
                     
-                    orderItemShipGroup = EntityUtil.getFirst(delegator.findByAnd("OrderItemShipGroup", UtilMisc.toMap("orderId", orderId)));
-                    bodyParameters.put("orderItemShipGroup", orderItemShipGroup);
-                } catch (GenericEntityException e) {
-                    Debug.logError(e, module);
-                }
-                
-                Set correspondingPoIdSet = FastSet.newInstance();
-                try {
-                    List orderItems = delegator.findByAnd("OrderItem", UtilMisc.toMap("orderId", shipment.getString("primaryOrderId")));
-                    Iterator oiIter = orderItems.iterator();
-                    while (oiIter.hasNext()) {
-                        GenericValue orderItem = (GenericValue) oiIter.next();
-                        String correspondingPoId = orderItem.getString("correspondingPoId");
-                        if (correspondingPoId != null) {
-	                        correspondingPoIdSet.add(correspondingPoId);
+                    Set correspondingPoIdSet = FastSet.newInstance();
+                    try {
+                        List orderItems = delegator.findByAnd("OrderItem", UtilMisc.toMap("orderId", shipment.getString("primaryOrderId")));
+                        Iterator oiIter = orderItems.iterator();
+                        while (oiIter.hasNext()) {
+                            GenericValue orderItem = (GenericValue) oiIter.next();
+                            String correspondingPoId = orderItem.getString("correspondingPoId");
+                            if (correspondingPoId != null) {
+    	                        correspondingPoIdSet.add(correspondingPoId);
+                            }
                         }
+                    } catch (GenericEntityException e) {
+                        Debug.logError(e, module);
                     }
-                } catch (GenericEntityException e) {
-                    Debug.logError(e, module);
-                }
-                bodyParameters.put("correspondingPoIdSet", correspondingPoIdSet);
-
-                Set externalIdSet = FastSet.newInstance();
-                try {
-                    GenericValue primaryOrderHeader = delegator.findByPrimaryKey("OrderHeader", UtilMisc.toMap("orderId", shipment.getString("primaryOrderId")));
-                    externalIdSet.add(primaryOrderHeader.getString("externalId"));
-                } catch (GenericEntityException e) {
-                    Debug.logError(e, module);
-                }
-                bodyParameters.put("externalIdSet", externalIdSet);
-                
-                // Check if order was a return replacement order (associated with return)
-                List returnItemResponses =  null;
-                List returnItemRespExprs = UtilMisc.toList(new EntityExpr("replacementOrderId", EntityOperator.NOT_EQUAL, null));
-                EntityCondition returnItemRespCond = new EntityConditionList(returnItemRespExprs, EntityOperator.AND);
-                // list of fields to select (initial list)
-                List fieldsToSelect = FastList.newInstance();
-                fieldsToSelect.add("replacementOrderId");
-                try {
-                    returnItemResponses = delegator.findByCondition("ReturnItemResponse", returnItemRespCond, fieldsToSelect, null);
-                    Iterator rirIter = returnItemResponses.iterator();
-                    while (rirIter.hasNext()) {
-                        GenericValue returnItemResponse = (GenericValue) rirIter.next();
-                        String replacementOrderId = returnItemResponse.getString("replacementOrderId");
-                        if (replacementOrderId.equals(shipment.getString("primaryOrderId"))) {
-                            bodyParameters.put("shipnotes", "RETURNLABEL");
-                            
-                            // Get the associated return Id (replaceReturnId)
-                            String returnItemResponseId = returnItemResponse.getString("returnItemResponseId");
-                            GenericValue returnItem = EntityUtil.getFirst(delegator.findByAnd("ReturnItem", UtilMisc.toMap("returnItemResponseId", returnItemResponseId)));
-                            bodyParameters.put("replacementReturnId", returnItem.getString("returnId"));
+                    bodyParameters.put("correspondingPoIdSet", correspondingPoIdSet);
+    
+                    Set externalIdSet = FastSet.newInstance();
+                    try {
+                        GenericValue primaryOrderHeader = delegator.findByPrimaryKey("OrderHeader", UtilMisc.toMap("orderId", shipment.getString("primaryOrderId")));
+                        String externalId = primaryOrderHeader.getString("externalId");
+                        if (externalId != null) {
+                            externalIdSet.add(externalId);
                         }
+                    } catch (GenericEntityException e) {
+                        Debug.logError(e, module);
                     }
-                } catch (GenericEntityException e) {
-                    Debug.logError(e, module);
-                }
-                String logicalId = UtilProperties.getPropertyValue("oagis.properties", "CNTROLAREA.SENDER.LOGICALID");
-                bodyParameters.put("logicalId", logicalId);
-                result.put("logicalId", logicalId);
-                
-                String authId = UtilProperties.getPropertyValue("oagis.properties", "CNTROLAREA.SENDER.AUTHID");
-                bodyParameters.put("authId", authId);
-                result.put("authId", authId);
-
-                String referenceId = delegator.getNextSeqId("OagisMessageInfo");
-                bodyParameters.put("referenceId", referenceId);
-                result.put("referenceId", referenceId);
+                    bodyParameters.put("externalIdSet", externalIdSet);
                     
-                DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSS'Z'Z");
-                Timestamp timestamp = UtilDateTime.nowTimestamp();
-                String sentDate = dateFormat.format(timestamp);
-                bodyParameters.put("sentDate", sentDate);
-                result.put("sentDate", timestamp);
-               
-                // tracking shipper account
-                String partyId = shipment.getString("partyIdTo");
-                List partyCarrierAccounts = new ArrayList();
-                try {
-                    partyCarrierAccounts = delegator.findByAnd("PartyCarrierAccount", UtilMisc.toMap("partyId", partyId));
-                    partyCarrierAccounts = EntityUtil.filterByDate(partyCarrierAccounts);
-                    if (partyCarrierAccounts != null) {
-                        Iterator pcaIter = partyCarrierAccounts.iterator();
-                        while (pcaIter.hasNext()) {
-                            GenericValue partyCarrierAccount = (GenericValue) pcaIter.next();
-                            String carrierPartyId = partyCarrierAccount.getString("carrierPartyId");
-                            if (carrierPartyId.equals(orderItemShipGroup.getString("carrierPartyId"))) {
-                                String accountNumber = partyCarrierAccount.getString("accountNumber");
-                                bodyParameters.put("shipperId", accountNumber);
+                    // if order was a return replacement order (associated with return)
+                    List returnItemResponses =  null;
+                    List returnItemRespExprs = UtilMisc.toList(new EntityExpr("replacementOrderId", EntityOperator.NOT_EQUAL, null));
+                    EntityCondition returnItemRespCond = new EntityConditionList(returnItemRespExprs, EntityOperator.AND);
+                    // list of fields to select (initial list)
+                    List fieldsToSelect = FastList.newInstance();
+                    fieldsToSelect.add("replacementOrderId");
+                    try {
+                        returnItemResponses = delegator.findByCondition("ReturnItemResponse", returnItemRespCond, fieldsToSelect, null);
+                        Iterator rirIter = returnItemResponses.iterator();
+                        while (rirIter.hasNext()) {
+                            GenericValue returnItemResponse = (GenericValue) rirIter.next();
+                            String replacementOrderId = returnItemResponse.getString("replacementOrderId");
+                            if (replacementOrderId.equals(shipment.getString("primaryOrderId"))) {
+                                bodyParameters.put("shipnotes", "RETURNLABEL");
+                                
+                                // Get the associated return Id (replaceReturnId)
+                                String returnItemResponseId = returnItemResponse.getString("returnItemResponseId");
+                                GenericValue returnItem = EntityUtil.getFirst(delegator.findByAnd("ReturnItem", UtilMisc.toMap("returnItemResponseId", returnItemResponseId)));
+                                bodyParameters.put("replacementReturnId", returnItem.getString("returnId"));
                             }
                         }
+                    } catch (GenericEntityException e) {
+                        Debug.logError(e, module);
                     }
-                } catch (GenericEntityException e) {
-                    Debug.logError(e, module);
-                }
-                bodyParameters.put("shipmentId", shipmentId);
-                bodyParameters.put("orderId", orderId);
-                bodyParameters.put("userLogin", userLogin);
-                String bodyScreenUri = UtilProperties.getPropertyValue("oagis.properties", "Oagis.Template.ProcessShipment");
-
-                Writer writer = null;
-                if (out != null) {
-                    writer = new OutputStreamWriter(out);
-                } else if (UtilValidate.isNotEmpty(saveToFilename)) {
-                	try {
-                        File outdir = new File(saveToDirectory);
-                        if (!outdir.exists()) {
-                            outdir.mkdir();
+                    String logicalId = UtilProperties.getPropertyValue("oagis.properties", "CNTROLAREA.SENDER.LOGICALID");
+                    bodyParameters.put("logicalId", logicalId);
+                    comiCtx.put("logicalId", logicalId);
+                    
+                    String authId = UtilProperties.getPropertyValue("oagis.properties", "CNTROLAREA.SENDER.AUTHID");
+                    bodyParameters.put("authId", authId);
+                    comiCtx.put("authId", authId);
+    
+                    String referenceId = delegator.getNextSeqId("OagisMessageInfo");
+                    bodyParameters.put("referenceId", referenceId);
+                    comiCtx.put("referenceId", referenceId);
+                        
+                    DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSS'Z'Z");
+                    Timestamp timestamp = UtilDateTime.nowTimestamp();
+                    String sentDate = dateFormat.format(timestamp);
+                    bodyParameters.put("sentDate", sentDate);
+                    comiCtx.put("sentDate", timestamp);
+                   
+                    // tracking shipper account
+                    String partyId = shipment.getString("partyIdTo");
+                    List partyCarrierAccounts = new ArrayList();
+                    try {
+                        partyCarrierAccounts = delegator.findByAnd("PartyCarrierAccount", UtilMisc.toMap("partyId", partyId));
+                        partyCarrierAccounts = EntityUtil.filterByDate(partyCarrierAccounts);
+                        if (partyCarrierAccounts != null) {
+                            Iterator pcaIter = partyCarrierAccounts.iterator();
+                            while (pcaIter.hasNext()) {
+                                GenericValue partyCarrierAccount = (GenericValue) pcaIter.next();
+                                String carrierPartyId = partyCarrierAccount.getString("carrierPartyId");
+                                if (carrierPartyId.equals(orderItemShipGroup.getString("carrierPartyId"))) {
+                                    String accountNumber = partyCarrierAccount.getString("accountNumber");
+                                    bodyParameters.put("shipperId", accountNumber);
+                                }
+                            }
                         }
-                        writer = new PrintWriter(new BufferedWriter(new OutputStreamWriter(new FileOutputStream(new File(outdir, saveToFilename)), "UTF-8")));
-                	} catch (Exception e) {
-                		String errMsg = "Error opening file to save message to [" + saveToFilename + "]: " + e.toString();
-                        Debug.logError(e, errMsg, module);
-                        return ServiceUtil.returnError(errMsg);
-                	}
-                } else if (UtilValidate.isNotEmpty(sendToUrl)) {
-                	writer = new StringWriter();
-                }
-
-                ScreenRenderer screens = new ScreenRenderer(writer, bodyParameters, new HtmlScreenRenderer());
-                try {
-                    screens.render(bodyScreenUri);
-                    writer.close();
-                } catch (Exception e) {
-                	String errMsg = "Error rendering message: " + e.toString();
-                    Debug.logError(e, errMsg, module);
-                    return ServiceUtil.returnError(errMsg);
-                }
-                
-                // TODO: call service with require-new-transaction=true to save the OagisMessageInfo data (to make sure it saves before)
-
-                if (UtilValidate.isNotEmpty(sendToUrl)) {
-                    HttpClient http = new HttpClient(sendToUrl);
-
-                    // test parameters
-                    http.setHostVerificationLevel(SSLUtil.HOSTCERT_NO_CHECK);
-                    http.setAllowUntrusted(true);
-                    http.setDebug(true);
-                      
-                    // needed XML post parameters
-                    if (UtilValidate.isNotEmpty(certAlias)) {
-                    	http.setClientCertificateAlias(certAlias);
+                    } catch (GenericEntityException e) {
+                        Debug.logError(e, module);
                     }
-                    if (UtilValidate.isNotEmpty(basicAuthUsername)) {
-                        http.setBasicAuthInfo(basicAuthUsername, basicAuthPassword);
+                    bodyParameters.put("shipmentId", shipmentId);
+                    bodyParameters.put("orderId", orderId);
+                    bodyParameters.put("userLogin", userLogin);
+                    String bodyScreenUri = UtilProperties.getPropertyValue("oagis.properties", "Oagis.Template.ProcessShipment");
+    
+                    Writer writer = null;
+                    if (out != null) {
+                        writer = new OutputStreamWriter(out);
+                    } else if (UtilValidate.isNotEmpty(saveToFilename)) {
+                    	try {
+                            File outdir = new File(saveToDirectory);
+                            if (!outdir.exists()) {
+                                outdir.mkdir();
+                            }
+                            writer = new PrintWriter(new BufferedWriter(new OutputStreamWriter(new FileOutputStream(new File(outdir, saveToFilename)), "UTF-8")));
+                    	} catch (Exception e) {
+                    		String errMsg = "Error opening file to save message to [" + saveToFilename + "]: " + e.toString();
+                            Debug.logError(e, errMsg, module);
+                            return ServiceUtil.returnError(errMsg);
+                    	}
+                    } else if (UtilValidate.isNotEmpty(sendToUrl)) {
+                    	writer = new StringWriter();
                     }
-                    http.setContentType("text/xml");
-                    http.setKeepAlive(true);
-
+    
+                    ScreenRenderer screens = new ScreenRenderer(writer, bodyParameters, new HtmlScreenRenderer());
                     try {
-                    	String resp = http.post(writer.toString());
+                        screens.render(bodyScreenUri);
+                        writer.close();
                     } catch (Exception e) {
-                    	String errMsg = "Error posting message to server with UTL [" + sendToUrl + "]: " + e.toString();
+                    	String errMsg = "Error rendering message: " + e.toString();
                         Debug.logError(e, errMsg, module);
                         return ServiceUtil.returnError(errMsg);
                     }
+                    
+                    // TODO: call service with require-new-transaction=true to save the OagisMessageInfo data (to make sure it saves before)
+                    // prepare map to Create Oagis Message Info
+                    comiCtx.put("component", "INVENTORY");
+                    comiCtx.put("task", "SHIPREQUES"); // Actual value of task is "SHIPREQUEST" which is more than 10 char
+                    comiCtx.put("outgoingMessage", "Y");
+                    comiCtx.put("confirmation", "1");
+                    comiCtx.put("bsrVerb", "PROCESS");
+                    comiCtx.put("bsrNoun", "SHIPMENT");
+                    comiCtx.put("bsrRevision", "001");
+                    comiCtx.put("processingStatusId", orderStatusId);
+                    comiCtx.put("orderId", orderId);
+                    comiCtx.put("shipmentId", shipmentId);
+                    comiCtx.put("userLogin", userLogin);
+                    
+                    try {
+                        Map oagisMsgInfoResult = dispatcher.runSync("createOagisMessageInfo", comiCtx);
+                    } catch (GenericServiceException e){
+                        String errMsg = UtilProperties.getMessage(ServiceUtil.resource, "OagisErrorInCreatingDataForOagisMessageInfoEntity", locale);
+                        Debug.logError(e, errMsg, module);
+                    }
+    
+                    if (UtilValidate.isNotEmpty(sendToUrl)) {
+                        HttpClient http = new HttpClient(sendToUrl);
+    
+                        // test parameters
+                        http.setHostVerificationLevel(SSLUtil.HOSTCERT_NO_CHECK);
+                        http.setAllowUntrusted(true);
+                        http.setDebug(true);
+                          
+                        // needed XML post parameters
+                        if (UtilValidate.isNotEmpty(certAlias)) {
+                        	http.setClientCertificateAlias(certAlias);
+                        }
+                        if (UtilValidate.isNotEmpty(basicAuthUsername)) {
+                            http.setBasicAuthInfo(basicAuthUsername, basicAuthPassword);
+                        }
+                        http.setContentType("text/xml");
+                        http.setKeepAlive(true);
+    
+                        try {
+                        	String resp = http.post(writer.toString());
+                        } catch (Exception e) {
+                        	String errMsg = "Error posting message to server with UTL [" + sendToUrl + "]: " + e.toString();
+                            Debug.logError(e, errMsg, module);
+                            return ServiceUtil.returnError(errMsg);
+                        }
+                    }
                 }
-
-                // prepare map to Create Oagis Message Info
-                result.put("component", "INVENTORY");
-                result.put("task", "SHIPREQUES"); // Actual value of task is "SHIPREQUEST" which is more than 10 char
-                result.put("outgoingMessage", "Y");
-                result.put("confirmation", "1");
-                result.put("bsrVerb", "PROCESS");
-                result.put("bsrNoun", "SHIPMENT");
-                result.put("bsrRevision", "001");
-                result.put("processingStatusId", orderStatusId);
-                result.put("orderId", orderId);
-                result.put("shipmentId", shipmentId);
-                result.put("userLogin", userLogin);
             }
-        }
-        return result;
+           return result;
+       } else {
+           String errMsg = "Service failed:";
+           return ServiceUtil.returnError(errMsg);
+       }
     }
     
     public static Map oagisReceiveDelivery(DispatchContext dctx, Map context) {