/** * Copyright 2007-2011 非也 * All rights reserved. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation。 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see http://www.gnu.org/licenses. * */ package org.fireflow.pdl.fpdl.io; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.OutputStream; import java.util.Iterator; import java.util.List; import java.util.Map; import javax.xml.namespace.QName; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import javax.xml.transform.OutputKeys; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerConfigurationException; import javax.xml.transform.TransformerException; import javax.xml.transform.TransformerFactory; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; import org.apache.commons.lang.StringUtils; import org.fireflow.model.InvalidModelException; import org.fireflow.model.ModelElement; import org.fireflow.model.binding.Assignment; import org.fireflow.model.binding.ResourceBinding; import org.fireflow.model.binding.ServiceBinding; import org.fireflow.model.data.Expression; import org.fireflow.model.data.Property; import org.fireflow.model.io.SerializerException; import org.fireflow.model.io.Util4Serializer; import org.fireflow.model.io.resource.ResourceSerializer; import org.fireflow.model.io.service.ServiceParser; import org.fireflow.model.misc.Duration; import org.fireflow.pdl.fpdl.diagram.ActivityShape; import org.fireflow.pdl.fpdl.diagram.AssociationShape; import org.fireflow.pdl.fpdl.diagram.CommentShape; import org.fireflow.pdl.fpdl.diagram.Diagram; import org.fireflow.pdl.fpdl.diagram.EndNodeShape; import org.fireflow.pdl.fpdl.diagram.GroupShape; import org.fireflow.pdl.fpdl.diagram.LaneShape; import org.fireflow.pdl.fpdl.diagram.MessageFlowShape; import org.fireflow.pdl.fpdl.diagram.PoolShape; import org.fireflow.pdl.fpdl.diagram.ProcessNodeShape; import org.fireflow.pdl.fpdl.diagram.RouterShape; import org.fireflow.pdl.fpdl.diagram.StartNodeShape; import org.fireflow.pdl.fpdl.diagram.TransitionShape; import org.fireflow.pdl.fpdl.diagram.figure.Circle; import org.fireflow.pdl.fpdl.diagram.figure.Figure; import org.fireflow.pdl.fpdl.diagram.figure.Line; import org.fireflow.pdl.fpdl.diagram.figure.Rectangle; import org.fireflow.pdl.fpdl.diagram.figure.part.Bounds; import org.fireflow.pdl.fpdl.diagram.figure.part.FulfilStyle; import org.fireflow.pdl.fpdl.diagram.figure.part.Label; import org.fireflow.pdl.fpdl.diagram.figure.part.Point; import org.fireflow.pdl.fpdl.process.Activity; import org.fireflow.pdl.fpdl.process.EndNode; import org.fireflow.pdl.fpdl.process.Import; import org.fireflow.pdl.fpdl.process.Router; import org.fireflow.pdl.fpdl.process.StartNode; import org.fireflow.pdl.fpdl.process.SubProcess; import org.fireflow.pdl.fpdl.process.Transition; import org.fireflow.pdl.fpdl.process.WorkflowProcess; import org.fireflow.pdl.fpdl.process.event.EventListenerDef; import org.fireflow.pdl.fpdl.process.features.Feature; import org.fireflow.pdl.fpdl.process.features.endnode.NormalEndFeature; import org.fireflow.pdl.fpdl.process.features.endnode.ThrowCompensationFeature; import org.fireflow.pdl.fpdl.process.features.endnode.ThrowFaultFeature; import org.fireflow.pdl.fpdl.process.features.endnode.ThrowTerminationFeature; import org.fireflow.pdl.fpdl.process.features.router.impl.AndJoinAndSplitRouterFeature; import org.fireflow.pdl.fpdl.process.features.router.impl.CustomizedRouterFeature; import org.fireflow.pdl.fpdl.process.features.router.impl.DefaultRouterFeature; import org.fireflow.pdl.fpdl.process.features.router.impl.OrJoinOrSplitRouterFeature; import org.fireflow.pdl.fpdl.process.features.router.impl.XOrJoinXOrSplitRouterFeature; import org.fireflow.pdl.fpdl.process.features.startnode.CatchCompensationFeature; import org.fireflow.pdl.fpdl.process.features.startnode.CatchFaultFeature; import org.fireflow.pdl.fpdl.process.features.startnode.NormalStartFeature; import org.fireflow.pdl.fpdl.process.features.startnode.TimerStartFeature; import org.fireflow.pdl.fpdl.process.features.startnode.WebserviceStartFeature; import org.firesoa.common.schema.NameSpaces; import org.w3c.dom.CDATASection; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; /** * @author 非也 nychen2000@163.com * @version 2.0 */ public class FPDLSerializer implements FPDLNames { public static final String DEFAULT_FPDL_VERSION = "2.0"; public static final String DEFAULT_VENDOR = "www.firesoa.com"; public static String CDATA_SECTION_ELEMENT_LIST = ""; private String charset = "UTF-8"; public static final String JDK_TRANSFORMER_CLASS = "com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl"; private boolean useJDKTransformerFactory = false;//需要规避bug private static final DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance(); static{ documentBuilderFactory.setNamespaceAware(true); documentBuilderFactory.setCoalescing(false); StringBuffer buf = new StringBuffer(); buf.append("{").append(FPDLNames.FPDL_NS_URI).append("}").append(FPDLNames.DESCRIPTION).append(" " ) .append("{").append(FPDLNames.FPDL_NS_URI).append("}").append(FPDLNames.BODY).append(" ") .append("{").append(FPDLNames.FPDL_NS_URI).append("}").append(FPDLNames.LABEL).append(" ") .append("{").append(FPDLNames.SERVICE_NS_URI).append("}").append(FPDLNames.DESCRIPTION).append(" " ) .append("{").append(FPDLNames.SERVICE_NS_URI).append("}").append(FPDLNames.BODY).append(" ") .append("{").append(FPDLNames.SERVICE_NS_URI).append("}").append(FPDLNames.LABEL).append(" ") .append("{").append(FPDLNames.RESOURCE_NS_URI).append("}").append(FPDLNames.DESCRIPTION).append(" " ) .append("{").append(FPDLNames.RESOURCE_NS_URI).append("}").append(FPDLNames.BODY).append(" ") .append("{").append(FPDLNames.RESOURCE_NS_URI).append("}").append(FPDLNames.LABEL).append(" "); CDATA_SECTION_ELEMENT_LIST = buf.toString(); } public void setCharset(String charset){ this.charset = charset; } public String getCharset(){ return charset; } /** * 返回xml的字符集,便于out转为String * @param workflowProcess * @param out * @return * @throws IOException * @throws SerializerException * @throws InvalidModelException */ public String serialize(WorkflowProcess workflowProcess, OutputStream out) throws IOException, SerializerException ,InvalidModelException{ try { Document document = serializeToDOM(workflowProcess); //下面是测试代码 Element root = document.getDocumentElement(); String displayname=root.getAttribute(DISPLAY_NAME); //============ TransformerFactory transformerFactory = TransformerFactory.newInstance(); if (JDK_TRANSFORMER_CLASS.equals(transformerFactory.getClass().getName())){ useJDKTransformerFactory = true; } Transformer transformer = transformerFactory.newTransformer(); transformer.setOutputProperty(OutputKeys.ENCODING, charset); transformer.setOutputProperty(OutputKeys.INDENT, "yes"); transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "no"); transformer.setOutputProperty(OutputKeys.METHOD, "xml"); transformer.setOutputProperty(OutputKeys.CDATA_SECTION_ELEMENTS, CDATA_SECTION_ELEMENT_LIST); transformer.setOutputProperty( "{http://xml.apache.org/xslt}indent-amount", "2"); transformer.transform(new DOMSource(document), new StreamResult(out)); out.flush(); return charset; } catch (TransformerConfigurationException e) { throw new SerializerException(e); } catch (TransformerException e) { throw new SerializerException(e); } finally { } } public Document serializeToDOM(WorkflowProcess workflowProcess) throws SerializerException,InvalidModelException{ DocumentBuilder documentBuilder = null; try { documentBuilder = documentBuilderFactory.newDocumentBuilder(); } catch (ParserConfigurationException e) { throw new SerializerException(e); } Document document = documentBuilder.newDocument(); //处理指示器,对特殊字符不进行转换 final Node pi = document.createProcessingInstruction(StreamResult.PI_DISABLE_OUTPUT_ESCAPING,""); document.appendChild(pi); // serialize the Package Element workflowProcessElement = document.createElementNS(FPDL_NS_URI, FPDL_NS_PREFIX+":"+WORKFLOW_PROCESS); document.appendChild(workflowProcessElement); // workflowProcessElement.addNamespace(FPDL_NS_PREFIX, FPDL_NS_URI); // workflowProcessElement.addNamespace(SERVICE_NS_PREFIX, SERVICE_NS_URI); // workflowProcessElement.addNamespace(RESOURCE_NS_PREFIX, RESOURCE_NS_URI); // workflowProcessElement.addNamespace(XSD_NS_PREFIX, XSD_URI); // workflowProcessElement.addNamespace(XSI_NS_PREFIX, XSI_URI); // QName qname = df.createQName( // "schemaLocation", "xsi", XSI_URI); // workflowProcessElement.setAttribute(qname, FPDL_SCHEMA_LOCATION+" "+SERVICE_SCHEMA_LOCATION+" "+RESOURCE_SCHEMA_LOCATION); workflowProcessElement.setAttribute(ID, workflowProcess.getId()); workflowProcessElement.setAttribute(NAME, workflowProcess.getName()); workflowProcessElement.setAttribute(DISPLAY_NAME, workflowProcess.getDisplayName()); workflowProcessElement.setAttribute(PACKAGE_ID, workflowProcess.getPackageId()); this.writeDescription(workflowProcessElement, workflowProcess.getDescription()); //序列化import信息 //writeImports4Service(workflowProcess.getImportsForService(),workflowProcessElement);//resource和service不单独作为资源文件存在,故注释掉。2014-01-07 //writeImports4Resource(workflowProcess.getImportsForResource(),workflowProcessElement);//resource和service不单独作为资源文件存在,故注释掉。2014-01-07 this.writeImports(workflowProcess.getImports(),workflowProcessElement); //序列化 service信息 ServiceParser.writeServices(workflowProcess.getServices(),workflowProcessElement); ResourceSerializer.writeResources(workflowProcess.getResources(),workflowProcessElement); Element subflowsElement = Util4Serializer.addElement(workflowProcessElement, SUBPROCESSES); List<SubProcess> subflowList = workflowProcess.getLocalSubProcesses(); if (subflowList!=null && subflowList.size()>0){ for (SubProcess subflow : subflowList){ writeSubflow(subflow, subflowsElement); } } Element diagramsElement = Util4Serializer.addElement(workflowProcessElement, DIAGRAMS); List<Diagram> diagramsList = workflowProcess.getDiagrams(); if (diagramsList!=null && diagramsList.size()>0){ for (Diagram diagram : diagramsList){ writeDiagram(diagram,diagramsElement); } } return document; } protected void writeDiagram(Diagram diagram,Element diagramsElement){ Element diagramElm = Util4Serializer.addElement(diagramsElement, DIAGRAM); diagramElm.setAttribute(ID, diagram.getId()); ModelElement wfElmRef = diagram.getWorkflowElementRef(); diagramElm.setAttribute(REF,wfElmRef==null?"":wfElmRef.getId()); diagramElm.setAttribute(DIRECTION, diagram.getDirection()); diagramElm.setAttribute(GRID_ENABLED, diagram.getGridEnabled()==null?"false":diagram.getGridEnabled().toString()); diagramElm.setAttribute(RULER_ENABLED, diagram.getRulerEnabled()==null?"false":diagram.getRulerEnabled().toString()); diagramElm.setAttribute(SNAP_ENABLED, diagram.getSnapEnabled()==null?"true":diagram.getSnapEnabled().toString()); List<PoolShape> poolList = diagram.getPools(); if (poolList!=null && poolList.size()>0){ for (PoolShape pool : poolList){ writePoolShape(pool,diagramElm); } } List<GroupShape> groupList = diagram.getGroups(); if (groupList!=null){ for (GroupShape group : groupList){ this.writeGroupShape(group, diagramElm); } } List<ProcessNodeShape> workflowNodeShapeList = diagram.getProcessNodeShapes(); if(workflowNodeShapeList!=null && workflowNodeShapeList.size()>0){ for (ProcessNodeShape node : workflowNodeShapeList){ writeNodeShape(node,diagramElm); } } List<CommentShape> commentList = diagram.getComments(); if (commentList!=null && commentList.size()>0){ for (CommentShape comment : commentList){ writeCommentShape(comment,diagramElm); } } List<TransitionShape> transitionShapeList = diagram.getTransitions(); if (transitionShapeList!=null && transitionShapeList.size()>0){ for (TransitionShape transition : transitionShapeList){ writeTransitionShape(transition,diagramElm); } } List<AssociationShape> associationList = diagram.getAssociations(); if (associationList!=null && associationList.size()>0){ for (AssociationShape association : associationList){ writeAssociationShape(association,diagramElm); } } List<MessageFlowShape> messageFlowShapeList = diagram.getMessageFlows(); if (messageFlowShapeList!=null && messageFlowShapeList.size()>0){ for (MessageFlowShape messageFlowShape : messageFlowShapeList){ writeMessageFlowShape(messageFlowShape,diagramElm); } } } protected void writeMessageFlowShape(MessageFlowShape messageFlowShape,Element messageFlowShapesElm){ Element messageFlowElm = Util4Serializer.addElement(messageFlowShapesElm, CONNECTOR); messageFlowElm.setAttribute(TYPE, MESSAGEFLOW); messageFlowElm.setAttribute(ID, messageFlowShape.getId()); if (messageFlowShape.getFromNode()!=null){ messageFlowElm.setAttribute(FROM, messageFlowShape.getFromNode().getId()); } if (messageFlowShape.getToNode()!=null){ messageFlowElm.setAttribute(TO,messageFlowShape.getToNode().getId()); } this.writeFigure(messageFlowShape.getFigure(), messageFlowElm); } protected void writeAssociationShape(AssociationShape association, Element associationShapesElm){ Element elem = Util4Serializer.addElement(associationShapesElm, CONNECTOR); elem.setAttribute(TYPE, ASSOCIATION); elem.setAttribute(ID, association.getId()); if (association.getFromNode()!=null){ elem.setAttribute(FROM, association.getFromNode().getId()); } if (association.getToNode()!=null){ elem.setAttribute(TO, association.getToNode().getId()); } this.writeFigure(association.getFigure(), elem); } protected void writeCommentShape(CommentShape commentshape,Element commentShapesElm){ Element commentShapeElm = Util4Serializer.addElement(commentShapesElm, NODE); commentShapeElm.setAttribute(TYPE, COMMENT); commentShapeElm.setAttribute(ID, commentshape.getId()); this.writeFigure(commentshape.getFigure(), commentShapeElm); } protected void writePoolShape(PoolShape pool, Element poolshapesElm) { Element poolElm = Util4Serializer.addElement(poolshapesElm, NODE); poolElm.setAttribute(TYPE, POOL); poolElm.setAttribute(ID, pool.getId()); ModelElement wfElmRef = pool.getWorkflowElementRef(); if (wfElmRef!=null && !StringUtils.isEmpty(wfElmRef.getId())) { poolElm.setAttribute(REF, wfElmRef.getId()); } Figure figure = pool.getFigure(); writeFigure(figure, poolElm); List<LaneShape> laneList = pool.getLanes(); if (laneList != null && laneList.size() > 0) { for (LaneShape lane : laneList) { writeLaneShape(lane, poolElm); } } } protected void writeTransitionShape(TransitionShape transitionShape,Element transitionsElm){ Element transitionElm = Util4Serializer.addElement(transitionsElm, CONNECTOR); transitionElm.setAttribute(TYPE, TRANSITION); transitionElm.setAttribute(ID, transitionShape.getId()); ModelElement wfElmRef = transitionShape.getWorkflowElementRef(); transitionElm.setAttribute(REF,wfElmRef==null?"":wfElmRef.getId()); if (transitionShape.getFromNode()!=null){ transitionElm.setAttribute(FROM, transitionShape.getFromNode().getId()); } if (transitionShape.getToNode()!=null){ transitionElm.setAttribute(TO, transitionShape.getToNode().getId()); } writeFigure(transitionShape.getFigure(),transitionElm); } protected void writeGroupShape(GroupShape groupShape, Element parentElem) { Element groupElm = Util4Serializer.addElement(parentElem, NODE); groupElm.setAttribute(TYPE, GROUP); groupElm.setAttribute(ID, groupShape.getId()); writeFigure(groupShape.getFigure(), groupElm); // 序列化Group内部的元素 List<ProcessNodeShape> nodeShapeList = groupShape .getProcessNodeShapes(); for (ProcessNodeShape nodeShape : nodeShapeList) { this.writeNodeShape(nodeShape, groupElm); } List<CommentShape> commentShapeList = groupShape.getComments(); for (CommentShape commentshape : commentShapeList) { this.writeCommentShape(commentshape, groupElm); } } protected void writeNodeShape(ProcessNodeShape node,Element nodesElement){ Element nodeElm = null; if (node instanceof StartNodeShape){ nodeElm = Util4Serializer.addElement(nodesElement, NODE); nodeElm.setAttribute(TYPE, START_NODE); }else if (node instanceof EndNodeShape){ nodeElm = Util4Serializer.addElement(nodesElement, NODE); nodeElm.setAttribute(TYPE, END_NODE); }else if (node instanceof ActivityShape){ nodeElm = Util4Serializer.addElement(nodesElement, NODE); nodeElm.setAttribute(TYPE, ACTIVITY); }else if (node instanceof RouterShape){ nodeElm = Util4Serializer.addElement(nodesElement, NODE); nodeElm.setAttribute(TYPE, ROUTER); } if (nodeElm==null) return; nodeElm.setAttribute(ID, node.getId()); ModelElement wfElmRef = node.getWorkflowElementRef(); nodeElm.setAttribute(REF, wfElmRef==null?"":wfElmRef.getId()); writeFigure(node.getFigure(),nodeElm); if (node instanceof ActivityShape){ //write attached start node; ActivityShape activityShape = (ActivityShape)node; List<StartNodeShape> attachedStartNodeShapeList = activityShape.getAttachedStartNodeShapes(); if (attachedStartNodeShapeList!=null && attachedStartNodeShapeList.size()>0){ for (StartNodeShape startNodeShape : attachedStartNodeShapeList){ this.writeNodeShape(startNodeShape, nodeElm); } } } } protected void writeLaneShape(LaneShape lane,Element lanesElm){ Element laneElm = Util4Serializer.addElement(lanesElm, NODE); laneElm.setAttribute(TYPE, LANE); laneElm.setAttribute(ID, lane.getId()); writeFigure(lane.getFigure(),laneElm); List<ProcessNodeShape> nodeShapeList = lane.getProcessNodeShapes(); for (ProcessNodeShape nodeShape : nodeShapeList) { this.writeNodeShape(nodeShape, laneElm); } List<CommentShape> commentShapeList = lane.getComments(); for (CommentShape commentshape : commentShapeList) { this.writeCommentShape(commentshape, laneElm); } List<GroupShape> groupShapeList = lane.getGroups(); for (GroupShape groupShape:groupShapeList){ this.writeGroupShape(groupShape, laneElm); } } protected void writeFigure(Figure figure,Element parentElement){ if (figure==null) return; Element figureElement = Util4Serializer.addElement(parentElement, FIGURE); if (figure instanceof Rectangle){ writeRectangle((Rectangle)figure,figureElement); } else if (figure instanceof Circle){ writeCircle((Circle)figure,figureElement); } else if (figure instanceof Line){ writeLine((Line)figure,figureElement); } } protected void writeLine(Line line , Element parentElement){ Element lineElm = Util4Serializer.addElement(parentElement, LINE); if (line.getTitleLabel()!=null ){ Element titleElm = Util4Serializer.addElement(lineElm, TITLE); this.writeLabel(line.getTitleLabel(), titleElm); } this.writeBounds(line.getBounds(), lineElm); if (line.getLabelPosition()!=null){ lineElm.setAttribute(LABEL_POSITION, line.getLabelPosition().toString()); } List<Point> pointList = line.getPoints(); if (pointList!=null && pointList.size()>0){ lineElm.setAttribute(POINT_LIST, pointList2String(pointList)); } } private String pointList2String(List<Point> pointList){ StringBuffer sbuf = new StringBuffer(); for (int i=0;i<pointList.size();i++){ Point p = pointList.get(i); sbuf.append(p.toString()); if (i<pointList.size()-1){ sbuf.append(";"); } } return sbuf.toString(); } protected void writeCircle(Circle circle,Element parentElement){ Element circleElm = Util4Serializer.addElement(parentElement, CIRCLE); if (circle.getTitleLabel()!=null && !StringUtils.isEmpty(circle.getTitle())){ Element titleElm = Util4Serializer.addElement(circleElm, TITLE); this.writeLabel(circle.getTitleLabel(), titleElm); } this.writeBounds(circle.getBounds(), circleElm); this.writeFulfilStyle(circle.getFulfilStyle(), circleElm); } protected void writeRectangle(Rectangle rect,Element parentElement){ Element rectElm = Util4Serializer.addElement(parentElement, RECTANGLE); if (rect.getTitleLabel()!=null ){ Element titleElm = Util4Serializer.addElement(rectElm, TITLE); this.writeLabel(rect.getTitleLabel(), titleElm); } if (rect.getContentLabel()!=null ){ Element contentElm = Util4Serializer.addElement(rectElm, CONTENT); this.writeLabel(rect.getContentLabel(), contentElm); } this.writeBounds(rect.getBounds(), rectElm); this.writeFulfilStyle(rect.getFulfilStyle(), rectElm); } // protected void writePlane(Plane plane,Element parentElement){ // Element planeElm = Util4Serializer.addElement(parentElement, PLANE); // // writeLabel(plane.getLabel(),planeElm); // // Bounds bounds = plane.getBounds(); // writeBounds(bounds,planeElm); // // FulfilStyle fulfilStyle = plane.getFulfilStyle(); // writeFulfilStyle(fulfilStyle,planeElm); // } protected void writeLabel(Label lb, Element parentElm) { if (lb != null) { Element labelElm = Util4Serializer.addElement(parentElm, LABEL); if (!StringUtils.isEmpty(lb.getTextDirection())) { labelElm.setAttribute(TEXT_DIRECTION, lb.getTextDirection()); } if (!StringUtils.isEmpty(lb.getFontName())) { labelElm.setAttribute(FONT_NAME, lb.getFontName()); } labelElm.setAttribute(SIZE, Integer.toString(lb.getFontSize())); if (!StringUtils.isEmpty(lb.getFontColor())) { labelElm.setAttribute(COLOR, lb.getFontColor()); } if (!StringUtils.isEmpty(lb.getFontStyle())) { labelElm.setAttribute(FONT_STYLE, lb.getFontStyle()); } Document doc = parentElm.getOwnerDocument(); CDATASection cdata = doc.createCDATASection(useJDKTransformerFactory?(" "+lb.getText()):lb.getText());//规避jdk的GBK bug labelElm.appendChild(cdata); } } protected void writeBounds(Bounds bounds, Element parentElm) { if (bounds == null) return; Element boundsElm = Util4Serializer.addElement(parentElm, BOUNDS); boundsElm.setAttribute(X, Integer.toString(bounds.getX())); boundsElm.setAttribute(Y, Integer.toString(bounds.getY())); boundsElm.setAttribute(WIDTH, Integer.toString(bounds.getWidth())); boundsElm.setAttribute(HEIGHT, Integer.toString(bounds.getHeight())); if (bounds.getThick()>=0){ Element boundsStyleElm = Util4Serializer.addElement(boundsElm, BORDER_STYLE); boundsStyleElm.setAttribute(LINE_TYPE, bounds.getLineType()); boundsStyleElm.setAttribute(THICK, Integer.toString(bounds.getThick())); boundsStyleElm.setAttribute(COLOR, bounds.getColor()); boundsStyleElm.setAttribute(RADIUS, Integer.toString(bounds.getCornerRadius())); String tmpS = bounds.getDashArray(); if (tmpS!=null && !tmpS.trim().equals("")){ boundsStyleElm.setAttribute(DASH_ARRAY, tmpS); } } } protected void writeFulfilStyle(FulfilStyle fulfilStyle,Element parentElm){ if (fulfilStyle!=null){ Element fulfilStyleElm = Util4Serializer.addElement(parentElm, FULFIL_STYLE); fulfilStyleElm.setAttribute(COLOR+"1", fulfilStyle.getColor1()); fulfilStyleElm.setAttribute(COLOR+"2", fulfilStyle.getColor2()); fulfilStyleElm.setAttribute(GRADIENT_STYLE, fulfilStyle.getGradientStyle()); } } public String serializeToXmlString(WorkflowProcess workflowProcess) throws IOException, SerializerException ,InvalidModelException{ ByteArrayOutputStream out = new ByteArrayOutputStream(); String charsetTmp = serialize(workflowProcess, out); return out.toString(charsetTmp); } protected void writeSubflow(SubProcess subflow ,Element subflowsElement)throws InvalidModelException,SerializerException{ Element subflowElement = Util4Serializer.addElement(subflowsElement, SUBPROCESS); subflowElement.setAttribute(ID, subflow.getId()); subflowElement.setAttribute(NAME, subflow.getName()); subflowElement.setAttribute(DISPLAY_NAME, subflow.getDisplayName()); this.writeDescription(subflowElement, subflow.getDescription()); if (subflow.getEntry()!=null){ subflowElement.setAttribute(ENTRY, subflow.getEntry().getId()); } if (subflow.getDuration()!=null){ subflowElement.setAttribute(DURATION, durationToString(subflow.getDuration())); } //TODO 待处理 writeProperties(subflow.getProperties(), subflowElement); writeStartNodes(subflow.getStartNodes(), subflowElement); writeActivities(subflow.getActivities(), subflowElement); writeRouters(subflow.getRouters(), subflowElement); writeEndNodes(subflow.getEndNodes(), subflowElement); writeTransitions(subflow.getTransitions(), subflowElement); writeEventListeners(subflow.getEventListeners(), subflowElement); writeExtendedAttributes(subflow.getExtendedAttributes(), subflowElement); } /* protected void writeImports4Service(List<Import<ServiceDef>> imports4Service,Element parentElement){ if (imports4Service==null || imports4Service.size()==0){ return ; } for (Import<ServiceDef> processImport : imports4Service){ Element processImportElem = Util4Serializer.addElement( parentElement, IMPORT); processImportElem.setAttribute(IMPORT_TYPE, Import.SERVICES_IMPORT); processImportElem.setAttribute(LOCATION, processImport.getLocation()); processImportElem.setAttribute(PACKAGE_ID, processImport.getPackageId()); processImportElem.setAttribute(ID, processImport.getId()); } } */ protected void writeImports(List<Import> imports4Process,Element parentElement){ if (imports4Process==null || imports4Process.size()==0){ return ; } for (Import processImport : imports4Process){ Element processImportElem = Util4Serializer.addElement( parentElement, IMPORT); processImportElem.setAttribute(IMPORT_TYPE, processImport.getImportType()); processImportElem.setAttribute(LOCATION, processImport.getLocation()); processImportElem.setAttribute(PACKAGE_ID, processImport.getPackageId()); processImportElem.setAttribute(ID, processImport.getId()); processImportElem.setAttribute(NAME, processImport.getName()); processImportElem.setAttribute(DISPLAY_NAME, processImport.getDisplayName()); } } /* protected void writeImports4Resource(List<Import<ResourceDef>> processImports,Element parentElement){ if (processImports==null || processImports.size()==0){ return ; } for (Import<ResourceDef> processImport : processImports){ Element processImportElem = Util4Serializer.addElement( parentElement, IMPORT); processImportElem.setAttribute(IMPORT_TYPE, Import.RESOURCES_IMPORT); processImportElem.setAttribute(LOCATION, processImport.getLocation()); processImportElem.setAttribute(PACKAGE_ID, processImport.getPackageId()); processImportElem.setAttribute(ID, processImport.getId()); } } */ private void writeEventListener(EventListenerDef listener,Element eventListenersElm){ Element eventListenerElm = Util4Serializer.addElement( eventListenersElm, EVENT_LISTENER); //一般情况下,listener不需要id,name等信息 if (listener.getId()!=null && !listener.getId().trim().equals("")){ eventListenerElm.setAttribute(ID, listener.getId()); } if (listener.getName()!=null && !listener.getName().trim().equals("")){ eventListenerElm.setAttribute(NAME, listener.getName()); } if (listener.getDisplayName()!=null && !listener.getDisplayName().trim().equals("")){ eventListenerElm.setAttribute(DISPLAY_NAME, listener.getDisplayName()); } if (listener.getDescription()!=null && !listener.getDescription().trim().equals("")){ writeDescription(eventListenerElm,listener.getDescription()); } if (listener.getListenerBeanName()!=null && !listener.getListenerBeanName().trim().equals("")){ eventListenerElm.setAttribute(BEAN_NAME, listener.getListenerBeanName()); }else{ eventListenerElm.setAttribute(CLASS_NAME, listener.getListenerClassName()); } } protected void writeWorkItemEventListeners(List<EventListenerDef> eventListeners, Element parentElement){ if (eventListeners == null || eventListeners.size() == 0) { return; } Element eventListenersElm = Util4Serializer.addElement(parentElement, WORKITEM_EVENT_LISTENERS); for (int i = 0; i < eventListeners.size(); i++) { EventListenerDef listener = (EventListenerDef) eventListeners.get(i); writeEventListener(listener,eventListenersElm); } } protected void writeEventListeners(List<EventListenerDef> eventListeners, Element parentElement) { if (eventListeners == null || eventListeners.size() == 0) { return; } Element eventListenersElm = Util4Serializer.addElement(parentElement, EVENT_LISTENERS); for (int i = 0; i < eventListeners.size(); i++) { EventListenerDef listener = (EventListenerDef) eventListeners.get(i); writeEventListener(listener,eventListenersElm); } } protected void writeProperties(List<Property> dataFields, Element parent) throws SerializerException { if (dataFields == null || dataFields.size() == 0) { return; } Element dataFieldsElement = Util4Serializer.addElement(parent, PROPERTIES); Iterator<Property> iter = dataFields.iterator(); while (iter.hasNext()) { Property dataField = iter.next(); Element dataFieldElement = Util4Serializer.addElement( dataFieldsElement, PROPERTY); dataFieldElement.setAttribute(ID, dataField.getId()); dataFieldElement.setAttribute(NAME, dataField.getName()); dataFieldElement.setAttribute(DISPLAY_NAME, dataField.getDisplayName()); QName dataType = dataField.getDataType(); if (dataType==null){//取默认值,java.lang.String dataType = new QName(NameSpaces.JAVA.getUri(),"java.lang.String"); } dataFieldElement.setAttribute(DATA_TYPE,dataType.toString() ); dataFieldElement.setAttribute(INIT_VALUE, dataField.getInitialValueAsString()); this.writeDescription(dataFieldElement, dataField.getDescription()); } } protected void writeEndNodes(List<EndNode> endNodes, Element parent) { Element endNodesElement = Util4Serializer.addElement(parent, END_NODES); Iterator<EndNode> iter = endNodes.iterator(); while (iter.hasNext()) { writeEndNode( iter.next(), endNodesElement); } } protected void writeEndNode(EndNode endNode, Element parent) { Element endNodeElement = Util4Serializer.addElement(parent, END_NODE); endNodeElement.setAttribute(ID, endNode.getId()); endNodeElement.setAttribute(NAME, endNode.getName()); if (endNode.getDisplayName()!=null && !endNode.getDisplayName().trim().equals("")){ endNodeElement.setAttribute(DISPLAY_NAME, endNode.getDisplayName()); } this.writeDescription(endNodeElement, endNode.getDescription()); Feature feature = endNode.getFeature(); if (feature!=null){ Element featuresElement = Util4Serializer.addElement(endNodeElement, FEATURES); writeEndNodeFeature(feature,featuresElement); } writeExtendedAttributes(endNode.getExtendedAttributes(), endNodeElement); } protected void writeStartNodes(List<StartNode> startNodes, Element parent) throws SerializerException { if (startNodes == null || startNodes.size()==0) { return; } Element startNodesElement = Util4Serializer.addElement(parent, START_NODES); for (StartNode startNode : startNodes){ Element startElement = Util4Serializer.addElement(startNodesElement, START_NODE); startElement.setAttribute(ID, startNode.getId()); startElement.setAttribute(NAME, startNode.getName()); if (startNode.getDisplayName()!=null && !startNode.getDisplayName().trim().equals("")){ startElement.setAttribute(DISPLAY_NAME, startNode.getDisplayName()); } this.writeDescription(startElement, startNode.getDescription()); Feature dec = startNode.getFeature(); if (dec!=null){ Element decElement = Util4Serializer.addElement(startElement, FEATURES); writeStartNodeFeature(dec,decElement); } writeExtendedAttributes(startNode.getExtendedAttributes(), startElement); } } protected void writeEndNodeFeature(Feature feature,Element parent){ if (feature instanceof ThrowCompensationFeature){ ThrowCompensationFeature compensationDec = (ThrowCompensationFeature)feature; Element catchCompensationElem = Util4Serializer.addElement(parent, THROW_COMPENSATION_FEATURE); List<String> compensationCodes = compensationDec.getCompensationCodes(); StringBuffer compensationCodesStr = new StringBuffer(""); if (compensationCodes!=null){ int i=0; for (String code : compensationCodes){ compensationCodesStr.append(code); if (i<compensationCodes.size()-1){ compensationCodesStr.append(","); } i++; } } catchCompensationElem.setAttribute(COMPENSATION_CODES, compensationCodesStr.toString()); } else if (feature instanceof ThrowFaultFeature){ ThrowFaultFeature catchFaultDec = (ThrowFaultFeature)feature; Element catchFaultElem = Util4Serializer.addElement(parent, THROW_FAULT_FEATURE); catchFaultElem.setAttribute(ERROR_CODE, catchFaultDec.getErrorCode()); } else if (feature instanceof ThrowTerminationFeature){ Util4Serializer.addElement(parent, THROW_TERMINATION_FEATURE); } else if (feature instanceof NormalEndFeature){ Util4Serializer.addElement(parent, NORMAL_END_FEATURE); } } protected void writeStartNodeFeature(Feature dec,Element featuresElement){ if (dec instanceof TimerStartFeature){ TimerStartFeature timerFeature = (TimerStartFeature)dec; Element timerDecElem = Util4Serializer.addElement(featuresElement, TIMER_START_FEATURE); if (timerFeature.getAttachedToActivity()!=null){ timerDecElem.setAttribute(ATTACHED_TO_ACTIVITY, timerFeature.getAttachedToActivity().getId()); timerDecElem.setAttribute(IS_CANCEL_ATTACHED_TO_ACTIVITY, Boolean.toString(timerFeature.getCancelAttachedToActivity())); } if (timerFeature.getTimerOperationName()!=null){ timerDecElem.setAttribute(TIMER_OPERATION_NAME, timerFeature.getTimerOperationName().getValue()); } Expression cronExp = timerFeature.getCronExpression(); if(cronExp!=null){ Element expElem = Util4Serializer.addElement(timerDecElem, CRON_EXPRESSION); this.writeExpression(cronExp, expElem); } Expression startTimeExp = timerFeature.getStartTimeExpression(); if (startTimeExp!=null){ Element expElem = Util4Serializer.addElement(timerDecElem, START_TIME_EXPRESSION); this.writeExpression(startTimeExp, expElem); } Expression endTimeExp = timerFeature.getEndTimeExpression(); if (endTimeExp!=null){ Element expElem = Util4Serializer.addElement(timerDecElem, END_TIME_EXPRESSION); this.writeExpression(endTimeExp, expElem); } Expression intervalExp = timerFeature.getRepeatIntervalExpression(); if (intervalExp!=null){ Element expElem = Util4Serializer.addElement(timerDecElem, REPEAT_INTERVAL_EXPRESSION); this.writeExpression(intervalExp, expElem); } Expression countExp = timerFeature.getRepeatCountExpression(); if (countExp!=null){ Element expElem = Util4Serializer.addElement(timerDecElem, REPEAT_COUNT_EXPRESSION); this.writeExpression(countExp, expElem); } } else if (dec instanceof CatchCompensationFeature){ CatchCompensationFeature catchCompensationDec = (CatchCompensationFeature)dec; Element catchCompensationElem = Util4Serializer.addElement(featuresElement, CATCH_COMPENSATION_FEATURE); if (catchCompensationDec.getAttachedToActivity()!=null){ catchCompensationElem.setAttribute(ATTACHED_TO_ACTIVITY, catchCompensationDec.getAttachedToActivity().getId()); } catchCompensationElem.setAttribute(COMPENSATION_CODE, catchCompensationDec.getCompensationCode()); } else if (dec instanceof CatchFaultFeature){ CatchFaultFeature catchFaultDec = (CatchFaultFeature)dec; Element catchFaultElem = Util4Serializer.addElement(featuresElement, CATCH_FAULT_FEATURE); if (catchFaultDec.getAttachedToActivity()!=null){ catchFaultElem.setAttribute(ATTACHED_TO_ACTIVITY, catchFaultDec.getAttachedToActivity().getId()); } catchFaultElem.setAttribute(ERROR_CODE, catchFaultDec.getErrorCode()); } else if (dec instanceof NormalStartFeature){ NormalStartFeature normalDec = (NormalStartFeature)dec; Util4Serializer.addElement(featuresElement, NORMAL_START_FEATURE); }else if (dec instanceof WebserviceStartFeature){ WebserviceStartFeature wsStartFeature = (WebserviceStartFeature)dec; Element wsStartFeatureElement = Util4Serializer.addElement(featuresElement, WEBSERVICE_START_FEATURE); this.writeServiceBinding(wsStartFeature.getServiceBinding(), wsStartFeatureElement); } //TODO MessageStartDecorator需完善~~~ } protected void writeRouters(List<Router> synchronizers, Element parent) throws SerializerException { if (synchronizers == null || synchronizers.size() == 0) { return; } Element synchronizersElement = Util4Serializer.addElement(parent, ROUTERS); Iterator<Router> iter = synchronizers.iterator(); while (iter.hasNext()) { writeRouter( iter.next(), synchronizersElement); } } protected void writeRouter(Router router, Element parent) throws SerializerException { Element routerElement = Util4Serializer.addElement(parent, ROUTER); routerElement.setAttribute(ID, router.getId()); routerElement.setAttribute(NAME, router.getName()); if (router.getDisplayName()!=null && !router.getDisplayName().trim().equals("")){ routerElement.setAttribute(DISPLAY_NAME, router.getDisplayName()); } this.writeDescription(routerElement, router.getDescription()); Feature feature = router.getFeature(); if (feature!=null){ Element featuresElement = Util4Serializer.addElement(routerElement, FEATURES); if (feature instanceof DefaultRouterFeature){ Util4Serializer.addElement(featuresElement, DEFAULT_ROUTER_FEATURE); } else if (feature instanceof AndJoinAndSplitRouterFeature){ Util4Serializer.addElement(featuresElement, ANDJOIN_ANDSPLIT_FEATURE); }else if (feature instanceof XOrJoinXOrSplitRouterFeature){ Util4Serializer.addElement(featuresElement, XORJOIN_XORSPLIT_FEATURE); }else if (feature instanceof OrJoinOrSplitRouterFeature){ Util4Serializer.addElement(featuresElement, ORJOIN_ORSPLIT_FEATURE); } else if (feature instanceof CustomizedRouterFeature){ Element fElm = Util4Serializer.addElement(featuresElement, CUSTOMIZED_JOIN_SPLIT_FEATURE); CustomizedRouterFeature customizedFeature = (CustomizedRouterFeature)feature; Util4Serializer.addElement(fElm, JOIN_EVALUATOR,customizedFeature.getJoinEvaluatorClass()); Util4Serializer.addElement(fElm, SPLIT_EVALUATOR,customizedFeature.getSplitEvaluatorClass()); } } writeExtendedAttributes(router.getExtendedAttributes(), routerElement); } protected void writeActivities(List<Activity> activities, Element parent) throws SerializerException { if (activities == null || activities.size() == 0) { return; } Element activitiesElement = Util4Serializer.addElement(parent, ACTIVITIES); Iterator<Activity> iter = activities.iterator(); while (iter.hasNext()) { writeActivity( iter.next(), activitiesElement); } } protected void writeActivity(Activity activity, Element parent) throws SerializerException { Element activityElement = Util4Serializer.addElement(parent, ACTIVITY); activityElement.setAttribute(ID, activity.getId()); activityElement.setAttribute(NAME, activity.getName()); if (activity.getDisplayName()!=null && !activity.getDisplayName().trim().equals("")){ activityElement.setAttribute(DISPLAY_NAME, activity.getDisplayName()); } if (activity.getPriority()!=null && !activity.getPriority().trim().equals("")){ activityElement.setAttribute(PRIORITY, activity.getPriority()); } if (activity.getDuration()!=null){ activityElement.setAttribute(DURATION, durationToString(activity.getDuration())); } if (activity.getLoopStrategy()!=null){ activityElement.setAttribute(LOOP_STRATEGY, activity.getLoopStrategy().getValue()); } this.writeDescription(activityElement, activity.getDescription()); Feature dec = activity.getFeature(); if (dec!=null){ //TODO Activity是否需要decorator? } this.writeProperties(activity.getProperties(), activityElement); this.writeServiceBinding(activity.getServiceBinding(),activityElement); this.writeResourceBinding(activity.getResourceBinding(),activityElement); writeEventListeners(activity.getEventListeners(), activityElement); writeWorkItemEventListeners(activity.getWorkItemEventListeners(),activityElement); writeExtendedAttributes(activity.getExtendedAttributes(), activityElement); } protected void writeResourceBinding(ResourceBinding resourceBinding,Element parent){ if (resourceBinding==null)return; Element resourceBindingElem = Util4Serializer.addElement(parent, RESOURCE_BINDING); resourceBindingElem.setAttribute(DISPLAY_NAME, resourceBinding.getDisplayName()); resourceBindingElem.setAttribute(ASSIGNMENT_STRATEGY, resourceBinding.getAssignmentStrategy().getValue()); List<String> administrators = resourceBinding.getAdministratorRefs(); if (administrators!=null && administrators.size()>0){ Element administratorsElem = Util4Serializer.addElement(resourceBindingElem, ADMINISTRATORS); for (String resourceRefId : administrators){ Element resourceRefElem = Util4Serializer.addElement(administratorsElem, RESOURCE_REF); resourceRefElem.setAttribute(RESOURCE_ID, resourceRefId); // List<ParameterAssignment> paramAssignments = resourceRef.getParameterAssignments(); // if (paramAssignments!=null && paramAssignments.size()>0){ // Element paramAssignmentsElem = Util4Serializer.addElement(resourceRefElem, PARAMETER_ASSIGNMENTS); // for (ParameterAssignment paramAssignment : paramAssignments){ // Element paramAssignmentElm = Util4Serializer.addElement(paramAssignmentsElem, PARAMETER_ASSIGNMENT); // Element fromElement = Util4Serializer.addElement(paramAssignmentElm, FROM); // Expression fromExp = paramAssignment.getFrom(); // this.writeExpression(fromExp, fromElement); // // Util4Serializer.addElement(paramAssignmentElm, TO,paramAssignment.getTo()); // // } // } } } //潜在操作者 List<String> potentialOwners = resourceBinding.getPotentialOwnerRefs(); if (potentialOwners!=null && potentialOwners.size()>0){ Element potentialOwnersElem = Util4Serializer.addElement(resourceBindingElem, POTENTIAL_OWNERS); for (String resourceRef : potentialOwners){ Element resourceRefElem = Util4Serializer.addElement(potentialOwnersElem, RESOURCE_REF); resourceRefElem.setAttribute(RESOURCE_ID, resourceRef); // List<ParameterAssignment> paramAssignments = resourceRef.getParameterAssignments(); // if (paramAssignments!=null && paramAssignments.size()>0){ // Element paramAssignmentsElem = Util4Serializer.addElement(resourceRefElem, PARAMETER_ASSIGNMENTS); // for (ParameterAssignment paramAssignment : paramAssignments){ // Element paramAssignmentElm = Util4Serializer.addElement(paramAssignmentsElem, PARAMETER_ASSIGNMENT); // Element fromElement = Util4Serializer.addElement(paramAssignmentElm, FROM); // Expression fromExp = paramAssignment.getFrom(); // this.writeExpression(fromExp, fromElement); // // Util4Serializer.addElement(paramAssignmentElm, TO,paramAssignment.getTo()); // // } // } } } List<String> readers = resourceBinding.getReaderRefs(); if (readers!=null && readers.size()>0){ Element potentialOwnersElem = Util4Serializer.addElement(resourceBindingElem, READERS); for (String resourceRef : readers){ Element resourceRefElem = Util4Serializer.addElement(potentialOwnersElem, RESOURCE_REF); resourceRefElem.setAttribute(RESOURCE_ID, resourceRef); // List<ParameterAssignment> paramAssignments = resourceRef.getParameterAssignments(); // if (paramAssignments!=null && paramAssignments.size()>0){ // Element paramAssignmentsElem = Util4Serializer.addElement(resourceRefElem, PARAMETER_ASSIGNMENTS); // for (ParameterAssignment paramAssignment : paramAssignments){ // Element paramAssignmentElm = Util4Serializer.addElement(paramAssignmentsElem, PARAMETER_ASSIGNMENT); // Element fromElement = Util4Serializer.addElement(paramAssignmentElm, FROM); // Expression fromExp = paramAssignment.getFrom(); // this.writeExpression(fromExp, fromElement); // // Util4Serializer.addElement(paramAssignmentElm, TO,paramAssignment.getTo()); // // } // } } } } protected void writeServiceBinding(ServiceBinding serviceBinding,Element parent){ if (serviceBinding==null)return; Element serviceBindingElem = Util4Serializer.addElement(parent, SERVICE_BINDING); serviceBindingElem.setAttribute(SERVICE_ID, serviceBinding.getServiceId()); serviceBindingElem.setAttribute(OPERATION_NAME, serviceBinding.getOperationName()); List<Assignment> inputAssignments = serviceBinding.getInputAssignments(); if (inputAssignments!=null && inputAssignments.size()>0){ Element inputAssignmentsElem = Util4Serializer.addElement(serviceBindingElem, INPUT_ASSIGNMENTS); for (Assignment inputAssignment : inputAssignments){ Element inputAssignmentElem = Util4Serializer.addElement(inputAssignmentsElem, INPUT_ASSIGNMENT); Element fromElement = Util4Serializer.addElement(inputAssignmentElem, FROM); Expression fromExp = inputAssignment.getFrom(); writeExpression(fromExp, fromElement); Element toElement = Util4Serializer.addElement(inputAssignmentElem, TO); Expression toExp = inputAssignment.getTo(); writeExpression(toExp, toElement); } } List<Assignment> outputAssignments = serviceBinding.getOutputAssignments(); if (outputAssignments!=null && outputAssignments.size()>0){ Element outputAssignmentsElem = Util4Serializer.addElement(serviceBindingElem, OUTPUT_ASSIGNMENTS); for (Assignment outputAssignment : outputAssignments){ Element outputAssignmentElem = Util4Serializer.addElement(outputAssignmentsElem, OUTPUT_ASSIGNMENT); Element fromElement = Util4Serializer.addElement(outputAssignmentElem, FROM); Expression fromExp = outputAssignment.getFrom(); this.writeExpression(fromExp, fromElement); Element toElement = Util4Serializer.addElement(outputAssignmentElem, TO); Expression toExp = outputAssignment.getTo(); writeExpression(toExp, toElement); } } // List<PropOverride> propOverrides = serviceBinding.getPropOverrides(); // if (propOverrides!=null && propOverrides.size()>0){ // Element propOverridesElem = Util4Serializer.addElement(serviceBindingElem, PROP_OVERRIDES); // // for (PropOverride propOverride : propOverrides){ // Element propOverrideElem = Util4Serializer.addElement(propOverridesElem, PROP_OVERRIDE); // propOverrideElem.setAttribute(PROP_GROUP_NAME, propOverride.getPropGroupName()); // propOverrideElem.setAttribute(PROP_NAME, propOverride.getPropName()); // propOverrideElem.setAttribute(VALUE, propOverride.getValue()); // } // } } // protected void writeDuration(Duration duration, Element parent) { // if (duration == null) { // return; // } // Element durationElement = Util4Serializer.addElement(parent, DURATION); // durationElement.setAttribute(VALUE, Integer.toString(duration.getValue())); // durationElement.setAttribute(UNIT, duration.getUnit()); // durationElement.setAttribute(IS_BUSINESS_TIME, Boolean.toString(duration.isBusinessTime())); // } protected String durationToString(Duration duration){ if (duration==null) return null; if (duration.isBusinessTime() && Duration.DAY.equals(duration.getUnit())){ return duration.getValue()+" BUSINESS "+duration.getUnit(); }else{ return duration.getValue()+" "+duration.getUnit(); } } protected void writeTransitions(List<Transition> transitions, Element parent) throws SerializerException { if (transitions == null || transitions.size() == 0) { return; } Element transitionsElement = Util4Serializer.addElement(parent, TRANSITIONS); Iterator<Transition> iter = transitions.iterator(); while (iter.hasNext()) { writeTransition( iter.next(), transitionsElement); } } protected void writeTransition(Transition transition, Element parent) throws SerializerException { Element transitionElement = Util4Serializer.addElement(parent, TRANSITION); transitionElement.setAttribute(ID, transition.getId()); transitionElement.setAttribute(FROM, transition.getFromNode().getId()); transitionElement.setAttribute(TO, transition.getToNode().getId()); transitionElement.setAttribute(NAME, transition.getName()); if (transition.getDisplayName()!=null){ transitionElement.setAttribute(DISPLAY_NAME, transition.getDisplayName()); } transitionElement.setAttribute(IS_LOOP, Boolean.toString(transition.isLoop())); transitionElement.setAttribute(IS_DEFAULT, Boolean.toString(transition.isDefault())); this.writeDescription(transitionElement, transition.getDescription()); Expression condition = transition.getCondition(); if(condition!=null){ Element conditionElement = Util4Serializer.addElement(transitionElement, CONDITION); writeExpression(condition,conditionElement); } writeExtendedAttributes(transition.getExtendedAttributes(), transitionElement); } protected void writeExpression(Expression exp,Element parent){ if (exp==null)return; Element expressionElem = Util4Serializer.addElement(parent, EXPRESSION); if (exp.getName()!=null && !exp.getName().trim().equals("")){ expressionElem.setAttribute(NAME, exp.getName()); } if (exp.getDisplayName()!=null && !exp.getDisplayName().trim().equals("")){ expressionElem.setAttribute(DISPLAY_NAME, exp.getDisplayName()); } if (exp.getDataType()!=null){ expressionElem.setAttribute(DATA_TYPE, exp.getDataType().toString()); } expressionElem.setAttribute(LANGUAGE, exp.getLanguage()); Document doc = parent.getOwnerDocument(); Element bodyElem = Util4Serializer.addElement(expressionElem, BODY); String body = exp.getBody()!=null?exp.getBody():""; CDATASection cdata = doc.createCDATASection(useJDKTransformerFactory?(" "+body):body);//规避jdk 的GBK bug bodyElem.appendChild(cdata); if(exp.getNamespaceMap()!=null && exp.getNamespaceMap().size()>0){ Element namespaceMapElem = Util4Serializer.addElement(expressionElem, NAMESPACE_PREFIX_URI_MAP); Iterator<Map.Entry<String,String>> entrys = exp.getNamespaceMap().entrySet().iterator(); while(entrys.hasNext()){ Map.Entry<String,String> entry = entrys.next(); Element entryElem = Util4Serializer.addElement(namespaceMapElem, ENTRY); entryElem.setAttribute(NAME, entry.getKey()); entryElem.setAttribute(VALUE, entry.getValue()); } } } protected Element writeExtendedAttributes(Map<String,String> extendedAttributes, Element parent) { if (extendedAttributes == null || extendedAttributes.size() == 0) { return null; } Element extendedAttributesElement = Util4Serializer.addElement(parent, EXTENDED_ATTRIBUTES); Iterator<String> keys = extendedAttributes.keySet().iterator(); while (keys.hasNext()) { String key = keys.next(); String value = extendedAttributes.get(key); Element extendedAttributeElement = Util4Serializer.addElement( extendedAttributesElement, EXTENDED_ATTRIBUTE); extendedAttributeElement.setAttribute(NAME, key.toString()); if (value != null) { extendedAttributeElement.setAttribute(VALUE, value.toString()); } } return extendedAttributesElement; } protected void writeDescription(Element parent, String desc) { if(desc==null || desc.trim().equals(""))return; Document doc = parent.getOwnerDocument(); Element descElem = Util4Serializer.addElement(parent, DESCRIPTION); CDATASection cdata = doc.createCDATASection(useJDKTransformerFactory?(" "+desc):desc);//规避jdk的GBK bug descElem.appendChild(cdata); } }