/******************************************************************************* * Copyright (c) 2008 Red Hat, Inc. * Distributed under license by Red Hat, Inc. All rights reserved. * This program is made available under the terms of the * Eclipse Public License v1.0 which accompanies this distribution, * and is available at http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Red Hat, Inc. - initial API and implementation ******************************************************************************/ package org.jboss.tools.jbpm.convert.b2j.translate; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.dom4j.Document; import org.dom4j.Element; import org.jboss.tools.jbpm.convert.bpmnto.util.BPMNToUtil; import org.jboss.tools.jbpm.convert.bpmnto.util.DomXmlWriter; /** * @author Grid Qian * * this is a helper class for bpmn ->jpdl */ public class TranslateHelper { // the map for the bpmn element id : the corresponding generated element static Map<String, Integer> nameMap = new HashMap<String, Integer>(); public static void setNameMap(Map<String, Integer> nameMap) { TranslateHelper.nameMap = nameMap; } /* * get the bpmn_diagram file name */ public static String getBpmnDiagramName(String bpmnFileName) { return bpmnFileName + Constants.Bpmn_Diagram_Name_Suffix; } /* * create a jpdl dom tree */ public static Document createJpdlDomTree(boolean useNamespace) { return DomXmlWriter.createDomTree(useNamespace, Constants.Jpdl_32_Namespace_Url, Constants.Jpdl_Process_Definition_Element_Name); } /* * create translated files from dom strings */ public static File[] createFiles(String parentFolder, String bpmnFileName, String[] strsForGenerate, String[] fileFolders, String fileName, boolean isOverWrite) throws IOException { File jpdlFolder = BPMNToUtil.createFile(parentFolder, Constants.Jpdl_Suffix, null, isOverWrite); File diagramFolder = BPMNToUtil.createFile( jpdlFolder.getAbsolutePath(), bpmnFileName, null, false); File[] files = new File[strsForGenerate.length]; File processFolder = null; int i = 0; for (String str : strsForGenerate) { processFolder = BPMNToUtil.createFile(diagramFolder .getAbsolutePath(), fileFolders[i], null, false); files[i] = BPMNToUtil.createFile(processFolder.getAbsolutePath(), fileName, str, false); i++; } return files; } /* * generate a process definition name. the name is composed of the names * from bpmn diagram to the element */ public static String generateProcessName(Element graph) { if ("BpmnDiagram".equals(graph.getName())) { return graph.attributeValue(Constants.Dom_Element_Name); } else { String str = generateProcessName(graph.getParent()); if (str == null) { return generateElementName(graph); } else { return str + Constants.Folder_Name_Separator + generateElementName(graph); } } } /* * generate a element name */ public static String generateElementName(Element graph) { String name = graph.attributeValue(Constants.Dom_Element_Name); if (name == null || "".equals(name)) { name = "eleName"; } Integer i = nameMap.get(name); if (i == null) { nameMap.put(name, new Integer("1")); } else { nameMap.put(name, ++i); } return name; } /* * check the bpmn element name is null or "" or same to another element name * and generate a different name */ public static boolean check_mapElementName(Element graph, Element graphEle, boolean isTransition) { boolean isOk = true; String name = graph.attributeValue(Constants.Dom_Element_Name); if (name == null || "".equals(name)) { if (isTransition) { name = Constants.To + Constants.Underline + graphEle.attributeValue(Constants.To); } else { name = "eleName"; } isOk = false; } Integer i = nameMap.get(name); if (i == null) { DomXmlWriter.addAttribute(graphEle, Constants.Dom_Element_Name, name); nameMap.put(name, new Integer("1")); } else { DomXmlWriter.addAttribute(graphEle, Constants.Dom_Element_Name, name + "_" + i); nameMap.put(name, ++i); isOk = false; } return isOk; } /* * select the elements from process. These elements have no transitions sub * element or have transitions to end-state. */ public static List<Element> locateLastElements(Element processRoot) { List<Element> list = new ArrayList<Element>(); if (processRoot.element(Constants.Jpdl_End_Element_Name) != null) { Element endState = processRoot .element(Constants.Jpdl_End_Element_Name); for (Object ele : processRoot.elements()) { Element subEle = ((Element) ele) .element(Constants.Jpdl_Transition_Element); if (subEle != null && endState.attributeValue(Constants.Dom_Element_Name) .equals(subEle.attributeValue(Constants.To))) { list.add((Element) ele); } } } else { for (Object ele : processRoot.elements()) { if (((Element) ele).element(Constants.Jpdl_Transition_Element) == null) { list.add((Element) ele); } } } return list; } /* * get the layout element from bpmn_diagram file by id */ public static Element getDiagramLayoutElement(String bpmnID, List<Element> eleList) { Element element = null; for (Element ele : eleList) { String str = ele.attributeValue(Constants.Bpmn_Href_Attribute_Name); if (str != null && str.contains(bpmnID)) { element = ele; break; } } if (element != null && element.getParent().element( Constants.Gpd_Layout_Element_Name) != null) { return element.getParent().element( Constants.Gpd_Layout_Element_Name); } return null; } /* * create a graphical jpdl transition */ public static Element createTransition(Element parentEle, String name, Element jpdlEle) { Element ele = DomXmlWriter.addElement(parentEle, name); DomXmlWriter.mapAttribute(ele, Constants.Dom_Element_Name, jpdlEle); Element label = DomXmlWriter.addElement(ele, Constants.Gpd_Label_Element_Name); TranslateHelper.mapXY(label, "5", "-10"); return ele; } /* * create graphical jpdl element */ private static Element createElement(Element parentEle, String name, String width, String height) { Element ele = DomXmlWriter.addElement(parentEle, name); DomXmlWriter.addAttribute(ele, Constants.Width_Attribute_Name, width); DomXmlWriter.addAttribute(ele, Constants.Height_Attribute_Name, height); return ele; } /* * create graphical jpdl node */ public static Element createNode(Element rootEle, String name, Element jpdlEle) { Element ele = TranslateHelper.createElement(rootEle, name, "100", "40"); DomXmlWriter.mapAttribute(ele, Constants.Dom_Element_Name, jpdlEle); return ele; } /* * map bpmn x,y attribute to jpdl graphical element */ public static void mapXY(Element pgdEle, String x, String y) { DomXmlWriter.addAttribute(pgdEle, Constants.X_Attribute_Name, x == null ? "0" : x); DomXmlWriter.addAttribute(pgdEle, Constants.Y_Attribute_Name, y == null ? "0" : y); } /* * get a bpmn element id from a given string by subtract suffix for example * bpmn pool has pools suffix a bpmn loop activity has vertices suffix */ public static String getPureBpmnID(String bpmnID, String suffix) { return bpmnID.substring(0, bpmnID.length() - suffix.length()); } /* * get (x,y) from a graphical element and add increments */ public static String[] getXY(Element bpmnGpdEle, int xIncre, int yIncre) { String xy[] = new String[2]; if (bpmnGpdEle == null) { xy[0] = String.valueOf(xIncre); xy[1] = String.valueOf(yIncre); } else { xy[0] = String.valueOf(Integer.parseInt(bpmnGpdEle .attributeValue(Constants.X_Attribute_Name) == null ? "0" : bpmnGpdEle.attributeValue(Constants.X_Attribute_Name)) + xIncre); xy[1] = String.valueOf(Integer.parseInt(bpmnGpdEle .attributeValue(Constants.Y_Attribute_Name) == null ? "0" : bpmnGpdEle.attributeValue(Constants.Y_Attribute_Name)) + yIncre); } return xy; } }