package org.argeo.slc.core.process;\r
\r
+import java.io.IOException;\r
+import java.util.Iterator;\r
import java.util.List;\r
\r
+import javax.xml.transform.Source;\r
+import javax.xml.transform.dom.DOMSource;\r
+\r
+import org.springframework.oxm.XmlMappingException;\r
import org.springframework.ws.client.core.WebServiceTemplate;\r
+import org.springframework.ws.soap.SoapFaultDetail;\r
+import org.springframework.ws.soap.SoapFaultDetailElement;\r
import org.springframework.ws.soap.client.SoapFaultClientException;\r
+import org.springframework.xml.transform.StringResult;\r
+import org.w3c.dom.Node;\r
+\r
+import com.ibm.wsdl.util.IOUtils;\r
+\r
+import org.apache.commons.logging.Log;\r
+import org.apache.commons.logging.LogFactory;\r
\r
import org.argeo.slc.msg.process.SlcExecutionRequest;\r
import org.argeo.slc.msg.process.SlcExecutionStepsRequest;\r
public class WebServiceSlcExecutionNotifier implements SlcExecutionNotifier {\r
private WebServiceTemplate template;\r
\r
+ private Log log = LogFactory.getLog(getClass());\r
+\r
public void addSteps(SlcExecution slcExecution,\r
List<SlcExecutionStep> additionalSteps) {\r
SlcExecutionStepsRequest req = new SlcExecutionStepsRequest();\r
req.setSlcExecutionUuid(slcExecution.getUuid());\r
req.setSteps(additionalSteps);\r
- template.marshalSendAndReceive(req);\r
+ if (log.isTraceEnabled()) {\r
+ for (SlcExecutionStep step : additionalSteps) {\r
+ log.trace("Step " + step.getUuid() + ": " + step.logAsString());\r
+ }\r
+ }\r
+\r
+ try {\r
+ marshalSendAndReceive(req);\r
+ if (log.isDebugEnabled())\r
+ log.debug("Added steps to slc execution "\r
+ + slcExecution.getUuid());\r
+ } catch (SoapFaultClientException e) {\r
+ manageSoapException(e);\r
+ }\r
}\r
\r
public void newExecution(SlcExecution slcExecution) {\r
SlcExecutionRequest req = new SlcExecutionRequest();\r
req.setSlcExecution(slcExecution);\r
- template.marshalSendAndReceive(req);\r
+ try {\r
+ marshalSendAndReceive(req);\r
+ if (log.isDebugEnabled())\r
+ log.debug("Notified creation of slc execution "\r
+ + slcExecution.getUuid());\r
+ } catch (SoapFaultClientException e) {\r
+ manageSoapException(e);\r
+ }\r
}\r
\r
public void updateExecution(SlcExecution slcExecution) {\r
SlcExecutionRequest req = new SlcExecutionRequest();\r
req.setSlcExecution(slcExecution);\r
- template.marshalSendAndReceive(req);\r
+ try {\r
+ marshalSendAndReceive(req);\r
+ if (log.isDebugEnabled())\r
+ log.debug("Notified update of slc execution "\r
+ + slcExecution.getUuid());\r
+ } catch (SoapFaultClientException e) {\r
+ manageSoapException(e);\r
+ }\r
}\r
\r
public void setTemplate(WebServiceTemplate template) {\r
this.template = template;\r
}\r
\r
+ protected void manageSoapException(SoapFaultClientException e) {\r
+ log\r
+ .error("WS root cause: "\r
+ + e.getSoapFault().getFaultStringOrReason());\r
+ StringBuffer stack = new StringBuffer("");\r
+ SoapFaultDetail detail = e.getSoapFault().getFaultDetail();\r
+ if (detail != null) {\r
+ Iterator<SoapFaultDetailElement> it = (Iterator<SoapFaultDetailElement>) detail\r
+ .getDetailEntries();\r
+ while (it.hasNext()) {\r
+ SoapFaultDetailElement elem = it.next();\r
+ if (elem.getName().getLocalPart().equals("StackElement")) {\r
+ Source source = elem.getSource();\r
+ if (source instanceof DOMSource) {\r
+ Node node = ((DOMSource) source).getNode();\r
+ stack.append(node.getTextContent()).append('\n');\r
+ }\r
+ }\r
+ }\r
+\r
+ if (stack.length() > 0 && log.isTraceEnabled())\r
+ log.error("WS root cause stack: " + stack);\r
+ }\r
+ }\r
+\r
+ protected Object marshalSendAndReceive(Object req) {\r
+ if (log.isTraceEnabled()) {\r
+ try {\r
+ StringResult result = new StringResult();\r
+ template.getMarshaller().marshal(req, result);\r
+ log.trace("About to send " + result);\r
+ } catch (Exception e) {\r
+ log.error("Cannot marshall " + req + " for logging", e);\r
+ }\r
+ }\r
+ Object resp = template.marshalSendAndReceive(req);\r
+ return resp;\r
+ }\r
}\r