提交 ed24740e 编写于 作者: M meyerd

Activiti Cycle: partial rewrite of the SignavioSvgApiBuilder infrastructure....

Activiti Cycle: partial rewrite of the SignavioSvgApiBuilder infrastructure. The builder is now aware of different types of nodes and highlight types.
上级 e93282c9
......@@ -11,6 +11,9 @@ import org.activiti.cycle.RepositoryException;
import org.activiti.cycle.impl.connector.signavio.SignavioConnector;
import org.activiti.cycle.impl.connector.signavio.SignavioPluginDefinition;
import org.activiti.cycle.impl.connector.signavio.util.SignavioSvgApiBuilder;
import org.activiti.cycle.impl.connector.signavio.util.SignavioSvgHighlight;
import org.activiti.cycle.impl.connector.signavio.util.SignavioSvgHighlightType;
import org.activiti.cycle.impl.connector.signavio.util.SignavioSvgNodeType;
import org.oryxeditor.server.diagram.Diagram;
import org.oryxeditor.server.diagram.DiagramBuilder;
import org.oryxeditor.server.diagram.Shape;
......@@ -36,17 +39,17 @@ public class SignavioDiffProvider extends SignavioContentRepresentationProvider
diffTarget = artifact;
}
Map<String, List<String>> missingSourceElements = new HashMap<String, List<String>>();
Map<String, List<String>> missingTargetElements = new HashMap<String, List<String>>();
List<SignavioSvgHighlight> missingSourceElements = new ArrayList<SignavioSvgHighlight>();
List<SignavioSvgHighlight> missingTargetElements = new ArrayList<SignavioSvgHighlight>();
// create DIFF
String sourceJson = connector.getContent(artifact.getNodeId(), SignavioPluginDefinition.CONTENT_REPRESENTATION_ID_JSON).asString();
String targetJson = connector.getContent(diffTarget.getNodeId(), SignavioPluginDefinition.CONTENT_REPRESENTATION_ID_JSON).asString();
try {
Diagram sourceDiagram = DiagramBuilder.parseJson(sourceJson);
Diagram targetDiagram = DiagramBuilder.parseJson(targetJson);
// First quick HACKY way to find missing elements on the top level
for (Shape sourceShape : sourceDiagram.getShapes()) {
String sourceId = sourceShape.getResourceId();
......@@ -58,10 +61,8 @@ public class SignavioDiffProvider extends SignavioContentRepresentationProvider
}
}
if (!existant) {
// add to missing nodes in target artifact
ArrayList<String> messages = new ArrayList<String>();
messages.add("MISSING");
missingSourceElements.put(sourceId, messages);
// add to missing nodes in target artifact
missingSourceElements.add(new SignavioSvgHighlight(SignavioSvgNodeType.NODE, SignavioSvgHighlightType.INFO, sourceId, "MISSING"));
}
}
for (Shape targetShape : targetDiagram.getShapes()) {
......@@ -74,10 +75,8 @@ public class SignavioDiffProvider extends SignavioContentRepresentationProvider
}
}
if (!existant) {
// add to missing nodes in target artifact
ArrayList<String> messages = new ArrayList<String>();
messages.add("MISSING");
missingTargetElements.put(targetId, messages);
// add to missing nodes in target artifact
missingTargetElements.add(new SignavioSvgHighlight(SignavioSvgNodeType.NODE, SignavioSvgHighlightType.INFO, targetId, "MISSING"));
}
}
} catch (Exception e) {
......@@ -85,20 +84,20 @@ public class SignavioDiffProvider extends SignavioContentRepresentationProvider
}
// and create resulting HTML
String script1 = new SignavioSvgApiBuilder(connector, artifact).highlightNodes(missingSourceElements, INFO_COLOR).buildScript(75);
String script2 = new SignavioSvgApiBuilder(connector, diffTarget).highlightNodes(missingTargetElements, INFO_COLOR).buildScript(75);
String script1 = new SignavioSvgApiBuilder(connector, artifact).highlightNodes(missingSourceElements).buildScript(75);
String script2 = new SignavioSvgApiBuilder(connector, diffTarget).highlightNodes(missingTargetElements).buildScript(75);
Integer height = 200;
String htmlContent = "<p><b>Expertimental</b> feature to play around with Signavio diffing.<br/>Currently, showing diff against artifact "
+ diffTarget.getGlobalUniqueId() + ".<br/>Use the Actions menu to select another diff target.</p>";
String additionalContent = "<p>Changes from " + diffTarget.getMetadata().getName() + " in " + artifact.getMetadata().getName();
additionalContent += "<div id=\"model1\" style=\"height: " + height + "px;\">" + script1 + "</div>";
additionalContent += "Changes from " + artifact.getMetadata().getName() + " in " + diffTarget.getMetadata().getName();
additionalContent += "<div id=\"model2\" style=\"height: " + height + "px;\">" + script2 + "</div>";
String html = SignavioSvgApiBuilder.buildHtml(htmlContent, additionalContent);
String html = new SignavioSvgApiBuilder(connector, artifact).buildHtml(htmlContent, additionalContent);
content.setValue(html);
}
}
package org.activiti.cycle.impl.connector.signavio.util;
import java.io.StringWriter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.SortedMap;
import java.util.TreeMap;
import java.util.Map.Entry;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
/**
* Performs highlighting of nodes depending on {@link SignavioSvgHighlightType}
* and {@link SignavioSvgNodeType}. Configure the highlighter using
* {@link #setHighlightColor(SignavioSvgHighlightType, String)}.
*
* @author daniel.meyer@camunda.com
*/
public class SignavioModelHighlighter {
Logger log = Logger.getLogger(SignavioModelHighlighter.class.getName());
public SortedMap<SignavioSvgHighlightType, Set<SignavioSvgHighlight>> highlights = new TreeMap<SignavioSvgHighlightType, Set<SignavioSvgHighlight>>(
new SignavioSvgHighlightTypeComparator());
public Map<SignavioSvgHighlightType, String> highlightColorMap = new HashMap<SignavioSvgHighlightType, String>();
public void setHighlightColor(SignavioSvgHighlightType type, String color) {
highlightColorMap.put(type, color);
}
public String getHighlightColor(SignavioSvgHighlightType type) {
return highlightColorMap.get(type);
}
public SignavioModelHighlighter() {
init();
}
private void init() {
// set default colors:
highlightColorMap.put(SignavioSvgHighlightType.ERROR, "red");
highlightColorMap.put(SignavioSvgHighlightType.INFO, "grey");
highlightColorMap.put(SignavioSvgHighlightType.WARNING, "#FFE736");
}
public void addHighlight(SignavioSvgHighlight highlight) {
Set<SignavioSvgHighlight> highlightset = highlights.get(highlight.getHighlightType());
if (highlightset == null) {
highlightset = new HashSet<SignavioSvgHighlight>();
highlights.put(highlight.getHighlightType(), highlightset);
}
highlightset.add(highlight);
}
public void participateInBuilder(StringWriter writer) {
if (highlights.size() == 0) {
writer.write("");
}
JSONArray focusArr = new JSONArray();
for (Entry<SignavioSvgHighlightType, Set<SignavioSvgHighlight>> highlightset : highlights.entrySet()) {
for (Object obj : doHighlighting(highlightset.getValue(), highlightset.getKey())) {
focusArr.put(obj);
}
}
if (focusArr.length() > 0) {
String clickFunction = createClickFunction();
if (clickFunction != null) {
writer.write(" click: " + clickFunction + ",");
}
writer.write(" focus: " + focusArr.toString());
}
}
private Object[] doHighlighting(Set<SignavioSvgHighlight> highlightset, SignavioSvgHighlightType highlightType) {
Set<String> containers = new HashSet<String>();
Set<String> nodes = new HashSet<String>();
Set<String> connectors = new HashSet<String>();
for (SignavioSvgHighlight signavioSvgHighlight : highlightset) {
if (SignavioSvgNodeType.CONTAINER.equals(signavioSvgHighlight.getNodeType())) {
containers.add(signavioSvgHighlight.getNodeId());
continue;
}
if (SignavioSvgNodeType.CONNECTOR.equals(signavioSvgHighlight.getNodeType())) {
connectors.add(signavioSvgHighlight.getNodeId());
continue;
}
if (SignavioSvgNodeType.NODE.equals(signavioSvgHighlight.getNodeType())) {
nodes.add(signavioSvgHighlight.getNodeId());
continue;
}
}
List<Object> result = new ArrayList<Object>();
if (containers.size() > 0) {
for (String containerId : containers) {
result.add(containerId);
}
}
try {
if (nodes.size() > 0) {
JSONObject obj = new JSONObject();
obj.put("nodes", nodes);
JSONObject attributes = new JSONObject();
attributes.put("fill", highlightColorMap.get(highlightType));
obj.put("attributes", attributes);
result.add(obj);
}
} catch (JSONException e) {
log.log(Level.WARNING, e.getMessage(), e);
}
try {
if (connectors.size() > 0) {
JSONObject obj = new JSONObject();
obj.put("nodes", connectors);
JSONObject attributes = new JSONObject();
attributes.put("stroke", highlightColorMap.get(highlightType));
obj.put("attributes", attributes);
result.add(obj);
}
} catch (JSONException e) {
log.log(Level.WARNING, e.getMessage(), e);
}
return result.toArray(new Object[0]);
}
private String createClickFunction() {
try {
StringBuilder clickFunc = new StringBuilder();
clickFunc.append("function(node, editor) {");
// create default click function
clickFunc.append("var errorMessages = " + createJsonMessagesObject() + ";");
clickFunc.append("var myNodeMessages = errorMessages[node.resourceId];");
clickFunc.append("if (myNodeMessages != '' && myNodeMessages != 'undefined' && myNodeMessages != undefined) {");
clickFunc.append("var myNodeMessagesStr = \"\";");
clickFunc.append("for (msg in myNodeMessages) {");
clickFunc.append("myNodeMessagesStr += myNodeMessages[msg] + \"\\n\";");
clickFunc.append("}");
clickFunc.append("alert(\"Sid: \" + node.resourceId + \"\\nErrorMessages: \" + myNodeMessagesStr);");
clickFunc.append("}");
// clickFunc.append("var errorMessages = " + createJsonMessagesObject() +
// ";");
// clickFunc.append("if(node.properties[\"oryx-name\"] || node.properties[\"oryx-title\"] || node.resourceId) {");
// clickFunc.append("alert(\"Name: \" + node.properties[\"oryx-name\"] + \" (Sid: \" + node.resourceId + \")\");");
// clickFunc.append("}");
clickFunc.append("}");
return clickFunc.toString();
} catch (JSONException e) {
log.log(Level.WARNING, e.getMessage(), e);
return null;
}
}
private String createJsonMessagesObject() throws JSONException {
if (highlights.isEmpty()) {
return "\"\"";
}
Map<String, List<String>> messageMap = new HashMap<String, List<String>>();
JSONObject jsonMessageObj = new JSONObject();
// collect all messages per node.
for (Entry<SignavioSvgHighlightType, Set<SignavioSvgHighlight>> entry : highlights.entrySet()) {
for (SignavioSvgHighlight highlight : entry.getValue()) {
List<String> messagesForThisNode = messageMap.get(highlight.getNodeId());
if (messagesForThisNode == null) {
messagesForThisNode = new ArrayList<String>();
messageMap.put(highlight.getNodeId(), messagesForThisNode);
}
messagesForThisNode.add(highlight.getMessage());
}
}
// build message element
for (Entry<String, List<String>> messageEnty : messageMap.entrySet()) {
jsonMessageObj.put(messageEnty.getKey(), messageEnty.getValue());
}
return jsonMessageObj.toString();
}
}
package org.activiti.cycle.impl.connector.signavio.util;
import java.util.ArrayList;
import java.util.Comparator;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.StringWriter;
import java.nio.charset.Charset;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.TreeMap;
import org.activiti.cycle.RepositoryArtifact;
import org.activiti.cycle.RepositoryException;
import org.activiti.cycle.impl.connector.signavio.SignavioConnector;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
public class SignavioSvgApiBuilder {
public static final String HEADER = "<html><head><link href=\"../../res/css/activiti-core.css\" type=\"text/css\" rel=\"stylesheet\"></head><body>";
public static final String FOOTER = "</body></html>";
// public static final String SVGAPI_URL_REMOTE =
// "http://signavio-core-components.googlecode.com/svn/trunk/api/api/signavio-svg.js";
// TODO: Should that be configurable and point to a SaaS Signavio if that is
// used? Or is the local URL the best?
public static String SIGNAVIO_SVG_API_SCRIPT_TEMPLATE = "SignavioSvgApiScriptTemplate.xml";
public static String SIGNAVIO_SVG_API_HTML_TEMPLATE = "SignavioSvgApiHtmlTemplate.xml";
// TODO: fix absolute paths
public static final String SVGAPI_URL_LOCAL = "http://localhost:8080/activiti-modeler/api/signavio-svg.js";
// maybe make this changable?
// TODO: fix absolute paths
public static final String SERVER_SCRIPT_URL = "http://localhost:8080/activiti-modeler";
private SignavioConnector connector;
private RepositoryArtifact artifact;
private String authToken;
private String clickFunction;
private SignavioModelHighlighter modelHighlighter = new SignavioModelHighlighter();
// TODO: Remove the hard coded urls anyway!
private boolean useLocalScripts = true;
private static String svgApiScript = "";
private String htmlContent = "";
/**
* Map mapping a color for highlighting with a {@link Map} of node (ids) with
* messages to show
*/
private Map<String, Map<String, List<String>>> nodesToHighlight = new TreeMap<String, Map<String, List<String>>>(new Comparator<String>() {
private String zoomLevel = "100";
public int compare(String o1, String o2) {
if (!o1.equals("red"))
return -1;
if (o1.equals(o2))
return 0;
return 1;
}
});
private String script;
/**
* Constructor to create a SignavioSvgApiBuilder object.
*
* @param connector
* required for constructing correct model url
* @param artifact
* required for constructing correct model url
*/
public SignavioSvgApiBuilder(SignavioConnector connector, RepositoryArtifact artifact) {
this.connector = connector;
this.artifact = artifact;
}
/**
* Submit a map containing the nodes to be highlighted and in which color.
* Key: Signavio ID, Value: Message to show
*/
public SignavioSvgApiBuilder highlightNodes(Map<String, List<String>> nodes, String color) {
nodesToHighlight.put(color, nodes);
return this;
public String buildHtml(String script, String htmlContent) {
this.script = script;
this.htmlContent = htmlContent;
return buildHtml();
}
/**
* Maybe required to get access to models in saas/enterprise signavio.
*
* @param authToken
* authtoken for saas / enterprise signavio
*/
public SignavioSvgApiBuilder authToken(String authToken) {
this.authToken = authToken;
return this;
}
public String buildHtml() {
// load template
String template = loadTemplate(SIGNAVIO_SVG_API_HTML_TEMPLATE);
if (template == null)
return "";
/**
* A javascript function submitted as string. You have the javascript
* variables 'node' and 'editor' to your disposal.
*
* @param clickFunction
* a string representation of a javascript function, e.g.
* 'if(node.properties["oryx-name"]||node.properties["oryx-title"]) {
* alert("Name: " + node.properties["oryx-name"] + "\n(Sid: " +
* node.resourceId + ")"); };'
* @return
*/
public SignavioSvgApiBuilder clickFunction(String clickFunction) {
this.clickFunction = clickFunction;
return this;
}
// add script
template = template.replace("SCRIPT", buildScript());
public SignavioSvgApiBuilder useLocalScripts(boolean useLocalScripts) {
this.useLocalScripts = useLocalScripts;
return this;
}
// add additional HTML content:
template = template.replaceAll("HTML_CONTENT", htmlContent);
/**
* use buildHtml instead
*
* @throws JSONException
*/
@Deprecated
public String build() {
return buildHtml();
return template;
}
public String buildHtml() {
return buildHtml(buildScript(), null);
public String buildScript(int zoomLevel) {
this.zoomLevel = String.valueOf(zoomLevel);
return buildScript();
}
public static String buildHtml(String content) {
return buildHtml(content, null);
}
public String buildScript() {
if (script != null)
return script;
public static String buildHtml(String content, String additionalContent) {
if (additionalContent == null) {
additionalContent = "";
}
return HEADER + "<div id=\"model\">" + content + "</div>" + additionalContent + svgApiScript + FOOTER;
}
String template = loadTemplate(SIGNAVIO_SVG_API_SCRIPT_TEMPLATE);
if (template == null)
return "";
// set properties
template = template.replaceAll("SIGNAVIO_EDITOR_SRC", SVGAPI_URL_LOCAL);
template = template.replaceAll("SIGNAVIO_MODEL_URL", connector.getConfiguration().getModelUrl(artifact.getNodeId()));
template = template.replaceAll("SIGNAVIO_SERVER_URL", connector.getConfiguration().getSignavioUrl());
template = template.replaceAll("SIGNAVIO_ZOOM", zoomLevel);
public static String buildHtml(String content, String additionalContent, int height) {
if (additionalContent == null) {
additionalContent = "";
}
return HEADER + "<div id=\"model\" style=\"height: " + height + "px;\">" + content + "</div>" + additionalContent + svgApiScript + FOOTER;
}
// build highlights:
StringWriter extensionsWriter = new StringWriter();
modelHighlighter.participateInBuilder(extensionsWriter);
template = template.replaceAll("HIGHLIGHTS", extensionsWriter.toString());
public String buildScript() {
return buildScript(100);
return template;
}
public String buildScript(Integer zoom) {
private String loadTemplate(String template) {
BufferedReader reader = null;
try {
StringBuilder svgApiScriptBuilder = new StringBuilder();
svgApiScriptBuilder.append("<script type=\"text/javascript\" src=\"");
// if (useLocalScripts) {
svgApiScriptBuilder.append(SVGAPI_URL_LOCAL);
// } else {
// svgApiScriptBuilder.append(SVGAPI_URL_REMOTE);
// }
svgApiScriptBuilder.append("\"></script>");
svgApiScript = svgApiScriptBuilder.toString();
StringBuilder svgApiCall = new StringBuilder();
svgApiCall.append("<script type=\"text/plain\">");
svgApiCall.append("{");
svgApiCall.append("url: \"" + connector.getConfiguration().getModelUrl(artifact.getNodeId()) + "\"");
if (useLocalScripts) {
// url to svgapi script
svgApiCall.append(", server: \"" + connector.getConfiguration().getSignavioUrl() + "\"");
InputStream is = this.getClass().getResourceAsStream(template);
reader = new BufferedReader(new InputStreamReader(is, Charset.forName("UTF-8")));
StringWriter resultWriter = new StringWriter();
String line;
while ((line = reader.readLine()) != null) {
resultWriter.append(line);
}
reader.close();
return resultWriter.toString();
} catch (IOException e) {
if (reader == null)
return null;
try {
reader.close();
} catch (IOException ex) {
svgApiCall.append(", element: \"model\"");
// if authToken is available
if (authToken != null && authToken.length() > 0) {
svgApiCall.append(", authToken: \"" + authToken + "\",");
}
// register mouseover event on callback function
// svgApiCall.append(", callback: " + registerMouseOverEvent());
// executed when click on a shape
svgApiCall.append(", click: " + createClickFunction());
// highlight nodes
svgApiCall.append(", focus: " + buildHighlightning());
// initial zoom
svgApiCall.append(", zoom: " + zoom);
svgApiCall.append("}");
svgApiCall.append("</script>");
return svgApiCall.toString();
} catch (JSONException ex) {
throw new RepositoryException("Unexpected exception with JSON handling for " + artifact, ex);
return null;
}
}
......@@ -218,119 +136,21 @@ public class SignavioSvgApiBuilder {
return html.toString();
}
private String registerMouseOverEvent() throws JSONException {
if (nodesToHighlight == null || nodesToHighlight.isEmpty()) {
return "function(editor) {}";
}
StringBuilder callbackFunc = new StringBuilder();
callbackFunc.append("function(editor) {");
callbackFunc.append("editor.registerOnEvent(\"mouseover\", function(evt, node) {");
callbackFunc.append("var errorMessages = " + createJsonMessagesObject() + ";");
callbackFunc.append("var myNodeMessages = errorMessages[node.resourceId];");
callbackFunc.append("if (myNodeMessages != '' && myNodeMessages != 'undefined' && myNodeMessages != undefined) {");
callbackFunc.append("var myNodeMessagesStr = \"\";");
callbackFunc.append("for (msg in myNodeMessages) {");
callbackFunc.append("myNodeMessagesStr += myNodeMessages[msg] + \"\\n\";");
callbackFunc.append("}");
callbackFunc.append("alert(\"Sid: \" + node.resourceId + \"\\nMessages: \" + myNodeMessagesStr);");
callbackFunc.append("}");
// @TODO: doesn't work atm, unable to get variable 'me'
// callbackFunc.append("if (node instanceof me.ORYX.Core.Shape) {");
// callbackFunc.append("}");
callbackFunc.append("});");
callbackFunc.append("}");
return callbackFunc.toString();
}
private String createClickFunction() throws JSONException {
StringBuilder clickFunc = new StringBuilder();
clickFunc.append("function(node, editor) {");
if (clickFunction != null && clickFunction.length() > 0) {
clickFunc.append(clickFunction);
} else {
// create default click function
clickFunc.append("var errorMessages = " + createJsonMessagesObject() + ";");
clickFunc.append("var myNodeMessages = errorMessages[node.resourceId];");
clickFunc.append("if (myNodeMessages != '' && myNodeMessages != 'undefined' && myNodeMessages != undefined) {");
clickFunc.append("var myNodeMessagesStr = \"\";");
clickFunc.append("for (msg in myNodeMessages) {");
clickFunc.append("myNodeMessagesStr += myNodeMessages[msg] + \"\\n\";");
clickFunc.append("}");
clickFunc.append("alert(\"Sid: \" + node.resourceId + \"\\nErrorMessages: \" + myNodeMessagesStr);");
clickFunc.append("}");
// clickFunc.append("var errorMessages = " + createJsonMessagesObject() +
// ";");
// clickFunc.append("if(node.properties[\"oryx-name\"] || node.properties[\"oryx-title\"] || node.resourceId) {");
// clickFunc.append("alert(\"Name: \" + node.properties[\"oryx-name\"] + \" (Sid: \" + node.resourceId + \")\");");
// clickFunc.append("}");
}
clickFunc.append("}");
return clickFunc.toString();
}
private JSONObject highlightNodesMap(String color, Map<String, List<String>> map) throws JSONException {
if (map == null || map.isEmpty()) {
return null;
}
// set default color if not provided
if (color == null || color.length() == 0) {
color = "red";
}
// hack for making sure that lanes do not 'overlap' everything else
JSONObject highlightNodesObj = new JSONObject();
List<String> lanes = new ArrayList<String>();
for (Entry<String, List<String>> entry : map.entrySet()) {
for (String name : entry.getValue()) {
if (name.toLowerCase().contains("lane"))
lanes.add(entry.getKey());
}
}
for (String string : lanes) {
map.remove(string);
}
highlightNodesObj.put("nodes", map.keySet());
JSONObject attributes = new JSONObject();
attributes.put("fill", color);
highlightNodesObj.put("attributes", attributes);
return highlightNodesObj;
public SignavioSvgApiBuilder addHighlight(SignavioSvgHighlight highlight) {
modelHighlighter.addHighlight(highlight);
return this;
}
private String buildHighlightning() throws JSONException {
if (nodesToHighlight == null || nodesToHighlight.isEmpty()) {
return "[]";
}
JSONArray focusArr = new JSONArray();
for (Entry<String, Map<String, List<String>>> entry : nodesToHighlight.entrySet()) {
Map<String, List<String>> value = (Map<String, List<String>>) entry.getValue();
if (!value.isEmpty()) {
focusArr.put(highlightNodesMap((String) entry.getKey(), value));
}
}
return focusArr.toString();
public SignavioSvgApiBuilder addHtmlContent(String additionalContent) {
htmlContent = additionalContent;
return this;
}
private String createJsonMessagesObject() throws JSONException {
if (nodesToHighlight == null || nodesToHighlight.isEmpty()) {
return "\"\"";
public SignavioSvgApiBuilder highlightNodes(List<SignavioSvgHighlight> nodes) {
for (SignavioSvgHighlight signavioSvgHighlight : nodes) {
addHighlight(signavioSvgHighlight);
}
JSONObject jsonMessageObj = new JSONObject();
for (Entry<String, Map<String, List<String>>> entry : nodesToHighlight.entrySet()) {
for (Entry<String, List<String>> mapEntry : entry.getValue().entrySet()) {
jsonMessageObj.put(mapEntry.getKey(), mapEntry.getValue());
}
}
return jsonMessageObj.toString();
return this;
}
}
\ No newline at end of file
package org.activiti.cycle.impl.connector.signavio.util;
public class SignavioSvgHighlight {
private final SignavioSvgNodeType nodeType;
private final SignavioSvgHighlightType highlightType;
private final String nodeId;
private final String message;
public SignavioSvgHighlight(SignavioSvgNodeType nodeType, SignavioSvgHighlightType highlightType, String nodeId, String message) {
this.nodeType = nodeType;
this.highlightType = highlightType;
this.nodeId = nodeId;
this.message = message;
}
public SignavioSvgNodeType getNodeType() {
return nodeType;
}
public SignavioSvgHighlightType getHighlightType() {
return highlightType;
}
public String getNodeId() {
return nodeId;
}
public String getMessage() {
return message;
}
}
package org.activiti.cycle.impl.connector.signavio.util;
public enum SignavioSvgHighlightType {
INFO, WARNING, ERROR
}
package org.activiti.cycle.impl.connector.signavio.util;
import java.util.Comparator;
public class SignavioSvgHighlightTypeComparator implements Comparator<SignavioSvgHighlightType> {
public int compare(SignavioSvgHighlightType o1, SignavioSvgHighlightType o2) {
if (o1.equals(o2))
return 0;
switch (o1) {
case INFO:
return -1;
case WARNING:
return 0;
case ERROR:
return 1;
default:
return 0;
}
}
}
\ No newline at end of file
package org.activiti.cycle.impl.connector.signavio.util;
/**
* NodeTypes used for Node-highlighting in Svg.
*
* @author daniel.meyer@camunda.com
*/
public enum SignavioSvgNodeType {
CONTAINER, CONNECTOR, NODE;
}
......@@ -24,7 +24,7 @@ import org.activiti.cycle.impl.conf.RepositoryConnectorConfiguration;
* String-based interface.
* <p />
* Retreive an instance of this Service by
* {@link CycleService#getConfigurationService()}
* {@link CycleServiceFactory#getConfigurationService()}
*
* @see CycleService
* @author daniel.meyer@camunda.com
......
......@@ -30,12 +30,11 @@ import org.activiti.cycle.RepositoryNodeNotFoundException;
* Cycle service used for accessing repositories.
* <p />
* Get an instance of this service by
* {@link CycleService#getRepositoryService()}
* {@link CycleServiceFactory#getRepositoryService()}
*
* @see CycleService
*/
public interface CycleRepositoryService {
public static class RuntimeConnectorList implements Serializable {
private static final long serialVersionUID = 1L;
......
......@@ -20,7 +20,7 @@ import org.activiti.cycle.RepositoryNodeTag;
/**
* Cycle service used for managing tags.
* <p />
* Get an instance of this service by {@link CycleService#getCycleTagService()}
* Get an instance of this service by {@link CycleServiceFactory#getCycleTagService()}
*
* @see CycleService
*/
......
<html><head><link href="../../res/css/activiti-core.css" type="text/css" rel="stylesheet" /></head><body>
<div id="model">
SCRIPT
</div>
HTML_CONTENT
</body></html>
\ No newline at end of file
<script type="text/javascript" src="SIGNAVIO_EDITOR_SRC">
</script>
<script type="text/plain">
{
url: "SIGNAVIO_MODEL_URL",
server: "SIGNAVIO_SERVER_URL",
zoom: SIGNAVIO_ZOOM,
HIGHLIGHTS
}
</script>
\ No newline at end of file
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册