This is an automated email from the ASF dual-hosted git repository.

egonzalez pushed a commit to branch main
in repository 
https://gitbox.apache.org/repos/asf/incubator-kie-kogito-runtimes.git


The following commit(s) were added to refs/heads/main by this push:
     new b850445eb1 [incubator-kie-issues-1109] Add capability to extends the 
flow builder (#3497)
b850445eb1 is described below

commit b850445eb16423a8689405d912f3d74614274a05
Author: Enrique <[email protected]>
AuthorDate: Mon May 13 08:56:35 2024 +0200

    [incubator-kie-issues-1109] Add capability to extends the flow builder 
(#3497)
    
    This allows includes new nodes dynamically
---
 .../core/RuleFlowNodeContainerFactory.java         | 88 +++++++++++++++-------
 .../jbpm/ruleflow/core/RuleFlowProcessFactory.java |  9 ++-
 .../core/factory/AbstractCompositeNodeFactory.java |  7 +-
 .../ruleflow/core/factory/ActionNodeFactory.java   |  1 +
 .../ruleflow/core/factory/DynamicNodeFactory.java  |  1 +
 .../ruleflow/core/factory/ExtendedNodeFactory.java | 23 ++++++
 .../jbpm/ruleflow/core/factory/NodeFactory.java    | 28 -------
 .../ActionNodeFactoryProvider.java}                | 21 +++---
 .../BoundaryEventNodeFactoryProvider.java}         | 21 +++---
 .../CatchLinkNodeFactoryProvider.java}             | 19 +++--
 .../CompositeContextNodeFactoryProvider.java}      | 19 +++--
 .../DynamicNodeFactoryProvider.java}               | 19 +++--
 .../EndNodeFactoryProvider.java}                   | 19 +++--
 .../EventNodeFactoryProvider.java}                 | 19 +++--
 .../EventSubProcessNodeFactoryProvider.java}       | 19 +++--
 .../FaultNodeFactoryProvider.java}                 | 19 +++--
 .../ForEachNodeFactoryProvider.java}               | 19 +++--
 .../HumanTaskNodeFactoryProvider.java}             | 19 +++--
 .../JoinNodeFactoryProvider.java}                  | 19 +++--
 .../MilestoneNodeFactoryProvider.java}             | 19 +++--
 .../NodeFactoryProvider.java}                      | 15 ++--
 .../provider/NodeFactoryProviderService.java       | 50 ++++++++++++
 .../RuleSetNodeFactoryProvider.java}               | 19 +++--
 .../SplitNodeFactoryProvider.java}                 | 19 +++--
 .../StartNodeFactoryProvider.java}                 | 19 +++--
 .../StateNodeFactoryProvider.java}                 | 19 +++--
 .../SubProcessNodeFactoryProvider.java}            | 19 +++--
 .../ThrowLinkNodeFactoryProvider.java}             | 20 +++--
 .../TimerNodeFactoryProvider.java}                 | 19 +++--
 .../WorkItemNodeFactoryProvider.java}              | 19 +++--
 ...eflow.core.factory.provider.NodeFactoryProvider | 21 ++++++
 .../{examples.model => examples/model}/Movie.java  |  0
 .../model}/MovieGenre.java                         |  0
 .../{examples.model => examples/model}/Rating.java |  0
 .../integrationtests/VersionRestController.java    |  2 +-
 35 files changed, 407 insertions(+), 242 deletions(-)

diff --git 
a/jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/RuleFlowNodeContainerFactory.java
 
b/jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/RuleFlowNodeContainerFactory.java
index 66c1e2e16d..8dbdc4769c 100755
--- 
a/jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/RuleFlowNodeContainerFactory.java
+++ 
b/jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/RuleFlowNodeContainerFactory.java
@@ -34,6 +34,7 @@ import org.jbpm.ruleflow.core.factory.DynamicNodeFactory;
 import org.jbpm.ruleflow.core.factory.EndNodeFactory;
 import org.jbpm.ruleflow.core.factory.EventNodeFactory;
 import org.jbpm.ruleflow.core.factory.EventSubProcessNodeFactory;
+import org.jbpm.ruleflow.core.factory.ExtendedNodeFactory;
 import org.jbpm.ruleflow.core.factory.FaultNodeFactory;
 import org.jbpm.ruleflow.core.factory.ForEachNodeFactory;
 import org.jbpm.ruleflow.core.factory.HumanTaskNodeFactory;
@@ -48,10 +49,32 @@ import org.jbpm.ruleflow.core.factory.SubProcessNodeFactory;
 import org.jbpm.ruleflow.core.factory.ThrowLinkNodeFactory;
 import org.jbpm.ruleflow.core.factory.TimerNodeFactory;
 import org.jbpm.ruleflow.core.factory.WorkItemNodeFactory;
+import org.jbpm.ruleflow.core.factory.provider.NodeFactoryProviderService;
 import org.jbpm.workflow.core.Connection;
 import org.jbpm.workflow.core.NodeContainer;
 import org.jbpm.workflow.core.impl.ConnectionImpl;
 import org.jbpm.workflow.core.impl.DroolsConsequenceAction;
+import org.jbpm.workflow.core.node.ActionNode;
+import org.jbpm.workflow.core.node.BoundaryEventNode;
+import org.jbpm.workflow.core.node.CatchLinkNode;
+import org.jbpm.workflow.core.node.CompositeContextNode;
+import org.jbpm.workflow.core.node.DynamicNode;
+import org.jbpm.workflow.core.node.EndNode;
+import org.jbpm.workflow.core.node.EventNode;
+import org.jbpm.workflow.core.node.EventSubProcessNode;
+import org.jbpm.workflow.core.node.FaultNode;
+import org.jbpm.workflow.core.node.ForEachNode;
+import org.jbpm.workflow.core.node.HumanTaskNode;
+import org.jbpm.workflow.core.node.Join;
+import org.jbpm.workflow.core.node.MilestoneNode;
+import org.jbpm.workflow.core.node.RuleSetNode;
+import org.jbpm.workflow.core.node.Split;
+import org.jbpm.workflow.core.node.StartNode;
+import org.jbpm.workflow.core.node.StateNode;
+import org.jbpm.workflow.core.node.SubProcessNode;
+import org.jbpm.workflow.core.node.ThrowLinkNode;
+import org.jbpm.workflow.core.node.TimerNode;
+import org.jbpm.workflow.core.node.WorkItemNode;
 import org.kie.api.definition.process.Node;
 import org.kie.api.definition.process.WorkflowElementIdentifier;
 
@@ -60,97 +83,106 @@ import static org.jbpm.ruleflow.core.Metadata.HIDDEN;
 import static org.jbpm.ruleflow.core.Metadata.UNIQUE_ID;
 import static org.jbpm.workflow.core.Node.CONNECTION_DEFAULT_TYPE;
 
