package org.argeo.slc.core.process;\r
\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.ws.client.WebServiceIOException;\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.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.SlcExecutionStatusRequest;\r
import org.argeo.slc.msg.process.SlcExecutionStepsRequest;\r
+import org.argeo.slc.ws.client.WebServiceUtils;\r
\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
+ private Boolean cannotConnect = false;\r
+\r
+ public void newExecution(SlcExecution slcExecution) {\r
+ if (cannotConnect)\r
+ return;\r
+\r
+ SlcExecutionRequest req = new SlcExecutionRequest();\r
+ req.setSlcExecution(slcExecution);\r
try {\r
- template.marshalSendAndReceive(req);\r
- if (log.isDebugEnabled())\r
- log.debug("Added steps to slc execution "\r
+ WebServiceUtils.marshalSendAndReceive(template, req);\r
+ if (log.isTraceEnabled())\r
+ log.trace("Notified creation of slc execution "\r
+ slcExecution.getUuid());\r
} catch (SoapFaultClientException e) {\r
- manageSoapException(e);\r
+ WebServiceUtils.manageSoapException(e);\r
+ } catch (WebServiceIOException e) {\r
+ manageIoException(e);\r
}\r
}\r
\r
- public void newExecution(SlcExecution slcExecution) {\r
+ public void updateExecution(SlcExecution slcExecution) {\r
+ if (cannotConnect)\r
+ return;\r
+\r
SlcExecutionRequest req = new SlcExecutionRequest();\r
req.setSlcExecution(slcExecution);\r
try {\r
- template.marshalSendAndReceive(req);\r
- if (log.isDebugEnabled())\r
- log.debug("Notified creation of slc execution "\r
+ WebServiceUtils.marshalSendAndReceive(template, req);\r
+ if (log.isTraceEnabled())\r
+ log.trace("Notified update of slc execution "\r
+ slcExecution.getUuid());\r
} catch (SoapFaultClientException e) {\r
- manageSoapException(e);\r
+ WebServiceUtils.manageSoapException(e);\r
+ } catch (WebServiceIOException e) {\r
+ manageIoException(e);\r
}\r
}\r
\r
- public void updateExecution(SlcExecution slcExecution) {\r
- SlcExecutionRequest req = new SlcExecutionRequest();\r
- req.setSlcExecution(slcExecution);\r
+ public void updateStatus(SlcExecution slcExecution, String oldStatus,\r
+ String newStatus) {\r
+ if (cannotConnect)\r
+ return;\r
+\r
+ SlcExecutionStatusRequest req = new SlcExecutionStatusRequest(\r
+ slcExecution.getUuid(), newStatus);\r
try {\r
- template.marshalSendAndReceive(req);\r
- if (log.isDebugEnabled())\r
- log.debug("Notify update of slc execution "\r
+ WebServiceUtils.marshalSendAndReceive(template, req);\r
+ if (log.isTraceEnabled())\r
+ log.trace("Notified status update of slc execution "\r
+ slcExecution.getUuid());\r
} catch (SoapFaultClientException e) {\r
- manageSoapException(e);\r
+ WebServiceUtils.manageSoapException(e);\r
+ } catch (WebServiceIOException e) {\r
+ manageIoException(e);\r
+ }\r
+ }\r
+\r
+ public void addSteps(SlcExecution slcExecution,\r
+ List<SlcExecutionStep> additionalSteps) {\r
+ if (cannotConnect)\r
+ return;\r
+\r
+ SlcExecutionStepsRequest req = new SlcExecutionStepsRequest();\r
+ req.setSlcExecutionUuid(slcExecution.getUuid());\r
+ req.setSteps(additionalSteps);\r
+ if (log.isTraceEnabled()) {\r
+ for (SlcExecutionStep step : additionalSteps) {\r
+ log.trace("Step " + step.getUuid() + ": " + step.logAsString());\r
+ }\r
+ }\r
+\r
+ try {\r
+ WebServiceUtils.marshalSendAndReceive(template, req);\r
+ if (log.isTraceEnabled())\r
+ log.trace("Added steps to slc execution "\r
+ + slcExecution.getUuid());\r
+ } catch (SoapFaultClientException e) {\r
+ WebServiceUtils.manageSoapException(e);\r
+ } catch (WebServiceIOException e) {\r
+ manageIoException(e);\r
}\r
}\r
\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
+ protected void manageIoException(WebServiceIOException e) {\r
+ if (!cannotConnect) {\r
+ log.error("Cannot connect to " + template.getDefaultUri()\r
+ + ". Won't try again.", e);\r
+ cannotConnect = true;\r
}\r
}\r
+\r
}\r