diff --git a/config/alfresco/action-services-context.xml b/config/alfresco/action-services-context.xml index 3dcec501b0..1e2d1d59aa 100644 --- a/config/alfresco/action-services-context.xml +++ b/config/alfresco/action-services-context.xml @@ -650,6 +650,9 @@ + + + diff --git a/source/java/org/alfresco/repo/avm/actions/AVMDeployWebsiteAction.java b/source/java/org/alfresco/repo/avm/actions/AVMDeployWebsiteAction.java index 6b08b9ccd8..f2ec2e0c34 100644 --- a/source/java/org/alfresco/repo/avm/actions/AVMDeployWebsiteAction.java +++ b/source/java/org/alfresco/repo/avm/actions/AVMDeployWebsiteAction.java @@ -34,6 +34,8 @@ import org.alfresco.repo.action.ParameterDefinitionImpl; import org.alfresco.repo.action.executer.ActionExecuterAbstractBase; import org.alfresco.repo.avm.AVMNodeConverter; import org.alfresco.repo.content.MimetypeMap; +import org.alfresco.repo.transaction.RetryingTransactionHelper; +import org.alfresco.repo.transaction.RetryingTransactionHelper.RetryingTransactionCallback; import org.alfresco.service.cmr.action.Action; import org.alfresco.service.cmr.action.ParameterDefinition; import org.alfresco.service.cmr.avm.deploy.DeploymentCallback; @@ -48,6 +50,7 @@ import org.alfresco.service.cmr.repository.ContentWriter; import org.alfresco.service.cmr.repository.NodeRef; import org.alfresco.service.cmr.repository.NodeService; import org.alfresco.service.namespace.QName; +import org.alfresco.service.transaction.TransactionService; import org.alfresco.util.Pair; import org.alfresco.util.RegexNameMatcher; import org.apache.commons.logging.Log; @@ -85,6 +88,7 @@ public class AVMDeployWebsiteAction extends ActionExecuterAbstractBase private DeploymentService deployService; private ContentService contentService; private NodeService nodeService; + private TransactionService transactionService; private static Log logger = LogFactory.getLog(AVMDeployWebsiteAction.class); private static Log delayDeploymentLogger = LogFactory.getLog("alfresco.deployment.delay"); @@ -467,14 +471,19 @@ public class AVMDeployWebsiteAction extends ActionExecuterAbstractBase * deployment was successful * @return The created deployment report NodeRef */ - private NodeRef createDeploymentReportNode(DeploymentReport report, NodeRef attempt, - Map serverProps, int version, NodeRef websiteRef, - Date startDate, Throwable error) + private NodeRef createDeploymentReportNode(final DeploymentReport report, + final NodeRef attempt, + final Map serverProps, + final int version, + final NodeRef websiteRef, + final Date startDate, + final Throwable error) { + logger.debug("createDeploymentReportNode called "); NodeRef reportRef = null; - String serverUri = calculateServerUri(serverProps); - Map reportProps = new HashMap(4, 1.0f); + final String serverUri = calculateServerUri(serverProps); + final Map reportProps = new HashMap(4, 1.0f); reportProps.put(WCMAppModel.PROP_DEPLOYSERVER, serverUri); reportProps.put(WCMAppModel.PROP_DEPLOYVERSION, version); reportProps.put(WCMAppModel.PROP_DEPLOYSTARTTIME, startDate); @@ -507,42 +516,58 @@ public class AVMDeployWebsiteAction extends ActionExecuterAbstractBase reportProps.put(WCMAppModel.PROP_DEPLOYFAILEDREASON, errorMsg); } - reportRef = this.nodeService.createNode(attempt, - WCMAppModel.ASSOC_DEPLOYMENTREPORTS, WCMAppModel.ASSOC_DEPLOYMENTREPORTS, - WCMAppModel.TYPE_DEPLOYMENTREPORT, reportProps).getChildRef(); - ContentWriter writer = contentService.getWriter(reportRef, ContentModel.PROP_CONTENT, true); - writer.setMimetype(MimetypeMap.MIMETYPE_TEXT_PLAIN); - writer.setEncoding("UTF-8"); - - if (report == null) + RetryingTransactionHelper tran = transactionService.getRetryingTransactionHelper(); + + RetryingTransactionCallback cb = new RetryingTransactionCallback() { - if (error == null) - { - writer.putContent(""); - } - else - { - // add the full stack trace of the error as the content - StringWriter stack = new StringWriter(); - PrintWriter stackPrint = new PrintWriter(stack); - error.printStackTrace(stackPrint); - writer.putContent(stack.toString()); - } - } - else - { - // TODO: revisit this, is it better to stream to a temp file? - StringBuilder builder = new StringBuilder(); - for (DeploymentEvent event : report) - { - builder.append(event.getType()); - builder.append(" "); - builder.append(event.getDestination()); - builder.append("\r\n"); - } + public NodeRef execute() throws Throwable + { + /** + * Write out the deployment report + */ + NodeRef reportRef = nodeService.createNode(attempt, + WCMAppModel.ASSOC_DEPLOYMENTREPORTS, WCMAppModel.ASSOC_DEPLOYMENTREPORTS, + WCMAppModel.TYPE_DEPLOYMENTREPORT, reportProps).getChildRef(); + ContentWriter writer = contentService.getWriter(reportRef, ContentModel.PROP_CONTENT, true); + writer.setMimetype(MimetypeMap.MIMETYPE_TEXT_PLAIN); + writer.setEncoding("UTF-8"); - writer.putContent(builder.toString()); - } + if (report == null) + { + if (error == null) + { + writer.putContent(""); + } + else + { + // add the full stack trace of the error as the content + StringWriter stack = new StringWriter(); + PrintWriter stackPrint = new PrintWriter(stack); + error.printStackTrace(stackPrint); + writer.putContent(stack.toString()); + } + } + else + { + // TODO: revisit this, is it better to stream to a temp file? + StringBuilder builder = new StringBuilder(); + for (DeploymentEvent event : report) + { + builder.append(event.getType()); + builder.append(" "); + builder.append(event.getDestination()); + builder.append("\r\n"); + } + + writer.putContent(builder.toString()); + } + + return reportRef; + } + }; + + // Run the creation of the deployment report in its own write transaction + reportRef = tran.doInTransaction(cb, false, true); if (logger.isDebugEnabled()) logger.debug("Created deplyoment report node (" + reportRef + ") for server " + @@ -550,4 +575,14 @@ public class AVMDeployWebsiteAction extends ActionExecuterAbstractBase return reportRef; } + + public void setTransactionService(TransactionService transactionService) + { + this.transactionService = transactionService; + } + + public TransactionService getTransactionService() + { + return transactionService; + } }