/** * Copyright 2010 JBoss Inc * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.drools.guvnor.server.builder; import java.util.Collection; import org.drools.definition.process.Node; import org.drools.guvnor.client.rulefloweditor.ElementContainerTransferNode; import org.drools.guvnor.client.rulefloweditor.HumanTaskTransferNode; import org.drools.guvnor.client.rulefloweditor.SplitNode; import org.drools.guvnor.client.rulefloweditor.SplitTransferNode; import org.drools.guvnor.client.rulefloweditor.TransferNode; import org.drools.guvnor.client.rulefloweditor.WorkItemTransferNode; import org.drools.guvnor.client.rulefloweditor.TransferNode.Type; import org.drools.process.core.Work; import org.jbpm.ruleflow.core.RuleFlowProcess; import org.jbpm.workflow.core.Constraint; import org.jbpm.workflow.core.impl.ConnectionRef; import org.jbpm.workflow.core.node.CompositeNode; import org.jbpm.workflow.core.node.ForEachNode; import org.jbpm.workflow.core.node.HumanTaskNode; import org.jbpm.workflow.core.node.Split; import org.jbpm.workflow.core.node.WorkItemNode; public class RuleFlowProcessBuilder { public static void updateProcess(RuleFlowProcess process, Collection<TransferNode> contentNodes) { for ( TransferNode tn : contentNodes ) { Node node = process.getNode( tn.getId() ); updateNode( tn, node ); } } // public static void updateContainer(NodeContainer nodeContainer, // Collection<TransferNode> contentNodes) { // // for ( TransferNode tn : contentNodes ) { // // Node node = nodeContainer.getNode( tn.getId() ); // // updateNode( tn, // node ); // } // } private static void updateNode(TransferNode tn, Node node) { /* * At this point only the parameters are editable */ if ( tn instanceof HumanTaskTransferNode ) { updateHumanTask( (HumanTaskTransferNode) tn, (HumanTaskNode) node ); } else if ( tn instanceof WorkItemTransferNode ) { updateWorkItem( (WorkItemTransferNode) tn, (WorkItemNode) node ); } else if ( tn instanceof SplitTransferNode ) { updateSplitNode( (SplitTransferNode) tn, (Split) node ); } else if ( tn instanceof ElementContainerTransferNode ) { if ( tn.getType() == Type.FOR_EACH ) { updateForEach( (ElementContainerTransferNode) tn, (ForEachNode) node ); } else if ( tn.getType() == Type.COMPOSITE ) { updateComposite( (ElementContainerTransferNode) tn, (CompositeNode) node ); } } } private static void updateHumanTask(HumanTaskTransferNode httn, HumanTaskNode humanTaskNode) { Work work = humanTaskNode.getWork(); if ( work != null ) { for ( String key : work.getParameters().keySet() ) { work.setParameter( key, httn.getParameters().get( key ) ); } } } private static void updateWorkItem(WorkItemTransferNode witn, WorkItemNode workItemNode) { Work work = workItemNode.getWork(); if ( work != null ) { for ( String key : work.getParameters().keySet() ) { work.setParameter( key, witn.getParameters().get( key ) ); } } } private static void updateSplitNode(SplitTransferNode stn, Split splitNode) { for ( ConnectionRef connection : splitNode.getConstraints().keySet() ) { final ConnectionRef ref1 = new ConnectionRef( connection.getNodeId(), connection.getToType() ); SplitNode.ConnectionRef ref2 = new SplitNode.ConnectionRef(); ref2.setNodeId( connection.getNodeId() ); ref2.setToType( connection.getToType() ); Constraint c1 = splitNode.internalGetConstraint( ref1 ); SplitNode.Constraint c2 = stn.getConstraints().get( ref2 ); updateConstraint( c1, c2 ); } } private static void updateForEach(ElementContainerTransferNode tn, ForEachNode foreachNode) { for ( TransferNode subTn : tn.getContentModel().getNodes() ) { Node subNode = foreachNode.getNode( subTn.getId() ); updateNode( subTn, subNode ); } } private static void updateComposite(ElementContainerTransferNode tn, CompositeNode compositeNode) { for ( TransferNode subTn : tn.getContentModel().getNodes() ) { Node subNode = compositeNode.getNode( subTn.getId() ); updateNode( subTn, subNode ); } } private static void updateConstraint(Constraint to, org.drools.guvnor.client.rulefloweditor.SplitNode.Constraint from) { to.setConstraint( from.getConstraint() ); to.setDialect( from.getDialect() ); to.setName( from.getName() ); to.setPriority( from.getPriority() ); to.setType( from.getType() ); } }