ALF-2314 - WCM Deployment: Deployment Report fails if deploying multiple targets (concurrently)

git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@19788 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
Mark Rogers
2010-04-09 10:21:52 +00:00
parent 4fdfac66da
commit 6c73c32893
2 changed files with 77 additions and 39 deletions

View File

@@ -650,6 +650,9 @@
<property name="deploymentService"> <property name="deploymentService">
<ref bean="DeploymentService"/> <ref bean="DeploymentService"/>
</property> </property>
<property name="transactionService">
<ref bean="TransactionService"/>
</property>
<property name="contentService"> <property name="contentService">
<ref bean="ContentService"/> <ref bean="ContentService"/>
</property> </property>

View File

@@ -34,6 +34,8 @@ import org.alfresco.repo.action.ParameterDefinitionImpl;
import org.alfresco.repo.action.executer.ActionExecuterAbstractBase; import org.alfresco.repo.action.executer.ActionExecuterAbstractBase;
import org.alfresco.repo.avm.AVMNodeConverter; import org.alfresco.repo.avm.AVMNodeConverter;
import org.alfresco.repo.content.MimetypeMap; 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.Action;
import org.alfresco.service.cmr.action.ParameterDefinition; import org.alfresco.service.cmr.action.ParameterDefinition;
import org.alfresco.service.cmr.avm.deploy.DeploymentCallback; 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.NodeRef;
import org.alfresco.service.cmr.repository.NodeService; import org.alfresco.service.cmr.repository.NodeService;
import org.alfresco.service.namespace.QName; import org.alfresco.service.namespace.QName;
import org.alfresco.service.transaction.TransactionService;
import org.alfresco.util.Pair; import org.alfresco.util.Pair;
import org.alfresco.util.RegexNameMatcher; import org.alfresco.util.RegexNameMatcher;
import org.apache.commons.logging.Log; import org.apache.commons.logging.Log;
@@ -85,6 +88,7 @@ public class AVMDeployWebsiteAction extends ActionExecuterAbstractBase
private DeploymentService deployService; private DeploymentService deployService;
private ContentService contentService; private ContentService contentService;
private NodeService nodeService; private NodeService nodeService;
private TransactionService transactionService;
private static Log logger = LogFactory.getLog(AVMDeployWebsiteAction.class); private static Log logger = LogFactory.getLog(AVMDeployWebsiteAction.class);
private static Log delayDeploymentLogger = LogFactory.getLog("alfresco.deployment.delay"); private static Log delayDeploymentLogger = LogFactory.getLog("alfresco.deployment.delay");
@@ -467,14 +471,19 @@ public class AVMDeployWebsiteAction extends ActionExecuterAbstractBase
* deployment was successful * deployment was successful
* @return The created deployment report NodeRef * @return The created deployment report NodeRef
*/ */
private NodeRef createDeploymentReportNode(DeploymentReport report, NodeRef attempt, private NodeRef createDeploymentReportNode(final DeploymentReport report,
Map<QName, Serializable> serverProps, int version, NodeRef websiteRef, final NodeRef attempt,
Date startDate, Throwable error) final Map<QName, Serializable> serverProps,
final int version,
final NodeRef websiteRef,
final Date startDate,
final Throwable error)
{ {
logger.debug("createDeploymentReportNode called ");
NodeRef reportRef = null; NodeRef reportRef = null;
String serverUri = calculateServerUri(serverProps); final String serverUri = calculateServerUri(serverProps);
Map<QName, Serializable> reportProps = new HashMap<QName, Serializable>(4, 1.0f); final Map<QName, Serializable> reportProps = new HashMap<QName, Serializable>(4, 1.0f);
reportProps.put(WCMAppModel.PROP_DEPLOYSERVER, serverUri); reportProps.put(WCMAppModel.PROP_DEPLOYSERVER, serverUri);
reportProps.put(WCMAppModel.PROP_DEPLOYVERSION, version); reportProps.put(WCMAppModel.PROP_DEPLOYVERSION, version);
reportProps.put(WCMAppModel.PROP_DEPLOYSTARTTIME, startDate); reportProps.put(WCMAppModel.PROP_DEPLOYSTARTTIME, startDate);
@@ -507,42 +516,58 @@ public class AVMDeployWebsiteAction extends ActionExecuterAbstractBase
reportProps.put(WCMAppModel.PROP_DEPLOYFAILEDREASON, errorMsg); reportProps.put(WCMAppModel.PROP_DEPLOYFAILEDREASON, errorMsg);
} }
reportRef = this.nodeService.createNode(attempt, RetryingTransactionHelper tran = transactionService.getRetryingTransactionHelper();
WCMAppModel.ASSOC_DEPLOYMENTREPORTS, WCMAppModel.ASSOC_DEPLOYMENTREPORTS,
WCMAppModel.TYPE_DEPLOYMENTREPORT, reportProps).getChildRef(); RetryingTransactionCallback<NodeRef> cb = new RetryingTransactionCallback<NodeRef>()
ContentWriter writer = contentService.getWriter(reportRef, ContentModel.PROP_CONTENT, true);
writer.setMimetype(MimetypeMap.MIMETYPE_TEXT_PLAIN);
writer.setEncoding("UTF-8");
if (report == null)
{ {
if (error == null) public NodeRef execute() throws Throwable
{ {
writer.putContent(""); /**
} * Write out the deployment report
else */
{ NodeRef reportRef = nodeService.createNode(attempt,
// add the full stack trace of the error as the content WCMAppModel.ASSOC_DEPLOYMENTREPORTS, WCMAppModel.ASSOC_DEPLOYMENTREPORTS,
StringWriter stack = new StringWriter(); WCMAppModel.TYPE_DEPLOYMENTREPORT, reportProps).getChildRef();
PrintWriter stackPrint = new PrintWriter(stack); ContentWriter writer = contentService.getWriter(reportRef, ContentModel.PROP_CONTENT, true);
error.printStackTrace(stackPrint); writer.setMimetype(MimetypeMap.MIMETYPE_TEXT_PLAIN);
writer.putContent(stack.toString()); writer.setEncoding("UTF-8");
}
}
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()); 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()) if (logger.isDebugEnabled())
logger.debug("Created deplyoment report node (" + reportRef + ") for server " + logger.debug("Created deplyoment report node (" + reportRef + ") for server " +
@@ -550,4 +575,14 @@ public class AVMDeployWebsiteAction extends ActionExecuterAbstractBase
return reportRef; return reportRef;
} }
public void setTransactionService(TransactionService transactionService)
{
this.transactionService = transactionService;
}
public TransactionService getTransactionService()
{
return transactionService;
}
} }