-public abstract class RuleFlowNodeContainerFactory<T extends 
RuleFlowNodeContainerFactory<T, P>, P extends RuleFlowNodeContainerFactory<P, 
?>> extends NodeFactory<T, P> {
+public abstract class RuleFlowNodeContainerFactory<T extends 
RuleFlowNodeContainerFactory<T, P>, P extends RuleFlowNodeContainerFactory<P, 
?>> extends ExtendedNodeFactory<T, P> {
 
     public static final String METHOD_CONNECTION = "connection";
     public static final String METHOD_ASSOCIATION = "association";
 
-    protected RuleFlowNodeContainerFactory(P nodeContainerFactory, 
NodeContainer nodeContainer, NodeContainer node, WorkflowElementIdentifier id) {
+    private NodeFactoryProviderService provider;
+
+    public RuleFlowNodeContainerFactory(P nodeContainerFactory, NodeContainer 
nodeContainer, org.jbpm.workflow.core.Node node, WorkflowElementIdentifier id) {
         super(nodeContainerFactory, nodeContainer, node, id);
+        provider = new NodeFactoryProviderService();
+    }
+
+    protected abstract NodeContainer getNodeContainer();
+
+    public <R extends NodeFactory<R, T>> R newNode(Class<?> node, 
WorkflowElementIdentifier id) {
+        return provider.newNodeFactory(node, (T) this, getNodeContainer(), id);
     }
 
     public StartNodeFactory<T> startNode(WorkflowElementIdentifier id) {
-        return new StartNodeFactory<>((T) this, (NodeContainer) node, id);
+        return newNode(StartNode.class, id);
     }
 
     public EndNodeFactory<T> endNode(WorkflowElementIdentifier id) {
-        return new EndNodeFactory<>((T) this, (NodeContainer) node, id);
+        return newNode(EndNode.class, id);
     }
 
     public CatchLinkNodeFactory<T> catchLinkNode(WorkflowElementIdentifier id) 
{
-        return new CatchLinkNodeFactory<>((T) this, (NodeContainer) node, id);
+        return newNode(CatchLinkNode.class, id);
     }
 
     public ThrowLinkNodeFactory<T> throwLinkNode(WorkflowElementIdentifier id) 
{
-        return new ThrowLinkNodeFactory<>((T) this, (NodeContainer) node, id);
+        return newNode(ThrowLinkNode.class, id);
     }
 
     public ActionNodeFactory<T> actionNode(WorkflowElementIdentifier id) {
-        return new ActionNodeFactory<>((T) this, (NodeContainer) node, id);
+        return newNode(ActionNode.class, id);
     }
 
     public MilestoneNodeFactory<T> milestoneNode(WorkflowElementIdentifier id) 
{
-        return new MilestoneNodeFactory<>((T) this, (NodeContainer) node, id);
+        return newNode(MilestoneNode.class, id);
     }
 
     public TimerNodeFactory<T> timerNode(WorkflowElementIdentifier id) {
-        return new TimerNodeFactory<>((T) this, (NodeContainer) node, id);
+        return newNode(TimerNode.class, id);
     }
 
     public HumanTaskNodeFactory<T> humanTaskNode(WorkflowElementIdentifier id) 
{
-        return new HumanTaskNodeFactory<>((T) this, (NodeContainer) node, id);
+        return newNode(HumanTaskNode.class, id);
     }
 
     public SubProcessNodeFactory<T> subProcessNode(WorkflowElementIdentifier 
id) {
-        return new SubProcessNodeFactory<>((T) this, (NodeContainer) node, id);
+        return newNode(SubProcessNode.class, id);
     }
 
     public SplitFactory<T> splitNode(WorkflowElementIdentifier id) {
-        return new SplitFactory<>((T) this, (NodeContainer) node, id);
+        return newNode(Split.class, id);
     }
 
     public JoinFactory<T> joinNode(WorkflowElementIdentifier id) {
-        return new JoinFactory<>((T) this, (NodeContainer) node, id);
+        return newNode(Join.class, id);
     }
 
     public RuleSetNodeFactory<T> ruleSetNode(WorkflowElementIdentifier id) {
-        return new RuleSetNodeFactory<>((T) this, (NodeContainer) node, id);
+        return newNode(RuleSetNode.class, id);
     }
 
     public FaultNodeFactory<T> faultNode(WorkflowElementIdentifier id) {
-        return new FaultNodeFactory<>((T) this, (NodeContainer) node, id);
+        return newNode(FaultNode.class, id);
     }
 
     public EventNodeFactory<T> eventNode(WorkflowElementIdentifier id) {
-        return new EventNodeFactory<>((T) this, (NodeContainer) node, id);
+        return newNode(EventNode.class, id);
     }
 
     public BoundaryEventNodeFactory<T> 
boundaryEventNode(WorkflowElementIdentifier id) {
-        return new BoundaryEventNodeFactory<>((T) this, (NodeContainer) node, 
id);
+        return newNode(BoundaryEventNode.class, id);
     }
 
     public CompositeContextNodeFactory<T> 
compositeContextNode(WorkflowElementIdentifier id) {
-        return new CompositeContextNodeFactory<>((T) this, (NodeContainer) 
node, id);
+        return newNode(CompositeContextNode.class, id);
     }
 
     public ForEachNodeFactory<T> forEachNode(WorkflowElementIdentifier id) {
-        return new ForEachNodeFactory<>((T) this, (NodeContainer) node, id);
+        return newNode(ForEachNode.class, id);
     }
 
     public DynamicNodeFactory<T> dynamicNode(WorkflowElementIdentifier id) {
-        return new DynamicNodeFactory<>((T) this, (NodeContainer) node, id);
+        return newNode(DynamicNode.class, id);
     }
 
     public WorkItemNodeFactory<T> workItemNode(WorkflowElementIdentifier id) {
-        return new WorkItemNodeFactory<>((T) this, (NodeContainer) node, id);
+        return newNode(WorkItemNode.class, id);
     }
 
     public EventSubProcessNodeFactory<T> 
eventSubProcessNode(WorkflowElementIdentifier id) {
-        return new EventSubProcessNodeFactory<>((T) this, (NodeContainer) 
node, id);
+        return newNode(EventSubProcessNode.class, id);
     }
 
     public StateNodeFactory<T> stateNode(WorkflowElementIdentifier id) {
-        return new StateNodeFactory<>((T) this, (NodeContainer) node, id);
+        return newNode(StateNode.class, id);
     }
 
     public T connection(WorkflowElementIdentifier fromId, 
WorkflowElementIdentifier toId) {
@@ -170,8 +202,8 @@ public abstract class RuleFlowNodeContainerFactory<T 
extends RuleFlowNodeContain
     }
 
     private Connection getConnection(WorkflowElementIdentifier fromId, 
WorkflowElementIdentifier toId, String uniqueId) {
-        Node from = ((NodeContainer) node).getNode(fromId);
-        Node to = ((NodeContainer) node).getNode(toId);
+        Node from = ((NodeContainer) getNodeContainer()).getNode(fromId);
+        Node to = ((NodeContainer) getNodeContainer()).getNode(toId);
         Connection connection = new ConnectionImpl(from, 
CONNECTION_DEFAULT_TYPE, to, CONNECTION_DEFAULT_TYPE);
         if (uniqueId != null) {
             connection.setMetaData(UNIQUE_ID, uniqueId);
@@ -212,7 +244,7 @@ public abstract class RuleFlowNodeContainerFactory<T 
extends RuleFlowNodeContain
     public abstract T variable(String name, DataType type, Object value, 
String metaDataName, Object metaDataValue);
 
     private <S extends Context> S getScope(String scopeType, Class<S> 
scopeClass) {
-        ContextContainer contextContainer = (ContextContainer) node;
+        ContextContainer contextContainer = (ContextContainer) 
getNodeContainer();
         Context scope = contextContainer.getDefaultContext(scopeType);
         if (scope == null) {
             try {
@@ -227,9 +259,9 @@ public abstract class RuleFlowNodeContainerFactory<T 
extends RuleFlowNodeContain
     }
 
     public RuleFlowNodeContainerFactory<T, P> addCompensationContext(String 
contextId) {
-        if (node instanceof ContextContainer) {
+        if (getNodeContainer() instanceof ContextContainer) {
             CompensationScope compensationScope = new CompensationScope();
-            ContextContainer contextNode = (ContextContainer) node;
+            ContextContainer contextNode = (ContextContainer) 
getNodeContainer();
             contextNode.addContext(compensationScope);
             contextNode.setDefaultContext(compensationScope);
             compensationScope.setContextContainerId(contextId);
diff --git 
a/jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/RuleFlowProcessFactory.java
 
b/jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/RuleFlowProcessFactory.java
index 881a28be78..a0acf5d140 100755
--- 
a/jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/RuleFlowProcessFactory.java
+++ 
b/jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/RuleFlowProcessFactory.java
@@ -95,8 +95,13 @@ public class RuleFlowProcessFactory extends 
RuleFlowNodeContainerFactory<RuleFlo
         return new RuleFlowProcessFactory(id, autoComplete);
     }
 
+    @Override
+    protected org.jbpm.workflow.core.NodeContainer getNodeContainer() {
+        return nodeContainer;
+    }
+
     protected RuleFlowProcessFactory(String id, boolean autoComplete) {
-        super(null, null, new RuleFlowProcess(), 
WorkflowElementIdentifierFactory.fromExternalFormat(id));
+        super(null, new RuleFlowProcess(), null, 
WorkflowElementIdentifierFactory.fromExternalFormat(id));
         getRuleFlowProcess().setAutoComplete(autoComplete);
     }
 
@@ -111,7 +116,7 @@ public class RuleFlowProcessFactory extends 
RuleFlowNodeContainerFactory<RuleFlo
     }
 
     protected RuleFlowProcess getRuleFlowProcess() {
-        return (RuleFlowProcess) node;
+        return (RuleFlowProcess) nodeContainer;
     }
 
     @Override
diff --git 
a/jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/factory/AbstractCompositeNodeFactory.java
 
b/jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/factory/AbstractCompositeNodeFactory.java
index 329534bbed..aacc99b20b 100644
--- 
a/jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/factory/AbstractCompositeNodeFactory.java
+++ 
b/jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/factory/AbstractCompositeNodeFactory.java
@@ -33,10 +33,15 @@ public abstract class AbstractCompositeNodeFactory<T 
extends RuleFlowNodeContain
     private WorkflowElementIdentifier linkedIncomingNodeId;
     private WorkflowElementIdentifier linkedOutgoingNodeId;
 
-    protected AbstractCompositeNodeFactory(P nodeContainerFactory, 
NodeContainer nodeContainer, NodeContainer node, WorkflowElementIdentifier id) {
+    protected AbstractCompositeNodeFactory(P nodeContainerFactory, 
NodeContainer nodeContainer, org.jbpm.workflow.core.Node node, 
WorkflowElementIdentifier id) {
         super(nodeContainerFactory, nodeContainer, node, id);
     }
 
+    @Override
+    protected NodeContainer getNodeContainer() {
+        return getCompositeNode();
+    }
+
     protected CompositeContextNode getCompositeNode() {
         return (CompositeContextNode) node;
     }
diff --git 
a/jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/factory/ActionNodeFactory.java
 
b/jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/factory/ActionNodeFactory.java
index 9ee08577ce..0df6e53d31 100755
--- 
a/jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/factory/ActionNodeFactory.java
+++ 
b/jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/factory/ActionNodeFactory.java
@@ -71,4 +71,5 @@ public class ActionNodeFactory<T extends 
RuleFlowNodeContainerFactory<T, ?>> ext
         getActionNode().setAction(droolsAction);
         return this;
     }
+
 }
diff --git 
a/jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/factory/DynamicNodeFactory.java
 
b/jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/factory/DynamicNodeFactory.java
index 8c9dffb8ce..53acb5bcdc 100755
--- 
a/jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/factory/DynamicNodeFactory.java
+++ 
b/jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/factory/DynamicNodeFactory.java
@@ -54,4 +54,5 @@ public class DynamicNodeFactory<T extends 
RuleFlowNodeContainerFactory<T, ?>> ex
         getDynamicNode().setCompletionExpression(completionExpression);
         return this;
     }
+
 }
diff --git 
a/jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/factory/ExtendedNodeFactory.java
 
b/jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/factory/ExtendedNodeFactory.java
index 0a22a65261..9eecb0bbf1 100755
--- 
a/jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/factory/ExtendedNodeFactory.java
+++ 
b/jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/factory/ExtendedNodeFactory.java
@@ -18,9 +18,13 @@
  */
 package org.jbpm.ruleflow.core.factory;
 
+import java.util.ArrayList;
+
+import org.jbpm.process.instance.impl.Action;
 import org.jbpm.ruleflow.core.RuleFlowNodeContainerFactory;
 import org.jbpm.workflow.core.Node;
 import org.jbpm.workflow.core.NodeContainer;
+import org.jbpm.workflow.core.impl.DroolsConsequenceAction;
 import org.jbpm.workflow.core.impl.ExtendedNodeImpl;
 import org.kie.api.definition.process.WorkflowElementIdentifier;
 
@@ -34,4 +38,23 @@ public abstract class ExtendedNodeFactory<T extends 
NodeFactory<T, P>, P extends
         return (ExtendedNodeImpl) getNode();
     }
 
+    public T onEntryAction(String dialect, String action) {
+        return onActionScript(ExtendedNodeImpl.EVENT_NODE_ENTER, dialect, 
action, null);
+    }
+
+    public T onExitAction(String dialect, String action) {
+        return onActionScript(ExtendedNodeImpl.EVENT_NODE_EXIT, dialect, 
action, null);
+    }
+
+    public T onActionScript(String type, String dialect, String script, Action 
compiledScript) {
+        DroolsConsequenceAction action = new DroolsConsequenceAction(dialect, 
script);
+        if (compiledScript != null) {
+            action.setMetaData("Action", compiledScript);
+        }
+        if (getExtendedNode().getActions(type) == null) {
+            getExtendedNode().setActions(type, new ArrayList<>());
+        }
+        getExtendedNode().getActions(type).add(action);
+        return (T) this;
+    }
 }
diff --git 
a/jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/factory/NodeFactory.java 
b/jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/factory/NodeFactory.java
index ba22a6d53b..bcbfb1f475 100755
--- 
a/jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/factory/NodeFactory.java
+++ 
b/jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/factory/NodeFactory.java
@@ -18,15 +18,10 @@
  */
 package org.jbpm.ruleflow.core.factory;
 
-import java.util.ArrayList;
-
 import org.jbpm.process.core.context.variable.Mappable;
-import org.jbpm.process.instance.impl.Action;
 import org.jbpm.ruleflow.core.RuleFlowNodeContainerFactory;
 import org.jbpm.workflow.core.Node;
 import org.jbpm.workflow.core.NodeContainer;
-import org.jbpm.workflow.core.impl.DroolsConsequenceAction;
-import org.jbpm.workflow.core.impl.ExtendedNodeImpl;
 import org.kie.api.definition.process.WorkflowElementIdentifier;
 
 public abstract class NodeFactory<T extends NodeFactory<T, P>, P extends 
RuleFlowNodeContainerFactory<P, ?>> implements MappableNodeFactory<T> {
@@ -76,27 +71,4 @@ public abstract class NodeFactory<T extends NodeFactory<T, 
P>, P extends RuleFlo
         return (Mappable) node;
     }
 
-    public T onEntryAction(String dialect, String action) {
-        return onActionScript(ExtendedNodeImpl.EVENT_NODE_ENTER, dialect, 
action, null);
-    }
-
-    public T onExitAction(String dialect, String action) {
-        return onActionScript(ExtendedNodeImpl.EVENT_NODE_EXIT, dialect, 
action, null);
-    }
-
-    public T onActionScript(String type, String dialect, String script, Action 
compiledScript) {
-        DroolsConsequenceAction action = new DroolsConsequenceAction(dialect, 
script);
-        if (compiledScript != null) {
-            action.setMetaData("Action", compiledScript);
-        }
-        if (getExtendedNode().getActions(type) == null) {
-            getExtendedNode().setActions(type, new ArrayList<>());
-        }
-        getExtendedNode().getActions(type).add(action);
-        return (T) this;
-    }
-
-    private ExtendedNodeImpl getExtendedNode() {
-        return (ExtendedNodeImpl) getNode();
-    }
 }
diff --git 
a/jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/factory/ExtendedNodeFactory.java
 
b/jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/factory/provider/ActionNodeFactoryProvider.java
old mode 100755
new mode 100644
similarity index 60%
copy from 
jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/factory/ExtendedNodeFactory.java
copy to 
jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/factory/provider/ActionNodeFactoryProvider.java
index 0a22a65261..7bf44360bf
--- 
a/jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/factory/ExtendedNodeFactory.java
+++ 
b/jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/factory/provider/ActionNodeFactoryProvider.java
@@ -16,22 +16,23 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.jbpm.ruleflow.core.factory;
+package org.jbpm.ruleflow.core.factory.provider;
 
 import org.jbpm.ruleflow.core.RuleFlowNodeContainerFactory;
-import org.jbpm.workflow.core.Node;
+import org.jbpm.ruleflow.core.factory.ActionNodeFactory;
+import org.jbpm.ruleflow.core.factory.NodeFactory;
 import org.jbpm.workflow.core.NodeContainer;
-import org.jbpm.workflow.core.impl.ExtendedNodeImpl;
+import org.jbpm.workflow.core.node.ActionNode;
 import org.kie.api.definition.process.WorkflowElementIdentifier;
 
-public abstract class ExtendedNodeFactory<T extends NodeFactory<T, P>, P 
extends RuleFlowNodeContainerFactory<P, ?>> extends NodeFactory<T, P> {
-
-    protected ExtendedNodeFactory(P nodeContainerFactory, NodeContainer 
nodeContainer, Node node, WorkflowElementIdentifier id) {
-        super(nodeContainerFactory, nodeContainer, node, id);
+public class ActionNodeFactoryProvider implements NodeFactoryProvider {
+    @Override
+    public boolean accept(Class<?> type) {
+        return ActionNode.class.equals(type);
     }
 
-    protected ExtendedNodeImpl getExtendedNode() {
-        return (ExtendedNodeImpl) getNode();
+    @Override
+    public <R extends NodeFactory<R, P>, P extends 
RuleFlowNodeContainerFactory<P, ?>> R provide(P nodeContainerFactory, 
NodeContainer container, WorkflowElementIdentifier id) {
+        return (R) new ActionNodeFactory<P>(nodeContainerFactory, container, 
id);
     }
-
 }
diff --git 
a/jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/factory/ExtendedNodeFactory.java
 
b/jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/factory/provider/BoundaryEventNodeFactoryProvider.java
old mode 100755
new mode 100644
similarity index 59%
copy from 
jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/factory/ExtendedNodeFactory.java
copy to 
jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/factory/provider/BoundaryEventNodeFactoryProvider.java
index 0a22a65261..ef90041777
--- 
a/jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/factory/ExtendedNodeFactory.java
+++ 
b/jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/factory/provider/BoundaryEventNodeFactoryProvider.java
@@ -16,22 +16,23 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.jbpm.ruleflow.core.factory;
+package org.jbpm.ruleflow.core.factory.provider;
 
 import org.jbpm.ruleflow.core.RuleFlowNodeContainerFactory;
-import org.jbpm.workflow.core.Node;
+import org.jbpm.ruleflow.core.factory.BoundaryEventNodeFactory;
+import org.jbpm.ruleflow.core.factory.NodeFactory;
 import org.jbpm.workflow.core.NodeContainer;
-import org.jbpm.workflow.core.impl.ExtendedNodeImpl;
+import org.jbpm.workflow.core.node.BoundaryEventNode;
 import org.kie.api.definition.process.WorkflowElementIdentifier;
 
-public abstract class ExtendedNodeFactory<T extends NodeFactory<T, P>, P 
extends RuleFlowNodeContainerFactory<P, ?>> extends NodeFactory<T, P> {
-
-    protected ExtendedNodeFactory(P nodeContainerFactory, NodeContainer 
nodeContainer, Node node, WorkflowElementIdentifier id) {
-        super(nodeContainerFactory, nodeContainer, node, id);
+public class BoundaryEventNodeFactoryProvider implements NodeFactoryProvider {
+    @Override
+    public boolean accept(Class<?> type) {
+        return BoundaryEventNode.class.equals(type);
     }
 
-    protected ExtendedNodeImpl getExtendedNode() {
-        return (ExtendedNodeImpl) getNode();
+    @Override
+    public <R extends NodeFactory<R, P>, P extends 
RuleFlowNodeContainerFactory<P, ?>> R provide(P nodeContainerFactory, 
NodeContainer container, WorkflowElementIdentifier id) {
+        return (R) new BoundaryEventNodeFactory<P>(nodeContainerFactory, 
container, id);
     }
-
 }
diff --git 
a/jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/factory/ExtendedNodeFactory.java
 
b/jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/factory/provider/CatchLinkNodeFactoryProvider.java
old mode 100755
new mode 100644
similarity index 59%
copy from 
jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/factory/ExtendedNodeFactory.java
copy to 
jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/factory/provider/CatchLinkNodeFactoryProvider.java
index 0a22a65261..5f74211ae8
--- 
a/jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/factory/ExtendedNodeFactory.java
+++ 
b/jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/factory/provider/CatchLinkNodeFactoryProvider.java
@@ -16,22 +16,25 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.jbpm.ruleflow.core.factory;
+package org.jbpm.ruleflow.core.factory.provider;
 
 import org.jbpm.ruleflow.core.RuleFlowNodeContainerFactory;
-import org.jbpm.workflow.core.Node;
+import org.jbpm.ruleflow.core.factory.CatchLinkNodeFactory;
+import org.jbpm.ruleflow.core.factory.NodeFactory;
 import org.jbpm.workflow.core.NodeContainer;
-import org.jbpm.workflow.core.impl.ExtendedNodeImpl;
+import org.jbpm.workflow.core.node.CatchLinkNode;
 import org.kie.api.definition.process.WorkflowElementIdentifier;
 
-public abstract class ExtendedNodeFactory<T extends NodeFactory<T, P>, P 
extends RuleFlowNodeContainerFactory<P, ?>> extends NodeFactory<T, P> {
+public class CatchLinkNodeFactoryProvider implements NodeFactoryProvider {
 
-    protected ExtendedNodeFactory(P nodeContainerFactory, NodeContainer 
nodeContainer, Node node, WorkflowElementIdentifier id) {
-        super(nodeContainerFactory, nodeContainer, node, id);
+    @Override
+    public boolean accept(Class<?> type) {
+        return CatchLinkNode.class.equals(type);
     }
 
-    protected ExtendedNodeImpl getExtendedNode() {
-        return (ExtendedNodeImpl) getNode();
+    @Override
+    public <T extends NodeFactory<T, P>, P extends 
RuleFlowNodeContainerFactory<P, ?>> T provide(P nodeContainerFactory, 
NodeContainer container, WorkflowElementIdentifier id) {
+        return (T) new CatchLinkNodeFactory<P>(nodeContainerFactory, 
container, id);
     }
 
 }
diff --git 
a/jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/factory/ExtendedNodeFactory.java
 
b/jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/factory/provider/CompositeContextNodeFactoryProvider.java
old mode 100755
new mode 100644
similarity index 58%
copy from 
jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/factory/ExtendedNodeFactory.java
copy to 
jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/factory/provider/CompositeContextNodeFactoryProvider.java
index 0a22a65261..8dbe4255aa
--- 
a/jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/factory/ExtendedNodeFactory.java
+++ 
b/jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/factory/provider/CompositeContextNodeFactoryProvider.java
@@ -16,22 +16,25 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.jbpm.ruleflow.core.factory;
+package org.jbpm.ruleflow.core.factory.provider;
 
 import org.jbpm.ruleflow.core.RuleFlowNodeContainerFactory;
-import org.jbpm.workflow.core.Node;
+import org.jbpm.ruleflow.core.factory.CompositeContextNodeFactory;
+import org.jbpm.ruleflow.core.factory.NodeFactory;
 import org.jbpm.workflow.core.NodeContainer;
-import org.jbpm.workflow.core.impl.ExtendedNodeImpl;
+import org.jbpm.workflow.core.node.CompositeContextNode;
 import org.kie.api.definition.process.WorkflowElementIdentifier;
 
-public abstract class ExtendedNodeFactory<T extends NodeFactory<T, P>, P 
extends RuleFlowNodeContainerFactory<P, ?>> extends NodeFactory<T, P> {
+public class CompositeContextNodeFactoryProvider implements 
NodeFactoryProvider {
 
-    protected ExtendedNodeFactory(P nodeContainerFactory, NodeContainer 
nodeContainer, Node node, WorkflowElementIdentifier id) {
-        super(nodeContainerFactory, nodeContainer, node, id);
+    @Override
+    public boolean accept(Class<?> type) {
+        return CompositeContextNode.class.equals(type);
     }
 
-    protected ExtendedNodeImpl getExtendedNode() {
-        return (ExtendedNodeImpl) getNode();
+    @Override
+    public <R extends NodeFactory<R, P>, P extends 
RuleFlowNodeContainerFactory<P, ?>> R provide(P nodeContainerFactory, 
NodeContainer container, WorkflowElementIdentifier id) {
+        return (R) new CompositeContextNodeFactory(nodeContainerFactory, 
container, id);
     }
 
 }
diff --git 
a/jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/factory/ExtendedNodeFactory.java
 
b/jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/factory/provider/DynamicNodeFactoryProvider.java
old mode 100755
new mode 100644
similarity index 60%
copy from 
jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/factory/ExtendedNodeFactory.java
copy to 
jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/factory/provider/DynamicNodeFactoryProvider.java
index 0a22a65261..915a273ffe
--- 
a/jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/factory/ExtendedNodeFactory.java
+++ 
b/jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/factory/provider/DynamicNodeFactoryProvider.java
@@ -16,22 +16,25 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.jbpm.ruleflow.core.factory;
+package org.jbpm.ruleflow.core.factory.provider;
 
 import org.jbpm.ruleflow.core.RuleFlowNodeContainerFactory;
-import org.jbpm.workflow.core.Node;
+import org.jbpm.ruleflow.core.factory.DynamicNodeFactory;
+import org.jbpm.ruleflow.core.factory.NodeFactory;
 import org.jbpm.workflow.core.NodeContainer;
-import org.jbpm.workflow.core.impl.ExtendedNodeImpl;
+import org.jbpm.workflow.core.node.DynamicNode;
 import org.kie.api.definition.process.WorkflowElementIdentifier;
 
-public abstract class ExtendedNodeFactory<T extends NodeFactory<T, P>, P 
extends RuleFlowNodeContainerFactory<P, ?>> extends NodeFactory<T, P> {
+public class DynamicNodeFactoryProvider implements NodeFactoryProvider {
 
-    protected ExtendedNodeFactory(P nodeContainerFactory, NodeContainer 
nodeContainer, Node node, WorkflowElementIdentifier id) {
-        super(nodeContainerFactory, nodeContainer, node, id);
+    @Override
+    public boolean accept(Class<?> type) {
+        return DynamicNode.class.equals(type);
     }
 
-    protected ExtendedNodeImpl getExtendedNode() {
-        return (ExtendedNodeImpl) getNode();
+    @Override
+    public <R extends NodeFactory<R, P>, P extends 
RuleFlowNodeContainerFactory<P, ?>> R provide(P nodeContainerFactory, 
NodeContainer container, WorkflowElementIdentifier id) {
+        return (R) new DynamicNodeFactory<P>(nodeContainerFactory, container, 
id);
     }
 
 }
diff --git 
a/jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/factory/ExtendedNodeFactory.java
 
b/jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/factory/provider/EndNodeFactoryProvider.java
old mode 100755
new mode 100644
similarity index 60%
copy from 
jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/factory/ExtendedNodeFactory.java
copy to 
jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/factory/provider/EndNodeFactoryProvider.java
index 0a22a65261..17ada6a17f
--- 
a/jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/factory/ExtendedNodeFactory.java
+++ 
b/jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/factory/provider/EndNodeFactoryProvider.java
@@ -16,22 +16,25 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.jbpm.ruleflow.core.factory;
+package org.jbpm.ruleflow.core.factory.provider;
 
 import org.jbpm.ruleflow.core.RuleFlowNodeContainerFactory;
-import org.jbpm.workflow.core.Node;
+import org.jbpm.ruleflow.core.factory.EndNodeFactory;
+import org.jbpm.ruleflow.core.factory.NodeFactory;
 import org.jbpm.workflow.core.NodeContainer;
-import org.jbpm.workflow.core.impl.ExtendedNodeImpl;
+import org.jbpm.workflow.core.node.EndNode;
 import org.kie.api.definition.process.WorkflowElementIdentifier;
 
-public abstract class ExtendedNodeFactory<T extends NodeFactory<T, P>, P 
extends RuleFlowNodeContainerFactory<P, ?>> extends NodeFactory<T, P> {
+public class EndNodeFactoryProvider implements NodeFactoryProvider {
 
-    protected ExtendedNodeFactory(P nodeContainerFactory, NodeContainer 
nodeContainer, Node node, WorkflowElementIdentifier id) {
-        super(nodeContainerFactory, nodeContainer, node, id);
+    @Override
+    public boolean accept(Class<?> type) {
+        return EndNode.class.equals(type);
     }
 
-    protected ExtendedNodeImpl getExtendedNode() {
-        return (ExtendedNodeImpl) getNode();
+    @Override
+    public <T extends NodeFactory<T, P>, P extends 
RuleFlowNodeContainerFactory<P, ?>> T provide(P nodeContainerFactory, 
NodeContainer container, WorkflowElementIdentifier id) {
+        return (T) new EndNodeFactory<P>(nodeContainerFactory, container, id);
     }
 
 }
diff --git 
a/jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/factory/ExtendedNodeFactory.java
 
b/jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/factory/provider/EventNodeFactoryProvider.java
old mode 100755
new mode 100644
similarity index 60%
copy from 
jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/factory/ExtendedNodeFactory.java
copy to 
jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/factory/provider/EventNodeFactoryProvider.java
index 0a22a65261..c0643fa38e
--- 
a/jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/factory/ExtendedNodeFactory.java
+++ 
b/jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/factory/provider/EventNodeFactoryProvider.java
@@ -16,22 +16,25 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.jbpm.ruleflow.core.factory;
+package org.jbpm.ruleflow.core.factory.provider;
 
 import org.jbpm.ruleflow.core.RuleFlowNodeContainerFactory;
-import org.jbpm.workflow.core.Node;
+import org.jbpm.ruleflow.core.factory.EventNodeFactory;
+import org.jbpm.ruleflow.core.factory.NodeFactory;
 import org.jbpm.workflow.core.NodeContainer;
-import org.jbpm.workflow.core.impl.ExtendedNodeImpl;
+import org.jbpm.workflow.core.node.EventNode;
 import org.kie.api.definition.process.WorkflowElementIdentifier;
 
-public abstract class ExtendedNodeFactory<T extends NodeFactory<T, P>, P 
extends RuleFlowNodeContainerFactory<P, ?>> extends NodeFactory<T, P> {
+public class EventNodeFactoryProvider implements NodeFactoryProvider {
 
-    protected ExtendedNodeFactory(P nodeContainerFactory, NodeContainer 
nodeContainer, Node node, WorkflowElementIdentifier id) {
-        super(nodeContainerFactory, nodeContainer, node, id);
+    @Override
+    public boolean accept(Class<?> type) {
+        return EventNode.class.equals(type);
     }
 
-    protected ExtendedNodeImpl getExtendedNode() {
-        return (ExtendedNodeImpl) getNode();
+    @Override
+    public <R extends NodeFactory<R, P>, P extends 
RuleFlowNodeContainerFactory<P, ?>> R provide(P nodeContainerFactory, 
NodeContainer container, WorkflowElementIdentifier id) {
+        return (R) new EventNodeFactory<P>(nodeContainerFactory, container, 
id);
     }
 
 }
diff --git 
a/jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/factory/ExtendedNodeFactory.java
 
b/jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/factory/provider/EventSubProcessNodeFactoryProvider.java
old mode 100755
new mode 100644
similarity index 58%
copy from 
jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/factory/ExtendedNodeFactory.java
copy to 
jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/factory/provider/EventSubProcessNodeFactoryProvider.java
index 0a22a65261..91c10cba38
--- 
a/jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/factory/ExtendedNodeFactory.java
+++ 
b/jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/factory/provider/EventSubProcessNodeFactoryProvider.java
@@ -16,22 +16,25 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.jbpm.ruleflow.core.factory;
+package org.jbpm.ruleflow.core.factory.provider;
 
 import org.jbpm.ruleflow.core.RuleFlowNodeContainerFactory;
-import org.jbpm.workflow.core.Node;
+import org.jbpm.ruleflow.core.factory.EventSubProcessNodeFactory;
+import org.jbpm.ruleflow.core.factory.NodeFactory;
 import org.jbpm.workflow.core.NodeContainer;
-import org.jbpm.workflow.core.impl.ExtendedNodeImpl;
+import org.jbpm.workflow.core.node.EventSubProcessNode;
 import org.kie.api.definition.process.WorkflowElementIdentifier;
 
-public abstract class ExtendedNodeFactory<T extends NodeFactory<T, P>, P 
extends RuleFlowNodeContainerFactory<P, ?>> extends NodeFactory<T, P> {
+public class EventSubProcessNodeFactoryProvider implements NodeFactoryProvider 
{
 
-    protected ExtendedNodeFactory(P nodeContainerFactory, NodeContainer 
nodeContainer, Node node, WorkflowElementIdentifier id) {
-        super(nodeContainerFactory, nodeContainer, node, id);
+    @Override
+    public boolean accept(Class<?> type) {
+        return EventSubProcessNode.class.equals(type);
     }
 
-    protected ExtendedNodeImpl getExtendedNode() {
-        return (ExtendedNodeImpl) getNode();
+    @Override
+    public <R extends NodeFactory<R, P>, P extends 
RuleFlowNodeContainerFactory<P, ?>> R provide(P nodeContainerFactory, 
NodeContainer container, WorkflowElementIdentifier id) {
+        return (R) new EventSubProcessNodeFactory<P>(nodeContainerFactory, 
container, id);
     }
 
 }
diff --git 
a/jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/factory/ExtendedNodeFactory.java
 
b/jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/factory/provider/FaultNodeFactoryProvider.java
old mode 100755
new mode 100644
similarity index 60%
copy from 
jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/factory/ExtendedNodeFactory.java
copy to 
jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/factory/provider/FaultNodeFactoryProvider.java
index 0a22a65261..f5922d1392
--- 
a/jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/factory/ExtendedNodeFactory.java
+++ 
b/jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/factory/provider/FaultNodeFactoryProvider.java
@@ -16,22 +16,25 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.jbpm.ruleflow.core.factory;
+package org.jbpm.ruleflow.core.factory.provider;
 
 import org.jbpm.ruleflow.core.RuleFlowNodeContainerFactory;
-import org.jbpm.workflow.core.Node;
+import org.jbpm.ruleflow.core.factory.FaultNodeFactory;
+import org.jbpm.ruleflow.core.factory.NodeFactory;
 import org.jbpm.workflow.core.NodeContainer;
-import org.jbpm.workflow.core.impl.ExtendedNodeImpl;
+import org.jbpm.workflow.core.node.FaultNode;
 import org.kie.api.definition.process.WorkflowElementIdentifier;
 
-public abstract class ExtendedNodeFactory<T extends NodeFactory<T, P>, P 
extends RuleFlowNodeContainerFactory<P, ?>> extends NodeFactory<T, P> {
+public class FaultNodeFactoryProvider implements NodeFactoryProvider {
 
-    protected ExtendedNodeFactory(P nodeContainerFactory, NodeContainer 
nodeContainer, Node node, WorkflowElementIdentifier id) {
-        super(nodeContainerFactory, nodeContainer, node, id);
+    @Override
+    public boolean accept(Class<?> type) {
+        return FaultNode.class.equals(type);
     }
 
-    protected ExtendedNodeImpl getExtendedNode() {
-        return (ExtendedNodeImpl) getNode();
+    @Override
+    public <R extends NodeFactory<R, P>, P extends 
RuleFlowNodeContainerFactory<P, ?>> R provide(P nodeContainerFactory, 
NodeContainer container, WorkflowElementIdentifier id) {
+        return (R) new FaultNodeFactory(nodeContainerFactory, container, id);
     }
 
 }
diff --git 
a/jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/factory/ExtendedNodeFactory.java
 
b/jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/factory/provider/ForEachNodeFactoryProvider.java
old mode 100755
new mode 100644
similarity index 60%
copy from 
jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/factory/ExtendedNodeFactory.java
copy to 
jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/factory/provider/ForEachNodeFactoryProvider.java
index 0a22a65261..750c759166
--- 
a/jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/factory/ExtendedNodeFactory.java
+++ 
b/jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/factory/provider/ForEachNodeFactoryProvider.java
@@ -16,22 +16,25 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.jbpm.ruleflow.core.factory;
+package org.jbpm.ruleflow.core.factory.provider;
 
 import org.jbpm.ruleflow.core.RuleFlowNodeContainerFactory;
-import org.jbpm.workflow.core.Node;
+import org.jbpm.ruleflow.core.factory.ForEachNodeFactory;
+import org.jbpm.ruleflow.core.factory.NodeFactory;
 import org.jbpm.workflow.core.NodeContainer;
-import org.jbpm.workflow.core.impl.ExtendedNodeImpl;
+import org.jbpm.workflow.core.node.ForEachNode;
 import org.kie.api.definition.process.WorkflowElementIdentifier;
 
-public abstract class ExtendedNodeFactory<T extends NodeFactory<T, P>, P 
extends RuleFlowNodeContainerFactory<P, ?>> extends NodeFactory<T, P> {
+public class ForEachNodeFactoryProvider implements NodeFactoryProvider {
 
-    protected ExtendedNodeFactory(P nodeContainerFactory, NodeContainer 
nodeContainer, Node node, WorkflowElementIdentifier id) {
-        super(nodeContainerFactory, nodeContainer, node, id);
+    @Override
+    public boolean accept(Class<?> type) {
+        return ForEachNode.class.equals(type);
     }
 
-    protected ExtendedNodeImpl getExtendedNode() {
-        return (ExtendedNodeImpl) getNode();
+    @Override
+    public <R extends NodeFactory<R, P>, P extends 
RuleFlowNodeContainerFactory<P, ?>> R provide(P nodeContainerFactory, 
NodeContainer container, WorkflowElementIdentifier id) {
+        return (R) new ForEachNodeFactory<P>(nodeContainerFactory, container, 
id);
     }
 
 }
diff --git 
a/jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/factory/ExtendedNodeFactory.java
 
b/jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/factory/provider/HumanTaskNodeFactoryProvider.java
old mode 100755
new mode 100644
similarity index 59%
copy from 
jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/factory/ExtendedNodeFactory.java
copy to 
jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/factory/provider/HumanTaskNodeFactoryProvider.java
index 0a22a65261..7a11553d8a
--- 
a/jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/factory/ExtendedNodeFactory.java
+++ 
b/jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/factory/provider/HumanTaskNodeFactoryProvider.java
@@ -16,22 +16,25 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.jbpm.ruleflow.core.factory;
+package org.jbpm.ruleflow.core.factory.provider;
 
 import org.jbpm.ruleflow.core.RuleFlowNodeContainerFactory;
-import org.jbpm.workflow.core.Node;
+import org.jbpm.ruleflow.core.factory.HumanTaskNodeFactory;
+import org.jbpm.ruleflow.core.factory.NodeFactory;
 import org.jbpm.workflow.core.NodeContainer;
-import org.jbpm.workflow.core.impl.ExtendedNodeImpl;
+import org.jbpm.workflow.core.node.HumanTaskNode;
 import org.kie.api.definition.process.WorkflowElementIdentifier;
 
-public abstract class ExtendedNodeFactory<T extends NodeFactory<T, P>, P 
extends RuleFlowNodeContainerFactory<P, ?>> extends NodeFactory<T, P> {
+public class HumanTaskNodeFactoryProvider implements NodeFactoryProvider {
 
-    protected ExtendedNodeFactory(P nodeContainerFactory, NodeContainer 
nodeContainer, Node node, WorkflowElementIdentifier id) {
-        super(nodeContainerFactory, nodeContainer, node, id);
+    @Override
+    public boolean accept(Class<?> type) {
+        return HumanTaskNode.class.equals(type);
     }
 
-    protected ExtendedNodeImpl getExtendedNode() {
-        return (ExtendedNodeImpl) getNode();
+    @Override
+    public <R extends NodeFactory<R, P>, P extends 
RuleFlowNodeContainerFactory<P, ?>> R provide(P nodeContainerFactory, 
NodeContainer container, WorkflowElementIdentifier id) {
+        return (R) new HumanTaskNodeFactory<P>(nodeContainerFactory, 
container, id);
     }
 
 }
diff --git 
a/jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/factory/ExtendedNodeFactory.java
 
b/jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/factory/provider/JoinNodeFactoryProvider.java
old mode 100755
new mode 100644
similarity index 61%
copy from 
jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/factory/ExtendedNodeFactory.java
copy to 
jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/factory/provider/JoinNodeFactoryProvider.java
index 0a22a65261..d873bb042e
--- 
a/jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/factory/ExtendedNodeFactory.java
+++ 
b/jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/factory/provider/JoinNodeFactoryProvider.java
@@ -16,22 +16,25 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.jbpm.ruleflow.core.factory;
+package org.jbpm.ruleflow.core.factory.provider;
 
 import org.jbpm.ruleflow.core.RuleFlowNodeContainerFactory;
-import org.jbpm.workflow.core.Node;
+import org.jbpm.ruleflow.core.factory.JoinFactory;
+import org.jbpm.ruleflow.core.factory.NodeFactory;
 import org.jbpm.workflow.core.NodeContainer;
-import org.jbpm.workflow.core.impl.ExtendedNodeImpl;
+import org.jbpm.workflow.core.node.Join;
 import org.kie.api.definition.process.WorkflowElementIdentifier;
 
-public abstract class ExtendedNodeFactory<T extends NodeFactory<T, P>, P 
extends RuleFlowNodeContainerFactory<P, ?>> extends NodeFactory<T, P> {
+public class JoinNodeFactoryProvider implements NodeFactoryProvider {
 
-    protected ExtendedNodeFactory(P nodeContainerFactory, NodeContainer 
nodeContainer, Node node, WorkflowElementIdentifier id) {
-        super(nodeContainerFactory, nodeContainer, node, id);
+    @Override
+    public boolean accept(Class<?> type) {
+        return Join.class.equals(type);
     }
 
-    protected ExtendedNodeImpl getExtendedNode() {
-        return (ExtendedNodeImpl) getNode();
+    @Override
+    public <R extends NodeFactory<R, P>, P extends 
RuleFlowNodeContainerFactory<P, ?>> R provide(P nodeContainerFactory, 
NodeContainer container, WorkflowElementIdentifier id) {
+        return (R) new JoinFactory<P>(nodeContainerFactory, container, id);
     }
 
 }
diff --git 
a/jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/factory/ExtendedNodeFactory.java
 
b/jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/factory/provider/MilestoneNodeFactoryProvider.java
old mode 100755
new mode 100644
similarity index 59%
copy from 
jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/factory/ExtendedNodeFactory.java
copy to 
jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/factory/provider/MilestoneNodeFactoryProvider.java
index 0a22a65261..05f6125732
--- 
a/jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/factory/ExtendedNodeFactory.java
+++ 
b/jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/factory/provider/MilestoneNodeFactoryProvider.java
@@ -16,22 +16,25 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.jbpm.ruleflow.core.factory;
+package org.jbpm.ruleflow.core.factory.provider;
 
 import org.jbpm.ruleflow.core.RuleFlowNodeContainerFactory;
-import org.jbpm.workflow.core.Node;
+import org.jbpm.ruleflow.core.factory.MilestoneNodeFactory;
+import org.jbpm.ruleflow.core.factory.NodeFactory;
 import org.jbpm.workflow.core.NodeContainer;
-import org.jbpm.workflow.core.impl.ExtendedNodeImpl;
+import org.jbpm.workflow.core.node.MilestoneNode;
 import org.kie.api.definition.process.WorkflowElementIdentifier;
 
-public abstract class ExtendedNodeFactory<T extends NodeFactory<T, P>, P 
extends RuleFlowNodeContainerFactory<P, ?>> extends NodeFactory<T, P> {
+public class MilestoneNodeFactoryProvider implements NodeFactoryProvider {
 
-    protected ExtendedNodeFactory(P nodeContainerFactory, NodeContainer 
nodeContainer, Node node, WorkflowElementIdentifier id) {
-        super(nodeContainerFactory, nodeContainer, node, id);
+    @Override
+    public boolean accept(Class<?> type) {
+        return MilestoneNode.class.equals(type);
     }
 
-    protected ExtendedNodeImpl getExtendedNode() {
-        return (ExtendedNodeImpl) getNode();
+    @Override
+    public <R extends NodeFactory<R, P>, P extends 
RuleFlowNodeContainerFactory<P, ?>> R provide(P nodeContainerFactory, 
NodeContainer container, WorkflowElementIdentifier id) {
+        return (R) new MilestoneNodeFactory(nodeContainerFactory, container, 
id);
     }
 
 }
diff --git 
a/jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/factory/ExtendedNodeFactory.java
 
b/jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/factory/provider/NodeFactoryProvider.java
old mode 100755
new mode 100644
similarity index 63%
copy from 
jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/factory/ExtendedNodeFactory.java
copy to 
jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/factory/provider/NodeFactoryProvider.java
index 0a22a65261..ae12e7ff81
--- 
a/jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/factory/ExtendedNodeFactory.java
+++ 
b/jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/factory/provider/NodeFactoryProvider.java
@@ -16,22 +16,17 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.jbpm.ruleflow.core.factory;
+package org.jbpm.ruleflow.core.factory.provider;
 
 import org.jbpm.ruleflow.core.RuleFlowNodeContainerFactory;
-import org.jbpm.workflow.core.Node;
+import org.jbpm.ruleflow.core.factory.NodeFactory;
 import org.jbpm.workflow.core.NodeContainer;
-import org.jbpm.workflow.core.impl.ExtendedNodeImpl;
 import org.kie.api.definition.process.WorkflowElementIdentifier;
 
-public abstract class ExtendedNodeFactory<T extends NodeFactory<T, P>, P 
extends RuleFlowNodeContainerFactory<P, ?>> extends NodeFactory<T, P> {
+public interface NodeFactoryProvider {
 
-    protected ExtendedNodeFactory(P nodeContainerFactory, NodeContainer 
nodeContainer, Node node, WorkflowElementIdentifier id) {
-        super(nodeContainerFactory, nodeContainer, node, id);
-    }
+    boolean accept(Class<?> name);
 
-    protected ExtendedNodeImpl getExtendedNode() {
-        return (ExtendedNodeImpl) getNode();
-    }
+    <T extends NodeFactory<T, P>, P extends RuleFlowNodeContainerFactory<P, 
?>> T provide(P nodeContainerFactory, NodeContainer container, 
WorkflowElementIdentifier id);
 
 }
diff --git 
a/jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/factory/provider/NodeFactoryProviderService.java
 
b/jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/factory/provider/NodeFactoryProviderService.java
new file mode 100644
index 0000000000..7f628a9aff
--- /dev/null
+++ 
b/jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/factory/provider/NodeFactoryProviderService.java
@@ -0,0 +1,50 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.jbpm.ruleflow.core.factory.provider;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Optional;
+import java.util.ServiceLoader;
+import java.util.function.Predicate;
+
+import org.jbpm.ruleflow.core.RuleFlowNodeContainerFactory;
+import org.jbpm.ruleflow.core.factory.NodeFactory;
+import org.jbpm.workflow.core.NodeContainer;
+import org.kie.api.definition.process.WorkflowElementIdentifier;
+
+public class NodeFactoryProviderService {
+
+    List<NodeFactoryProvider> providers;
+
+    public NodeFactoryProviderService() {
+        this.providers = new ArrayList<>();
+        
ServiceLoader.load(NodeFactoryProvider.class).forEach(this.providers::add);
+    }
+
+    public <T extends NodeFactory<T, P>, P extends 
RuleFlowNodeContainerFactory<P, ?>> T newNodeFactory(Class<?> type, P 
nodeContainerFactory, NodeContainer container, WorkflowElementIdentifier id) {
+        Predicate<NodeFactoryProvider> typeFilter = provider -> 
provider.accept(type);
+        Optional<NodeFactoryProvider> provider = 
providers.stream().filter(typeFilter).findAny();
+        if (provider.isEmpty()) {
+            throw new IllegalArgumentException("Provider for " + 
type.getCanonicalName() + " not found");
+        }
+        return provider.get().provide(nodeContainerFactory, container, id);
+    }
+
+}
diff --git 
a/jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/factory/ExtendedNodeFactory.java
 
b/jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/factory/provider/RuleSetNodeFactoryProvider.java
old mode 100755
new mode 100644
similarity index 60%
copy from 
jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/factory/ExtendedNodeFactory.java
copy to 
jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/factory/provider/RuleSetNodeFactoryProvider.java
index 0a22a65261..08804787eb
--- 
a/jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/factory/ExtendedNodeFactory.java
+++ 
b/jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/factory/provider/RuleSetNodeFactoryProvider.java
@@ -16,22 +16,25 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.jbpm.ruleflow.core.factory;
+package org.jbpm.ruleflow.core.factory.provider;
 
 import org.jbpm.ruleflow.core.RuleFlowNodeContainerFactory;
-import org.jbpm.workflow.core.Node;
+import org.jbpm.ruleflow.core.factory.NodeFactory;
+import org.jbpm.ruleflow.core.factory.RuleSetNodeFactory;
 import org.jbpm.workflow.core.NodeContainer;
-import org.jbpm.workflow.core.impl.ExtendedNodeImpl;
+import org.jbpm.workflow.core.node.RuleSetNode;
 import org.kie.api.definition.process.WorkflowElementIdentifier;
 
-public abstract class ExtendedNodeFactory<T extends NodeFactory<T, P>, P 
extends RuleFlowNodeContainerFactory<P, ?>> extends NodeFactory<T, P> {
+public class RuleSetNodeFactoryProvider implements NodeFactoryProvider {
 
-    protected ExtendedNodeFactory(P nodeContainerFactory, NodeContainer 
nodeContainer, Node node, WorkflowElementIdentifier id) {
-        super(nodeContainerFactory, nodeContainer, node, id);
+    @Override
+    public boolean accept(Class<?> type) {
+        return RuleSetNode.class.equals(type);
     }
 
-    protected ExtendedNodeImpl getExtendedNode() {
-        return (ExtendedNodeImpl) getNode();
+    @Override
+    public <R extends NodeFactory<R, P>, P extends 
RuleFlowNodeContainerFactory<P, ?>> R provide(P nodeContainerFactory, 
NodeContainer container, WorkflowElementIdentifier id) {
+        return (R) new RuleSetNodeFactory<P>(nodeContainerFactory, container, 
id);
     }
 
 }
diff --git 
a/jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/factory/ExtendedNodeFactory.java
 
b/jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/factory/provider/SplitNodeFactoryProvider.java
old mode 100755
new mode 100644
similarity index 61%
copy from 
jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/factory/ExtendedNodeFactory.java
copy to 
jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/factory/provider/SplitNodeFactoryProvider.java
index 0a22a65261..a8dbffecd9
--- 
a/jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/factory/ExtendedNodeFactory.java
+++ 
b/jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/factory/provider/SplitNodeFactoryProvider.java
@@ -16,22 +16,25 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.jbpm.ruleflow.core.factory;
+package org.jbpm.ruleflow.core.factory.provider;
 
 import org.jbpm.ruleflow.core.RuleFlowNodeContainerFactory;
-import org.jbpm.workflow.core.Node;
+import org.jbpm.ruleflow.core.factory.NodeFactory;
+import org.jbpm.ruleflow.core.factory.SplitFactory;
 import org.jbpm.workflow.core.NodeContainer;
-import org.jbpm.workflow.core.impl.ExtendedNodeImpl;
+import org.jbpm.workflow.core.node.Split;
 import org.kie.api.definition.process.WorkflowElementIdentifier;
 
-public abstract class ExtendedNodeFactory<T extends NodeFactory<T, P>, P 
extends RuleFlowNodeContainerFactory<P, ?>> extends NodeFactory<T, P> {
+public class SplitNodeFactoryProvider implements NodeFactoryProvider {
 
-    protected ExtendedNodeFactory(P nodeContainerFactory, NodeContainer 
nodeContainer, Node node, WorkflowElementIdentifier id) {
-        super(nodeContainerFactory, nodeContainer, node, id);
+    @Override
+    public boolean accept(Class<?> type) {
+        return Split.class.equals(type);
     }
 
-    protected ExtendedNodeImpl getExtendedNode() {
-        return (ExtendedNodeImpl) getNode();
+    @Override
+    public <R extends NodeFactory<R, P>, P extends 
RuleFlowNodeContainerFactory<P, ?>> R provide(P nodeContainerFactory, 
NodeContainer container, WorkflowElementIdentifier id) {
+        return (R) new SplitFactory<P>(nodeContainerFactory, container, id);
     }
 
 }
diff --git 
a/jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/factory/ExtendedNodeFactory.java
 
b/jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/factory/provider/StartNodeFactoryProvider.java
old mode 100755
new mode 100644
similarity index 60%
copy from 
jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/factory/ExtendedNodeFactory.java
copy to 
jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/factory/provider/StartNodeFactoryProvider.java
index 0a22a65261..ee7fd45544
--- 
a/jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/factory/ExtendedNodeFactory.java
+++ 
b/jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/factory/provider/StartNodeFactoryProvider.java
@@ -16,22 +16,25 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.jbpm.ruleflow.core.factory;
+package org.jbpm.ruleflow.core.factory.provider;
 
 import org.jbpm.ruleflow.core.RuleFlowNodeContainerFactory;
-import org.jbpm.workflow.core.Node;
+import org.jbpm.ruleflow.core.factory.NodeFactory;
+import org.jbpm.ruleflow.core.factory.StartNodeFactory;
 import org.jbpm.workflow.core.NodeContainer;
-import org.jbpm.workflow.core.impl.ExtendedNodeImpl;
+import org.jbpm.workflow.core.node.StartNode;
 import org.kie.api.definition.process.WorkflowElementIdentifier;
 
-public abstract class ExtendedNodeFactory<T extends NodeFactory<T, P>, P 
extends RuleFlowNodeContainerFactory<P, ?>> extends NodeFactory<T, P> {
+public class StartNodeFactoryProvider implements NodeFactoryProvider {
 
-    protected ExtendedNodeFactory(P nodeContainerFactory, NodeContainer 
nodeContainer, Node node, WorkflowElementIdentifier id) {
-        super(nodeContainerFactory, nodeContainer, node, id);
+    @Override
+    public boolean accept(Class<?> type) {
+        return StartNode.class.equals(type);
     }
 
-    protected ExtendedNodeImpl getExtendedNode() {
-        return (ExtendedNodeImpl) getNode();
+    @Override
+    public <T extends NodeFactory<T, P>, P extends 
RuleFlowNodeContainerFactory<P, ?>> T provide(P nodeContainerFactory, 
NodeContainer container, WorkflowElementIdentifier id) {
+        return (T) new StartNodeFactory<P>(nodeContainerFactory, container, 
id);
     }
 
 }
diff --git 
a/jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/factory/ExtendedNodeFactory.java
 
b/jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/factory/provider/StateNodeFactoryProvider.java
old mode 100755
new mode 100644
similarity index 60%
copy from 
jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/factory/ExtendedNodeFactory.java
copy to 
jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/factory/provider/StateNodeFactoryProvider.java
index 0a22a65261..e42aa0f10d
--- 
a/jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/factory/ExtendedNodeFactory.java
+++ 
b/jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/factory/provider/StateNodeFactoryProvider.java
@@ -16,22 +16,25 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.jbpm.ruleflow.core.factory;
+package org.jbpm.ruleflow.core.factory.provider;
 
 import org.jbpm.ruleflow.core.RuleFlowNodeContainerFactory;
-import org.jbpm.workflow.core.Node;
+import org.jbpm.ruleflow.core.factory.NodeFactory;
+import org.jbpm.ruleflow.core.factory.StateNodeFactory;
 import org.jbpm.workflow.core.NodeContainer;
-import org.jbpm.workflow.core.impl.ExtendedNodeImpl;
+import org.jbpm.workflow.core.node.StateNode;
 import org.kie.api.definition.process.WorkflowElementIdentifier;
 
-public abstract class ExtendedNodeFactory<T extends NodeFactory<T, P>, P 
extends RuleFlowNodeContainerFactory<P, ?>> extends NodeFactory<T, P> {
+public class StateNodeFactoryProvider implements NodeFactoryProvider {
 
-    protected ExtendedNodeFactory(P nodeContainerFactory, NodeContainer 
nodeContainer, Node node, WorkflowElementIdentifier id) {
-        super(nodeContainerFactory, nodeContainer, node, id);
+    @Override
+    public boolean accept(Class<?> type) {
+        return StateNode.class.equals(type);
     }
 
-    protected ExtendedNodeImpl getExtendedNode() {
-        return (ExtendedNodeImpl) getNode();
+    @Override
+    public <T extends NodeFactory<T, P>, P extends 
RuleFlowNodeContainerFactory<P, ?>> T provide(P nodeContainerFactory, 
NodeContainer container, WorkflowElementIdentifier id) {
+        return (T) new StateNodeFactory<P>(nodeContainerFactory, container, 
id);
     }
 
 }
diff --git 
a/jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/factory/ExtendedNodeFactory.java
 
b/jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/factory/provider/SubProcessNodeFactoryProvider.java
old mode 100755
new mode 100644
similarity index 59%
copy from 
jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/factory/ExtendedNodeFactory.java
copy to 
jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/factory/provider/SubProcessNodeFactoryProvider.java
index 0a22a65261..504ccc0898
--- 
a/jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/factory/ExtendedNodeFactory.java
+++ 
b/jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/factory/provider/SubProcessNodeFactoryProvider.java
@@ -16,22 +16,25 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.jbpm.ruleflow.core.factory;
+package org.jbpm.ruleflow.core.factory.provider;
 
 import org.jbpm.ruleflow.core.RuleFlowNodeContainerFactory;
-import org.jbpm.workflow.core.Node;
+import org.jbpm.ruleflow.core.factory.NodeFactory;
+import org.jbpm.ruleflow.core.factory.SubProcessNodeFactory;
 import org.jbpm.workflow.core.NodeContainer;
-import org.jbpm.workflow.core.impl.ExtendedNodeImpl;
+import org.jbpm.workflow.core.node.SubProcessNode;
 import org.kie.api.definition.process.WorkflowElementIdentifier;
 
-public abstract class ExtendedNodeFactory<T extends NodeFactory<T, P>, P 
extends RuleFlowNodeContainerFactory<P, ?>> extends NodeFactory<T, P> {
+public class SubProcessNodeFactoryProvider implements NodeFactoryProvider {
 
-    protected ExtendedNodeFactory(P nodeContainerFactory, NodeContainer 
nodeContainer, Node node, WorkflowElementIdentifier id) {
-        super(nodeContainerFactory, nodeContainer, node, id);
+    @Override
+    public boolean accept(Class<?> type) {
+        return SubProcessNode.class.equals(type);
     }
 
-    protected ExtendedNodeImpl getExtendedNode() {
-        return (ExtendedNodeImpl) getNode();
+    @Override
+    public <R extends NodeFactory<R, P>, P extends 
RuleFlowNodeContainerFactory<P, ?>> R provide(P nodeContainerFactory, 
NodeContainer container, WorkflowElementIdentifier id) {
+        return (R) new SubProcessNodeFactory<P>(nodeContainerFactory, 
container, id);
     }
 
 }
diff --git 
a/jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/factory/ExtendedNodeFactory.java
 
b/jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/factory/provider/ThrowLinkNodeFactoryProvider.java
old mode 100755
new mode 100644
similarity index 58%
copy from 
jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/factory/ExtendedNodeFactory.java
copy to 
jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/factory/provider/ThrowLinkNodeFactoryProvider.java
index 0a22a65261..b1abdcbaff
--- 
a/jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/factory/ExtendedNodeFactory.java
+++ 
b/jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/factory/provider/ThrowLinkNodeFactoryProvider.java
@@ -16,22 +16,26 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.jbpm.ruleflow.core.factory;
+package org.jbpm.ruleflow.core.factory.provider;
 
 import org.jbpm.ruleflow.core.RuleFlowNodeContainerFactory;
-import org.jbpm.workflow.core.Node;
+import org.jbpm.ruleflow.core.factory.NodeFactory;
+import org.jbpm.ruleflow.core.factory.ThrowLinkNodeFactory;
 import org.jbpm.workflow.core.NodeContainer;
-import org.jbpm.workflow.core.impl.ExtendedNodeImpl;
+import org.jbpm.workflow.core.node.ThrowLinkNode;
 import org.kie.api.definition.process.WorkflowElementIdentifier;
 
-public abstract class ExtendedNodeFactory<T extends NodeFactory<T, P>, P 
extends RuleFlowNodeContainerFactory<P, ?>> extends NodeFactory<T, P> {
+public class ThrowLinkNodeFactoryProvider implements NodeFactoryProvider {
 
-    protected ExtendedNodeFactory(P nodeContainerFactory, NodeContainer 
nodeContainer, Node node, WorkflowElementIdentifier id) {
-        super(nodeContainerFactory, nodeContainer, node, id);
+    @Override
+    public boolean accept(Class<?> type) {
+        return ThrowLinkNode.class.equals(type);
     }
 
-    protected ExtendedNodeImpl getExtendedNode() {
-        return (ExtendedNodeImpl) getNode();
+    @Override
+    public <R extends NodeFactory<R, P>, P extends 
RuleFlowNodeContainerFactory<P, ?>> R provide(P nodeContainerFactory, 
NodeContainer container, WorkflowElementIdentifier id) {
+        // TODO Auto-generated method stub
+        return (R) new ThrowLinkNodeFactory<P>(nodeContainerFactory, 
container, id);
     }
 
 }
diff --git 
a/jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/factory/ExtendedNodeFactory.java
 
b/jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/factory/provider/TimerNodeFactoryProvider.java
old mode 100755
new mode 100644
similarity index 60%
copy from 
jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/factory/ExtendedNodeFactory.java
copy to 
jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/factory/provider/TimerNodeFactoryProvider.java
index 0a22a65261..ddcebe915c
--- 
a/jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/factory/ExtendedNodeFactory.java
+++ 
b/jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/factory/provider/TimerNodeFactoryProvider.java
@@ -16,22 +16,25 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.jbpm.ruleflow.core.factory;
+package org.jbpm.ruleflow.core.factory.provider;
 
 import org.jbpm.ruleflow.core.RuleFlowNodeContainerFactory;
-import org.jbpm.workflow.core.Node;
+import org.jbpm.ruleflow.core.factory.NodeFactory;
+import org.jbpm.ruleflow.core.factory.TimerNodeFactory;
 import org.jbpm.workflow.core.NodeContainer;
-import org.jbpm.workflow.core.impl.ExtendedNodeImpl;
+import org.jbpm.workflow.core.node.TimerNode;
 import org.kie.api.definition.process.WorkflowElementIdentifier;
 
-public abstract class ExtendedNodeFactory<T extends NodeFactory<T, P>, P 
extends RuleFlowNodeContainerFactory<P, ?>> extends NodeFactory<T, P> {
+public class TimerNodeFactoryProvider implements NodeFactoryProvider {
 
-    protected ExtendedNodeFactory(P nodeContainerFactory, NodeContainer 
nodeContainer, Node node, WorkflowElementIdentifier id) {
-        super(nodeContainerFactory, nodeContainer, node, id);
+    @Override
+    public boolean accept(Class<?> type) {
+        return TimerNode.class.equals(type);
     }
 
-    protected ExtendedNodeImpl getExtendedNode() {
-        return (ExtendedNodeImpl) getNode();
+    @Override
+    public <R extends NodeFactory<R, P>, P extends 
RuleFlowNodeContainerFactory<P, ?>> R provide(P nodeContainerFactory, 
NodeContainer container, WorkflowElementIdentifier id) {
+        return (R) new TimerNodeFactory<P>(nodeContainerFactory, container, 
id);
     }
 
 }
diff --git 
a/jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/factory/ExtendedNodeFactory.java
 
b/jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/factory/provider/WorkItemNodeFactoryProvider.java
old mode 100755
new mode 100644
similarity index 60%
copy from 
jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/factory/ExtendedNodeFactory.java
copy to 
jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/factory/provider/WorkItemNodeFactoryProvider.java
index 0a22a65261..e014dac4a9
--- 
a/jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/factory/ExtendedNodeFactory.java
+++ 
b/jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/factory/provider/WorkItemNodeFactoryProvider.java
@@ -16,22 +16,25 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.jbpm.ruleflow.core.factory;
+package org.jbpm.ruleflow.core.factory.provider;
 
 import org.jbpm.ruleflow.core.RuleFlowNodeContainerFactory;
-import org.jbpm.workflow.core.Node;
+import org.jbpm.ruleflow.core.factory.NodeFactory;
+import org.jbpm.ruleflow.core.factory.WorkItemNodeFactory;
 import org.jbpm.workflow.core.NodeContainer;
-import org.jbpm.workflow.core.impl.ExtendedNodeImpl;
+import org.jbpm.workflow.core.node.WorkItemNode;
 import org.kie.api.definition.process.WorkflowElementIdentifier;
 
-public abstract class ExtendedNodeFactory<T extends NodeFactory<T, P>, P 
extends RuleFlowNodeContainerFactory<P, ?>> extends NodeFactory<T, P> {
+public class WorkItemNodeFactoryProvider implements NodeFactoryProvider {
 
-    protected ExtendedNodeFactory(P nodeContainerFactory, NodeContainer 
nodeContainer, Node node, WorkflowElementIdentifier id) {
-        super(nodeContainerFactory, nodeContainer, node, id);
+    @Override
+    public boolean accept(Class<?> type) {
+        return WorkItemNode.class.equals(type);
     }
 
-    protected ExtendedNodeImpl getExtendedNode() {
-        return (ExtendedNodeImpl) getNode();
+    @Override
+    public <R extends NodeFactory<R, P>, P extends 
RuleFlowNodeContainerFactory<P, ?>> R provide(P nodeContainerFactory, 
NodeContainer container, WorkflowElementIdentifier id) {
+        return (R) new WorkItemNodeFactory<P>(nodeContainerFactory, container, 
id);
     }
 
 }
diff --git 
a/jbpm/jbpm-flow/src/main/resources/META-INF/services/org.jbpm.ruleflow.core.factory.provider.NodeFactoryProvider
 
b/jbpm/jbpm-flow/src/main/resources/META-INF/services/org.jbpm.ruleflow.core.factory.provider.NodeFactoryProvider
new file mode 100644
index 0000000000..e9a993216e
--- /dev/null
+++ 
b/jbpm/jbpm-flow/src/main/resources/META-INF/services/org.jbpm.ruleflow.core.factory.provider.NodeFactoryProvider
@@ -0,0 +1,21 @@
+org.jbpm.ruleflow.core.factory.provider.ActionNodeFactoryProvider
+org.jbpm.ruleflow.core.factory.provider.BoundaryEventNodeFactoryProvider
+org.jbpm.ruleflow.core.factory.provider.CatchLinkNodeFactoryProvider
+org.jbpm.ruleflow.core.factory.provider.CompositeContextNodeFactoryProvider
+org.jbpm.ruleflow.core.factory.provider.DynamicNodeFactoryProvider
+org.jbpm.ruleflow.core.factory.provider.EndNodeFactoryProvider
+org.jbpm.ruleflow.core.factory.provider.EventNodeFactoryProvider
+org.jbpm.ruleflow.core.factory.provider.EventSubProcessNodeFactoryProvider
+org.jbpm.ruleflow.core.factory.provider.FaultNodeFactoryProvider
+org.jbpm.ruleflow.core.factory.provider.ForEachNodeFactoryProvider
+org.jbpm.ruleflow.core.factory.provider.HumanTaskNodeFactoryProvider
+org.jbpm.ruleflow.core.factory.provider.JoinNodeFactoryProvider
+org.jbpm.ruleflow.core.factory.provider.MilestoneNodeFactoryProvider
+org.jbpm.ruleflow.core.factory.provider.RuleSetNodeFactoryProvider
+org.jbpm.ruleflow.core.factory.provider.SplitNodeFactoryProvider
+org.jbpm.ruleflow.core.factory.provider.StartNodeFactoryProvider
+org.jbpm.ruleflow.core.factory.provider.StateNodeFactoryProvider
+org.jbpm.ruleflow.core.factory.provider.SubProcessNodeFactoryProvider
+org.jbpm.ruleflow.core.factory.provider.ThrowLinkNodeFactoryProvider
+org.jbpm.ruleflow.core.factory.provider.TimerNodeFactoryProvider
+org.jbpm.ruleflow.core.factory.provider.WorkItemNodeFactoryProvider
\ No newline at end of file
diff --git 
a/springboot/integration-tests/src/it/integration-tests-springboot-processes-it/src/main/java/org/acme/examples.model/Movie.java
 
b/springboot/integration-tests/src/it/integration-tests-springboot-processes-it/src/main/java/org/acme/examples/model/Movie.java
similarity index 100%
rename from 
springboot/integration-tests/src/it/integration-tests-springboot-processes-it/src/main/java/org/acme/examples.model/Movie.java
rename to 
springboot/integration-tests/src/it/integration-tests-springboot-processes-it/src/main/java/org/acme/examples/model/Movie.java
diff --git 
a/springboot/integration-tests/src/it/integration-tests-springboot-processes-it/src/main/java/org/acme/examples.model/MovieGenre.java
 
b/springboot/integration-tests/src/it/integration-tests-springboot-processes-it/src/main/java/org/acme/examples/model/MovieGenre.java
similarity index 100%
rename from 
springboot/integration-tests/src/it/integration-tests-springboot-processes-it/src/main/java/org/acme/examples.model/MovieGenre.java
rename to 
springboot/integration-tests/src/it/integration-tests-springboot-processes-it/src/main/java/org/acme/examples/model/MovieGenre.java
diff --git 
a/springboot/integration-tests/src/it/integration-tests-springboot-processes-it/src/main/java/org/acme/examples.model/Rating.java
 
b/springboot/integration-tests/src/it/integration-tests-springboot-processes-it/src/main/java/org/acme/examples/model/Rating.java
similarity index 100%
rename from 
springboot/integration-tests/src/it/integration-tests-springboot-processes-it/src/main/java/org/acme/examples.model/Rating.java
rename to 
springboot/integration-tests/src/it/integration-tests-springboot-processes-it/src/main/java/org/acme/examples/model/Rating.java
diff --git 
a/springboot/integration-tests/src/it/integration-tests-springboot-processes-it/src/main/java/org/kie/kogito/integrationtests/VersionRestController.java
 
b/springboot/integration-tests/src/it/integration-tests-springboot-processes-it/src/main/java/org/kie/kogito/integrationtests/VersionRestController.java
index 31df870580..7bc079282c 100644
--- 
a/springboot/integration-tests/src/it/integration-tests-springboot-processes-it/src/main/java/org/kie/kogito/integrationtests/VersionRestController.java
+++ 
b/springboot/integration-tests/src/it/integration-tests-springboot-processes-it/src/main/java/org/kie/kogito/integrationtests/VersionRestController.java
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.kie.kogito.process.management;
+package org.kie.kogito.integrationtests;
 
 import java.util.Map;
 


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to