提交 47f70cf0 编写于 作者: M meyerd

Activiti Cycle: implemented "Overwrite technical model(s)" action

上级 92f0caca
package org.activiti.cycle;
/**
* {@link ParameterizedAction} allowing indicating whether it is applicable to a
* certain artifact via the {@link #isApplicable(RepositoryArtifact)}-method.
* <p/>
* TODO: merge into {@link ParameterizedAction} ?
*
* @author daniel.meyer@camunda.com
*/
public interface ArtifactAwareParameterizedAction extends ParameterizedAction {
/**
* returns true if the action is applicable to the provided
* {@link RepositoryArtifact}. return false otherwise.
*/
public boolean isApplicable(RepositoryArtifact toArtifact);
}
......@@ -29,5 +29,5 @@ public interface ParameterizedAction {
public String getFormAsHtml();
public void execute(RepositoryConnector connector, RepositoryArtifact artifact, Map<String, Object> parameters) throws Exception;
}
......@@ -27,4 +27,6 @@ public interface RepositoryArtifact extends RepositoryNode {
public List<RepositoryArtifactOpenLinkAction> getOpenLinkActions();
public List<ParameterizedAction> getParameterizedActions();
}
......@@ -28,6 +28,7 @@ public class CycleApplicationContext {
}
public static Object get(String key) {
// TODO: restore discarded or un-initialized instances.
return wrappedContext.get(key);
}
......
......@@ -12,9 +12,12 @@
*/
package org.activiti.cycle.impl;
import java.util.ArrayList;
import java.util.List;
import org.activiti.cycle.ArtifactAwareParameterizedAction;
import org.activiti.cycle.ArtifactType;
import org.activiti.cycle.ParameterizedAction;
import org.activiti.cycle.RepositoryArtifact;
import org.activiti.cycle.RepositoryArtifactOpenLinkAction;
import org.activiti.cycle.RepositoryConnector;
......@@ -44,7 +47,6 @@ public class RepositoryArtifactImpl extends RepositoryNodeImpl implements Reposi
+ getMetadata() + "]";
}
public ArtifactType getArtifactType() {
return artifactType;
}
......@@ -52,4 +54,21 @@ public class RepositoryArtifactImpl extends RepositoryNodeImpl implements Reposi
public List<RepositoryArtifactOpenLinkAction> getOpenLinkActions() {
return openLinkActions;
}
public List<ParameterizedAction> getParameterizedActions() {
List<ParameterizedAction> actions = getArtifactType().getParameterizedActions();
List<ParameterizedAction> filteredActions = new ArrayList<ParameterizedAction>();
// filter actions not applicable to this artifact.
for (ParameterizedAction parameterizedAction : actions) {
if (parameterizedAction instanceof ArtifactAwareParameterizedAction) {
ArtifactAwareParameterizedAction artifactAwareAction = (ArtifactAwareParameterizedAction) parameterizedAction;
if (artifactAwareAction.isApplicable(this)) {
filteredActions.add(parameterizedAction);
}
} else {
filteredActions.add(parameterizedAction);
}
}
return filteredActions;
}
}
......@@ -12,6 +12,7 @@ import org.activiti.cycle.impl.connector.signavio.action.CopySignavioModelAction
import org.activiti.cycle.impl.connector.signavio.action.CreateMavenProjectAction;
import org.activiti.cycle.impl.connector.signavio.action.CreateTechnicalBpmnXmlAction;
import org.activiti.cycle.impl.connector.signavio.action.OpenModelerAction;
import org.activiti.cycle.impl.connector.signavio.action.OverwriteTechnicalBpmnXmlAction;
import org.activiti.cycle.impl.connector.signavio.action.SelectDiffTargetAction;
import org.activiti.cycle.impl.connector.signavio.action.ValidateActivitiDeployment;
import org.activiti.cycle.impl.connector.signavio.provider.ActivitiCompliantBpmn20Provider;
......@@ -79,6 +80,7 @@ public class SignavioPluginDefinition implements ActivitiCyclePluginDefinition {
// new SignavioDiffProvider());
artifactType1.addParameterizedAction(new CreateTechnicalBpmnXmlAction());
artifactType1.addParameterizedAction(new OverwriteTechnicalBpmnXmlAction());
artifactType1.addParameterizedAction(new ValidateActivitiDeployment());
artifactType1.addParameterizedAction(new CopySignavioModelAction());
// artifactType1.addParameterizedAction(new SelectDiffTargetAction());
......
package org.activiti.cycle.impl.connector.signavio.action;
import org.activiti.cycle.Content;
import org.activiti.cycle.RepositoryArtifact;
import org.activiti.cycle.RepositoryConnector;
import org.activiti.cycle.impl.ParameterizedHtmlFormTemplateAction;
import org.activiti.cycle.impl.connector.signavio.provider.ActivitiCompliantBpmn20Provider;
import org.activiti.cycle.impl.db.entity.RepositoryArtifactLinkEntity;
/**
* Abstract base action for creating technical bpmn models.
*/
public abstract class AbstractTechnicalBpmnXmlAction extends ParameterizedHtmlFormTemplateAction {
private static final long serialVersionUID = 1L;
public AbstractTechnicalBpmnXmlAction(String name) {
super(name);
}
public String getLinkType() {
return RepositoryArtifactLinkEntity.TYPE_IMPLEMENTS;
}
public Content createContent(RepositoryConnector connector, RepositoryArtifact artifact) {
String bpmnXml = ActivitiCompliantBpmn20Provider.createBpmnXml(connector, artifact);
Content content = new Content();
content.setValue(bpmnXml);
return content;
}
public String getProcessName(RepositoryArtifact artifact) {
return artifact.getMetadata().getName();
}
@Override
public String getFormResourceName() {
return getDefaultFormName();
}
}
......@@ -23,7 +23,7 @@ import org.activiti.cycle.service.CycleServiceFactory;
*
* @author bernd.ruecker@camunda.com
*/
public class CreateTechnicalBpmnXmlAction extends ParameterizedHtmlFormTemplateAction {
public class CreateTechnicalBpmnXmlAction extends AbstractTechnicalBpmnXmlAction {
private static final long serialVersionUID = 1L;
......@@ -65,33 +65,18 @@ public class CreateTechnicalBpmnXmlAction extends ParameterizedHtmlFormTemplateA
repositoryService.addArtifactLink(link);
}
}
public String getLinkType() {
return RepositoryArtifactLinkEntity.TYPE_IMPLEMENTS;
}
public RepositoryArtifact createArtifact(RepositoryConnector connector, RepositoryArtifact artifact, String targetFolderId, String targetName,
public RepositoryArtifact createArtifact(RepositoryConnector sourceConnector, RepositoryArtifact sourceArtifact, String targetFolderId, String targetName,
RepositoryConnector targetConnector) throws Exception {
String bpmnXml = ActivitiCompliantBpmn20Provider.createBpmnXml(connector, artifact);
RepositoryArtifact targetArtifact = createTargetArtifact(targetConnector, targetFolderId, targetName + ".bpmn20.xml", bpmnXml,
FileSystemPluginDefinition.ARTIFACT_TYPE_BPMN_20_XML);
return targetArtifact;
}
public RepositoryArtifact createTargetArtifact(RepositoryConnector targetConnector, String targetFolderId, String artifactId, String bpmnXml,
String artifactTypeId) {
Content content = new Content();
content.setValue(bpmnXml);
return targetConnector.createArtifact(targetFolderId, artifactId, artifactTypeId, content);
}
public String getProcessName(RepositoryArtifact artifact) {
return artifact.getMetadata().getName();
}
String targetArtifactId = targetName + ".bpmn20.xml";
String targetArtifactTypeId = FileSystemPluginDefinition.ARTIFACT_TYPE_BPMN_20_XML;
Content content = createContent(sourceConnector, sourceArtifact);
@Override
public String getFormResourceName() {
return getDefaultFormName();
return targetConnector.createArtifact(targetFolderId, targetArtifactId, targetArtifactTypeId, content);
}
}
package org.activiti.cycle.impl.connector.signavio.action;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.activiti.cycle.ArtifactAwareParameterizedAction;
import org.activiti.cycle.Content;
import org.activiti.cycle.RepositoryArtifact;
import org.activiti.cycle.RepositoryArtifactLink;
import org.activiti.cycle.RepositoryConnector;
import org.activiti.cycle.RepositoryFolder;
import org.activiti.cycle.service.CycleRepositoryService;
import org.activiti.cycle.service.CycleServiceFactory;
/**
* This action creates a technical BPMN 2.0 XML for the process engines. It
* copies the XML from Signavio to a given {@link RepositoryFolder}.
*
* By doing that, registered plugins / transformations are executed. The link
* between the two {@link RepositoryArtifact}s is remembered (TODO).
*
* @author bernd.ruecker@camunda.com
*/
public class OverwriteTechnicalBpmnXmlAction extends AbstractTechnicalBpmnXmlAction implements ArtifactAwareParameterizedAction {
private static final long serialVersionUID = 1L;
public static final String PARAM_TARGET_FOLDER = "targetFolderId";
public static final String PARAM_TARGET_CONNECTOR = "targetConnectorId";
public static final String PARAM_TARGET_NAME = "targetName";
public static final String PARAM_COMMENT = "comment";
public static final String CREATE_LINK_NAME = "createLink";
public OverwriteTechnicalBpmnXmlAction() {
// TODO: remove when real labels are introduced in the GUI
super("Overwrite technical model(s)");
}
public OverwriteTechnicalBpmnXmlAction(String name) {
// TODO: remove when real labels are introduced in the GUI
super(name);
}
/**
* TODO: dedicated query? might be too in-efficient if we have a huge ammount
* of links...
*/
private List<RepositoryArtifactLink> getImplementationLinks(RepositoryArtifact forArtifact) {
CycleRepositoryService cycleRepositoryService = CycleServiceFactory.getRepositoryService();
List<RepositoryArtifactLink> links = cycleRepositoryService.getArtifactLinks(forArtifact.getConnectorId(), forArtifact.getNodeId());
List<RepositoryArtifactLink> implementationLinks = new ArrayList<RepositoryArtifactLink>();
for (RepositoryArtifactLink repositoryArtifactLink : links) {
if (!getLinkType().equals(repositoryArtifactLink.getLinkType())) {
continue;
}
implementationLinks.add(repositoryArtifactLink);
}
return implementationLinks;
}
public void execute(RepositoryConnector connector, RepositoryArtifact artifact, Map<String, Object> parameters) throws Exception {
List<RepositoryArtifactLink> implementations = getImplementationLinks(artifact);
for (RepositoryArtifactLink repositoryArtifactLink : implementations) {
RepositoryArtifact implementationArtifact = repositoryArtifactLink.getTargetArtifact();
if (implementationArtifact == null) {
throw new Exception("Cannot resolve artifact '" + repositoryArtifactLink.getTargetElementId() + "'. Corresponding connector not logged in?");
}
updateArtifact(connector, artifact, implementationArtifact.getNodeId(), implementationArtifact.getConnectorId());
}
}
private void updateArtifact(RepositoryConnector sourceConnector, RepositoryArtifact sourceArtifact, String targetNodeId, String targetConnectorId) {
CycleRepositoryService cycleRepositoryService = CycleServiceFactory.getRepositoryService();
Content content = createContent(sourceConnector, sourceArtifact);
cycleRepositoryService.updateContent(targetConnectorId, targetNodeId, content);
}
public boolean isApplicable(RepositoryArtifact toArtifact) {
return getImplementationLinks(toArtifact).size() > 0;
}
}
......@@ -76,11 +76,11 @@ public class SvnRepositoryConnector extends AbstractRepositoryConnector<SvnConne
static {
setupFactories();
}
public SvnRepositoryConnector() {
}
protected void validateConfig() {
String repositoryPath = getConfiguration().getRepositoryPath();
if (repositoryPath == null) {
......@@ -651,11 +651,15 @@ public class SvnRepositoryConnector extends AbstractRepositoryConnector<SvnConne
}
private void unlock() {
for (int i = 0; i < transactionLock.getHoldCount(); i++) {
transactionLock.unlock();
// TODO: <!> hack, find a better way to do this properly:
while (true) {
try {
transactionLock.unlock();
} catch (Exception e) {
break;
}
}
}
public void beginTransaction() {
// do not autocommit on transactions coming in via the public API.
beginTransaction(false);
......
<h1>Overwrite Technical Model(s)</h1>
This action overwrites all technical models linked to this model. <br />
Warning: changes made to the technical models will be lost.
<input type="hidden" name="test" value="" />
......@@ -54,7 +54,7 @@ public class ArtifactGet extends ActivitiCycleWebScript {
model.put("contentRepresentations", contentRepresentations);
model.put("actions", artifact.getArtifactType().getParameterizedActions());
model.put("actions", artifact.getParameterizedActions());
// Create downloadContentView DTOs
List<DownloadActionView> downloads = new ArrayList<DownloadActionView>();
......
......@@ -19,6 +19,10 @@ public class ConnectorLoginRequestFilter implements CycleRequestFilter {
return;
String connectorId = (String) connectorIdObject;
if(connectorId.length() == 0)
return;
// read credentials from request
String username = req.getString(connectorId + "_username");
String password = req.getString(connectorId + "_password");
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册