Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHenrik Rentz-Reichert2012-02-01 14:17:38 +0000
committerHenrik Rentz-Reichert2012-02-01 14:17:38 +0000
commitc49ca591be978e3823f64a635fa6dac8470dfe24 (patch)
tree24edcbf81833bc38e37e886403cc09ea426bf4d6
parentdfcce1ed22bce75524328a6ce76eb23729423dab (diff)
downloadorg.eclipse.etrice-c49ca591be978e3823f64a635fa6dac8470dfe24.tar.gz
org.eclipse.etrice-c49ca591be978e3823f64a635fa6dac8470dfe24.tar.xz
org.eclipse.etrice-c49ca591be978e3823f64a635fa6dac8470dfe24.zip
[core.room, generator] ports of data driven actors can be multiply connected
CAUTION: nothing checked at the moment
-rw-r--r--plugins/org.eclipse.etrice.core.room/src/org/eclipse/etrice/core/room/util/RoomHelpers.java10
-rw-r--r--plugins/org.eclipse.etrice.core.room/src/org/eclipse/etrice/core/validation/ValidationUtil.java13
-rw-r--r--plugins/org.eclipse.etrice.generator/src/org/eclipse/etrice/generator/builder/GeneratorModelBuilder.java47
3 files changed, 48 insertions, 22 deletions
diff --git a/plugins/org.eclipse.etrice.core.room/src/org/eclipse/etrice/core/room/util/RoomHelpers.java b/plugins/org.eclipse.etrice.core.room/src/org/eclipse/etrice/core/room/util/RoomHelpers.java
index a0f4f944c..bb1608c04 100644
--- a/plugins/org.eclipse.etrice.core.room/src/org/eclipse/etrice/core/room/util/RoomHelpers.java
+++ b/plugins/org.eclipse.etrice.core.room/src/org/eclipse/etrice/core/room/util/RoomHelpers.java
@@ -469,6 +469,16 @@ public class RoomHelpers {
return null;
}
+ public static ActorClass getActorClass(EObject obj) {
+ EObject parent = obj;
+ while (parent!=null) {
+ parent = parent.eContainer();
+ if (parent instanceof ActorClass)
+ return (ActorClass) parent;
+ }
+ return null;
+ }
+
/**
* first container of type {@link ProtocolClass}
* @param obj
diff --git a/plugins/org.eclipse.etrice.core.room/src/org/eclipse/etrice/core/validation/ValidationUtil.java b/plugins/org.eclipse.etrice.core.room/src/org/eclipse/etrice/core/validation/ValidationUtil.java
index 4a575b760..e884362be 100644
--- a/plugins/org.eclipse.etrice.core.room/src/org/eclipse/etrice/core/validation/ValidationUtil.java
+++ b/plugins/org.eclipse.etrice.core.room/src/org/eclipse/etrice/core/validation/ValidationUtil.java
@@ -240,7 +240,7 @@ public class ValidationUtil {
}
public static Result isConnectable(Port port, ActorContainerRef ref, StructureClass acc, Binding exclude) {
- if (!port.isReplicated() && isConnected(port, ref, acc, exclude))
+ if (!isMultiplyConnectable(port) && isConnected(port, ref, acc, exclude))
return Result.error("port with multiplicity 1 is already connected");
if (acc instanceof ActorClass) {
@@ -253,6 +253,17 @@ public class ValidationUtil {
else
return Result.ok();
}
+
+ public static boolean isMultiplyConnectable(Port port) {
+ if (port.isReplicated())
+ return true;
+
+ ActorClass ac = RoomHelpers.getActorClass(port);
+ if (ac.getStateMachine()!=null && ac.getStateMachine().isDataDriven())
+ return true;
+
+ return false;
+ }
public static Result isValid(Binding bind) {
return isConnectable(bind.getEndpoint1().getPort(), bind.getEndpoint1().getActorRef(), bind.getEndpoint2().getPort(), bind.getEndpoint2().getActorRef(), (StructureClass)bind.eContainer(), bind);
diff --git a/plugins/org.eclipse.etrice.generator/src/org/eclipse/etrice/generator/builder/GeneratorModelBuilder.java b/plugins/org.eclipse.etrice.generator/src/org/eclipse/etrice/generator/builder/GeneratorModelBuilder.java
index cca5c53a4..0dc7726b2 100644
--- a/plugins/org.eclipse.etrice.generator/src/org/eclipse/etrice/generator/builder/GeneratorModelBuilder.java
+++ b/plugins/org.eclipse.etrice.generator/src/org/eclipse/etrice/generator/builder/GeneratorModelBuilder.java
@@ -19,6 +19,7 @@ import java.util.List;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.common.util.TreeIterator;
import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EReference;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.etrice.core.room.ActorClass;
import org.eclipse.etrice.core.room.ActorContainerClass;
@@ -762,35 +763,39 @@ public class GeneratorModelBuilder {
EObject obj = it.next();
if (obj instanceof ActorInstance) {
ActorInstance ai = (ActorInstance) obj;
- for (PortInstance pi : ai.getPorts()) {
- if (pi.getKind()!=PortKind.RELAY) {
- if (pi.getBindings().size()>pi.getPort().getMultiplicity() && pi.getPort().getMultiplicity()!=-1) {
- EStructuralFeature feature = null;
- int idx = IDiagnostician.INSIGNIFICANT_INDEX;
- if (pi.getPort().eContainer() instanceof ActorClass) {
- ActorClass ac = (ActorClass) pi.getPort().eContainer();
- idx = ac.getIfPorts().indexOf(pi.getPort());
- if (idx>=0) {
- feature = RoomPackage.eINSTANCE.getActorClass_IfPorts();
- }
- else {
+ ActorClass ac = ai.getActorClass();
+ if (ac.getStateMachine()==null || !ac.getStateMachine().isDataDriven()) {
+ for (PortInstance pi : ai.getPorts()) {
+ if (pi.getKind()!=PortKind.RELAY) {
+ if (pi.getBindings().size()>pi.getPort().getMultiplicity() && pi.getPort().getMultiplicity()!=-1) {
+ EStructuralFeature feature = RoomPackage.eINSTANCE.getActorClass_IfPorts();
+ int idx = ac.getIfPorts().indexOf(pi.getPort());
+ if (idx<0) {
feature = RoomPackage.eINSTANCE.getActorClass_IntPorts();
idx = ac.getIntPorts().indexOf(pi.getPort());
}
+ diagnostician.error("number of peers ("+pi.getBindings().size()
+ + ") of port '"+pi.getName()
+ +"' exceeds multiplicity "+pi.getPort().getMultiplicity()
+ +" in instance "+ai.getPath(), ac, feature, idx);
}
- else if (pi.getPort().eContainer() instanceof SubSystemClass) {
- SubSystemClass ssc = (SubSystemClass) pi.getPort().eContainer();
- feature = RoomPackage.eINSTANCE.getSubSystemClass_RelayPorts();
- idx = ssc.getRelayPorts().indexOf(pi.getPort());
- }
- diagnostician.error("number of peers "+pi.getBindings().size()
- + " of port "+pi.getName()
- +" exceeds multiplicity "+pi.getPort().getMultiplicity()
- +" in instance "+ai.getPath(), pi, feature, idx);
}
}
}
}
+ else if (obj instanceof SubSystemInstance) {
+ SubSystemInstance ssi = (SubSystemInstance) obj;
+ SubSystemClass ssc = ssi.getSubSystemClass();
+ for (PortInstance pi : ssi.getPorts()) {
+ EReference feature = RoomPackage.eINSTANCE.getSubSystemClass_RelayPorts();
+ int idx = ssc.getRelayPorts().indexOf(pi.getPort());
+
+ diagnostician.error("number of peers ("+pi.getBindings().size()
+ + ") of port '"+pi.getName()
+ +"' exceeds multiplicity "+pi.getPort().getMultiplicity()
+ +" in instance "+ssi.getPath(), ssc, feature, idx);
+ }
+ }
}
}

Back to the top