diff --git a/plugins/de.fraunhofer.ipa.ros/pom.xml b/plugins/de.fraunhofer.ipa.ros/pom.xml
index 672baacd3..fc02637f2 100644
--- a/plugins/de.fraunhofer.ipa.ros/pom.xml
+++ b/plugins/de.fraunhofer.ipa.ros/pom.xml
@@ -4,7 +4,7 @@
de.fraunhofer.ipa.ros
de.fraunhofer.ipa.ros.parent
- 1.5.0-SNAPSHOT
+ 2.0.0-SNAPSHOT
../de.fraunhofer.ipa.ros.parent/pom.xml
de.fraunhofer.ipa.ros
diff --git a/plugins/de.fraunhofer.ipa.ros/src/ros/AmentPackage.java b/plugins/de.fraunhofer.ipa.ros/src/ros/AmentPackage.java
new file mode 100644
index 000000000..5e68afe3f
--- /dev/null
+++ b/plugins/de.fraunhofer.ipa.ros/src/ros/AmentPackage.java
@@ -0,0 +1,17 @@
+/**
+ */
+package ros;
+
+
+/**
+ *
+ * A representation of the model object 'Ament Package'.
+ *
+ *
+ *
+ * @see ros.RosPackage#getAmentPackage()
+ * @model
+ * @generated
+ */
+public interface AmentPackage extends ros.Package {
+} // AmentPackage
diff --git a/plugins/de.fraunhofer.ipa.ros/src/ros/CatkinPackage.java b/plugins/de.fraunhofer.ipa.ros/src/ros/CatkinPackage.java
index 0b87820df..c3fa57299 100644
--- a/plugins/de.fraunhofer.ipa.ros/src/ros/CatkinPackage.java
+++ b/plugins/de.fraunhofer.ipa.ros/src/ros/CatkinPackage.java
@@ -2,39 +2,16 @@
*/
package ros;
-import org.eclipse.emf.common.util.EList;
-
/**
*
* A representation of the model object 'Catkin Package'.
*
*
- *
- * The following features are supported:
- *
- *
- * - {@link ros.CatkinPackage#getDependency Dependency}
- *
*
* @see ros.RosPackage#getCatkinPackage()
* @model
* @generated
*/
public interface CatkinPackage extends ros.Package {
- /**
- * Returns the value of the 'Dependency' containment reference list.
- * The list contents are of type {@link ros.Dependency}.
- *
- *
- * If the meaning of the 'Dependency' containment reference list isn't clear,
- * there really should be more of a description here...
- *
- *
- * @return the value of the 'Dependency' containment reference list.
- * @see ros.RosPackage#getCatkinPackage_Dependency()
- * @model containment="true"
- * @generated
- */
- EList getDependency();
} // CatkinPackage
diff --git a/plugins/de.fraunhofer.ipa.ros/src/ros/Package.java b/plugins/de.fraunhofer.ipa.ros/src/ros/Package.java
index a224085f8..b4126e625 100644
--- a/plugins/de.fraunhofer.ipa.ros/src/ros/Package.java
+++ b/plugins/de.fraunhofer.ipa.ros/src/ros/Package.java
@@ -18,6 +18,8 @@
* {@link ros.Package#getName Name}
* {@link ros.Package#getSpec Spec}
* {@link ros.Package#getArtifact Artifact}
+ * {@link ros.Package#getFromGitRepo From Git Repo}
+ * {@link ros.Package#getDependency Dependency}
*
*
* @see ros.RosPackage#getPackage()
@@ -85,4 +87,38 @@ public interface Package extends EObject {
*/
EList getArtifact();
+ /**
+ * Returns the value of the 'From Git Repo' attribute.
+ *
+ *
+ * @return the value of the 'From Git Repo' attribute.
+ * @see #setFromGitRepo(String)
+ * @see ros.RosPackage#getPackage_FromGitRepo()
+ * @model
+ * @generated
+ */
+ String getFromGitRepo();
+
+ /**
+ * Sets the value of the '{@link ros.Package#getFromGitRepo From Git Repo}' attribute.
+ *
+ *
+ * @param value the new value of the 'From Git Repo' attribute.
+ * @see #getFromGitRepo()
+ * @generated
+ */
+ void setFromGitRepo(String value);
+
+ /**
+ * Returns the value of the 'Dependency' containment reference list.
+ * The list contents are of type {@link ros.Dependency}.
+ *
+ *
+ * @return the value of the 'Dependency' containment reference list.
+ * @see ros.RosPackage#getPackage_Dependency()
+ * @model containment="true"
+ * @generated
+ */
+ EList getDependency();
+
} // Package
diff --git a/plugins/de.fraunhofer.ipa.ros/src/ros/RosFactory.java b/plugins/de.fraunhofer.ipa.ros/src/ros/RosFactory.java
index 072daea69..022681105 100644
--- a/plugins/de.fraunhofer.ipa.ros/src/ros/RosFactory.java
+++ b/plugins/de.fraunhofer.ipa.ros/src/ros/RosFactory.java
@@ -408,6 +408,15 @@ public interface RosFactory extends EFactory {
*/
ParameterDate createParameterDate();
+ /**
+ * Returns a new object of class 'Ament Package'.
+ *
+ *
+ * @return a new object of class 'Ament Package'.
+ * @generated
+ */
+ AmentPackage createAmentPackage();
+
/**
* Returns the package supported by this factory.
*
diff --git a/plugins/de.fraunhofer.ipa.ros/src/ros/RosPackage.java b/plugins/de.fraunhofer.ipa.ros/src/ros/RosPackage.java
index 27b52e8d3..567ce77ca 100644
--- a/plugins/de.fraunhofer.ipa.ros/src/ros/RosPackage.java
+++ b/plugins/de.fraunhofer.ipa.ros/src/ros/RosPackage.java
@@ -194,6 +194,24 @@ public interface RosPackage extends EPackage {
*/
int PACKAGE__ARTIFACT = 2;
+ /**
+ * The feature id for the 'From Git Repo' attribute.
+ *
+ *
+ * @generated
+ * @ordered
+ */
+ int PACKAGE__FROM_GIT_REPO = 3;
+
+ /**
+ * The feature id for the 'Dependency' containment reference list.
+ *
+ *
+ * @generated
+ * @ordered
+ */
+ int PACKAGE__DEPENDENCY = 4;
+
/**
* The number of structural features of the 'Package' class.
*
@@ -201,7 +219,7 @@ public interface RosPackage extends EPackage {
* @generated
* @ordered
*/
- int PACKAGE_FEATURE_COUNT = 3;
+ int PACKAGE_FEATURE_COUNT = 5;
/**
* The number of operations of the 'Package' class.
@@ -764,6 +782,15 @@ public interface RosPackage extends EPackage {
*/
int CATKIN_PACKAGE__ARTIFACT = PACKAGE__ARTIFACT;
+ /**
+ * The feature id for the 'From Git Repo' attribute.
+ *
+ *
+ * @generated
+ * @ordered
+ */
+ int CATKIN_PACKAGE__FROM_GIT_REPO = PACKAGE__FROM_GIT_REPO;
+
/**
* The feature id for the 'Dependency' containment reference list.
*
@@ -771,7 +798,7 @@ public interface RosPackage extends EPackage {
* @generated
* @ordered
*/
- int CATKIN_PACKAGE__DEPENDENCY = PACKAGE_FEATURE_COUNT + 0;
+ int CATKIN_PACKAGE__DEPENDENCY = PACKAGE__DEPENDENCY;
/**
* The number of structural features of the 'Catkin Package' class.
@@ -780,7 +807,7 @@ public interface RosPackage extends EPackage {
* @generated
* @ordered
*/
- int CATKIN_PACKAGE_FEATURE_COUNT = PACKAGE_FEATURE_COUNT + 1;
+ int CATKIN_PACKAGE_FEATURE_COUNT = PACKAGE_FEATURE_COUNT + 0;
/**
* The number of operations of the 'Catkin Package' class.
@@ -2238,6 +2265,79 @@ public interface RosPackage extends EPackage {
*/
int PARAMETER_DATE_OPERATION_COUNT = PARAMETER_VALUE_OPERATION_COUNT + 0;
+ /**
+ * The meta object id for the '{@link ros.impl.AmentPackageImpl Ament Package}' class.
+ *
+ *
+ * @see ros.impl.AmentPackageImpl
+ * @see ros.impl.RosPackageImpl#getAmentPackage()
+ * @generated
+ */
+ int AMENT_PACKAGE = 48;
+
+ /**
+ * The feature id for the 'Name' attribute.
+ *
+ *
+ * @generated
+ * @ordered
+ */
+ int AMENT_PACKAGE__NAME = PACKAGE__NAME;
+
+ /**
+ * The feature id for the 'Spec' containment reference list.
+ *
+ *
+ * @generated
+ * @ordered
+ */
+ int AMENT_PACKAGE__SPEC = PACKAGE__SPEC;
+
+ /**
+ * The feature id for the 'Artifact' containment reference list.
+ *
+ *
+ * @generated
+ * @ordered
+ */
+ int AMENT_PACKAGE__ARTIFACT = PACKAGE__ARTIFACT;
+
+ /**
+ * The feature id for the 'From Git Repo' attribute.
+ *
+ *
+ * @generated
+ * @ordered
+ */
+ int AMENT_PACKAGE__FROM_GIT_REPO = PACKAGE__FROM_GIT_REPO;
+
+ /**
+ * The feature id for the 'Dependency' containment reference list.
+ *
+ *
+ * @generated
+ * @ordered
+ */
+ int AMENT_PACKAGE__DEPENDENCY = PACKAGE__DEPENDENCY;
+
+ /**
+ * The number of structural features of the 'Ament Package' class.
+ *
+ *
+ * @generated
+ * @ordered
+ */
+ int AMENT_PACKAGE_FEATURE_COUNT = PACKAGE_FEATURE_COUNT + 0;
+
+ /**
+ * The number of operations of the 'Ament Package' class.
+ *
+ *
+ * @generated
+ * @ordered
+ */
+ int AMENT_PACKAGE_OPERATION_COUNT = PACKAGE_OPERATION_COUNT + 0;
+
/**
* The meta object id for the 'Graph Name' data type.
*
@@ -2246,7 +2346,7 @@ public interface RosPackage extends EPackage {
* @see ros.impl.RosPackageImpl#getGraphName()
* @generated
*/
- int GRAPH_NAME = 48;
+ int GRAPH_NAME = 49;
/**
@@ -2390,6 +2490,28 @@ public interface RosPackage extends EPackage {
*/
EReference getPackage_Artifact();
+ /**
+ * Returns the meta object for the attribute '{@link ros.Package#getFromGitRepo From Git Repo}'.
+ *
+ *
+ * @return the meta object for the attribute 'From Git Repo'.
+ * @see ros.Package#getFromGitRepo()
+ * @see #getPackage()
+ * @generated
+ */
+ EAttribute getPackage_FromGitRepo();
+
+ /**
+ * Returns the meta object for the containment reference list '{@link ros.Package#getDependency Dependency}'.
+ *
+ *
+ * @return the meta object for the containment reference list 'Dependency'.
+ * @see ros.Package#getDependency()
+ * @see #getPackage()
+ * @generated
+ */
+ EReference getPackage_Dependency();
+
/**
* Returns the meta object for class '{@link ros.Dependency Dependency}'.
*
@@ -2547,17 +2669,6 @@ public interface RosPackage extends EPackage {
*/
EClass getCatkinPackage();
- /**
- * Returns the meta object for the containment reference list '{@link ros.CatkinPackage#getDependency Dependency}'.
- *
- *
- * @return the meta object for the containment reference list 'Dependency'.
- * @see ros.CatkinPackage#getDependency()
- * @see #getCatkinPackage()
- * @generated
- */
- EReference getCatkinPackage_Dependency();
-
/**
* Returns the meta object for class '{@link ros.Artifact Artifact}'.
*
@@ -3433,6 +3544,16 @@ public interface RosPackage extends EPackage {
*/
EAttribute getParameterDate_Value();
+ /**
+ * Returns the meta object for class '{@link ros.AmentPackage Ament Package}'.
+ *
+ *
+ * @return the meta object for class 'Ament Package'.
+ * @see ros.AmentPackage
+ * @generated
+ */
+ EClass getAmentPackage();
+
/**
* Returns the meta object for data type '{@link java.lang.String Graph Name}'.
*
@@ -3575,6 +3696,22 @@ interface Literals {
*/
EReference PACKAGE__ARTIFACT = eINSTANCE.getPackage_Artifact();
+ /**
+ * The meta object literal for the 'From Git Repo' attribute feature.
+ *
+ *
+ * @generated
+ */
+ EAttribute PACKAGE__FROM_GIT_REPO = eINSTANCE.getPackage_FromGitRepo();
+
+ /**
+ * The meta object literal for the 'Dependency' containment reference list feature.
+ *
+ *
+ * @generated
+ */
+ EReference PACKAGE__DEPENDENCY = eINSTANCE.getPackage_Dependency();
+
/**
* The meta object literal for the '{@link ros.impl.DependencyImpl Dependency}' class.
*
@@ -3711,14 +3848,6 @@ interface Literals {
*/
EClass CATKIN_PACKAGE = eINSTANCE.getCatkinPackage();
- /**
- * The meta object literal for the 'Dependency' containment reference list feature.
- *
- *
- * @generated
- */
- EReference CATKIN_PACKAGE__DEPENDENCY = eINSTANCE.getCatkinPackage_Dependency();
-
/**
* The meta object literal for the '{@link ros.impl.ArtifactImpl Artifact}' class.
*
@@ -4459,6 +4588,16 @@ interface Literals {
*/
EAttribute PARAMETER_DATE__VALUE = eINSTANCE.getParameterDate_Value();
+ /**
+ * The meta object literal for the '{@link ros.impl.AmentPackageImpl Ament Package}' class.
+ *
+ *
+ * @see ros.impl.AmentPackageImpl
+ * @see ros.impl.RosPackageImpl#getAmentPackage()
+ * @generated
+ */
+ EClass AMENT_PACKAGE = eINSTANCE.getAmentPackage();
+
/**
* The meta object literal for the 'Graph Name' data type.
*
diff --git a/plugins/de.fraunhofer.ipa.ros/src/ros/impl/AmentPackageImpl.java b/plugins/de.fraunhofer.ipa.ros/src/ros/impl/AmentPackageImpl.java
new file mode 100644
index 000000000..285692d3f
--- /dev/null
+++ b/plugins/de.fraunhofer.ipa.ros/src/ros/impl/AmentPackageImpl.java
@@ -0,0 +1,37 @@
+/**
+ */
+package ros.impl;
+
+import org.eclipse.emf.ecore.EClass;
+
+import ros.AmentPackage;
+import ros.RosPackage;
+
+/**
+ *
+ * An implementation of the model object 'Ament Package'.
+ *
+ *
+ * @generated
+ */
+public class AmentPackageImpl extends PackageImpl implements AmentPackage {
+ /**
+ *
+ *
+ * @generated
+ */
+ protected AmentPackageImpl() {
+ super();
+ }
+
+ /**
+ *
+ *
+ * @generated
+ */
+ @Override
+ protected EClass eStaticClass() {
+ return RosPackage.Literals.AMENT_PACKAGE;
+ }
+
+} //AmentPackageImpl
diff --git a/plugins/de.fraunhofer.ipa.ros/src/ros/impl/CatkinPackageImpl.java b/plugins/de.fraunhofer.ipa.ros/src/ros/impl/CatkinPackageImpl.java
index 543274d13..d352ef69f 100644
--- a/plugins/de.fraunhofer.ipa.ros/src/ros/impl/CatkinPackageImpl.java
+++ b/plugins/de.fraunhofer.ipa.ros/src/ros/impl/CatkinPackageImpl.java
@@ -2,46 +2,18 @@
*/
package ros.impl;
-import java.util.Collection;
-
-import org.eclipse.emf.common.notify.NotificationChain;
-
-import org.eclipse.emf.common.util.EList;
-
import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.InternalEObject;
-
-import org.eclipse.emf.ecore.util.EObjectContainmentEList;
-import org.eclipse.emf.ecore.util.InternalEList;
-
import ros.CatkinPackage;
-import ros.Dependency;
import ros.RosPackage;
/**
*
* An implementation of the model object 'Catkin Package'.
*
- *
- * The following features are implemented:
- *
- *
- * - {@link ros.impl.CatkinPackageImpl#getDependency Dependency}
- *
*
* @generated
*/
public class CatkinPackageImpl extends PackageImpl implements CatkinPackage {
- /**
- * The cached value of the '{@link #getDependency() Dependency}' containment reference list.
- *
- *
- * @see #getDependency()
- * @generated
- * @ordered
- */
- protected EList dependency;
-
/**
*
*
@@ -61,91 +33,4 @@ protected EClass eStaticClass() {
return RosPackage.Literals.CATKIN_PACKAGE;
}
- /**
- *
- *
- * @generated
- */
- @Override
- public EList getDependency() {
- if (dependency == null) {
- dependency = new EObjectContainmentEList(Dependency.class, this, RosPackage.CATKIN_PACKAGE__DEPENDENCY);
- }
- return dependency;
- }
-
- /**
- *
- *
- * @generated
- */
- @Override
- public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
- switch (featureID) {
- case RosPackage.CATKIN_PACKAGE__DEPENDENCY:
- return ((InternalEList>)getDependency()).basicRemove(otherEnd, msgs);
- }
- return super.eInverseRemove(otherEnd, featureID, msgs);
- }
-
- /**
- *
- *
- * @generated
- */
- @Override
- public Object eGet(int featureID, boolean resolve, boolean coreType) {
- switch (featureID) {
- case RosPackage.CATKIN_PACKAGE__DEPENDENCY:
- return getDependency();
- }
- return super.eGet(featureID, resolve, coreType);
- }
-
- /**
- *
- *
- * @generated
- */
- @SuppressWarnings("unchecked")
- @Override
- public void eSet(int featureID, Object newValue) {
- switch (featureID) {
- case RosPackage.CATKIN_PACKAGE__DEPENDENCY:
- getDependency().clear();
- getDependency().addAll((Collection extends Dependency>)newValue);
- return;
- }
- super.eSet(featureID, newValue);
- }
-
- /**
- *
- *
- * @generated
- */
- @Override
- public void eUnset(int featureID) {
- switch (featureID) {
- case RosPackage.CATKIN_PACKAGE__DEPENDENCY:
- getDependency().clear();
- return;
- }
- super.eUnset(featureID);
- }
-
- /**
- *
- *
- * @generated
- */
- @Override
- public boolean eIsSet(int featureID) {
- switch (featureID) {
- case RosPackage.CATKIN_PACKAGE__DEPENDENCY:
- return dependency != null && !dependency.isEmpty();
- }
- return super.eIsSet(featureID);
- }
-
} //CatkinPackageImpl
diff --git a/plugins/de.fraunhofer.ipa.ros/src/ros/impl/NodeImpl.java b/plugins/de.fraunhofer.ipa.ros/src/ros/impl/NodeImpl.java
index 60dd27f29..a7abae528 100644
--- a/plugins/de.fraunhofer.ipa.ros/src/ros/impl/NodeImpl.java
+++ b/plugins/de.fraunhofer.ipa.ros/src/ros/impl/NodeImpl.java
@@ -142,9 +142,9 @@ public class NodeImpl extends MinimalEObjectImpl.Container implements Node {
/**
*
*
- * @generated
+ * @generated NOT
*/
- protected NodeImpl() {
+ public NodeImpl() {
super();
}
@@ -153,6 +153,7 @@ protected NodeImpl() {
*
* @generated
*/
+ @Override
protected EClass eStaticClass() {
return RosPackage.Literals.NODE;
}
diff --git a/plugins/de.fraunhofer.ipa.ros/src/ros/impl/PackageImpl.java b/plugins/de.fraunhofer.ipa.ros/src/ros/impl/PackageImpl.java
index d24146fa5..1d3b1b42e 100644
--- a/plugins/de.fraunhofer.ipa.ros/src/ros/impl/PackageImpl.java
+++ b/plugins/de.fraunhofer.ipa.ros/src/ros/impl/PackageImpl.java
@@ -20,6 +20,7 @@
import org.eclipse.emf.ecore.util.InternalEList;
import ros.Artifact;
+import ros.Dependency;
import ros.RosPackage;
import ros.SpecBase;
@@ -34,6 +35,8 @@
* {@link ros.impl.PackageImpl#getName Name}
* {@link ros.impl.PackageImpl#getSpec Spec}
* {@link ros.impl.PackageImpl#getArtifact Artifact}
+ * {@link ros.impl.PackageImpl#getFromGitRepo From Git Repo}
+ * {@link ros.impl.PackageImpl#getDependency Dependency}
*
*
* @generated
@@ -80,11 +83,41 @@ public class PackageImpl extends MinimalEObjectImpl.Container implements ros.Pac
protected EList artifact;
/**
+ * The default value of the '{@link #getFromGitRepo() From Git Repo}' attribute.
*
*
+ * @see #getFromGitRepo()
* @generated
+ * @ordered
*/
- protected PackageImpl() {
+ protected static final String FROM_GIT_REPO_EDEFAULT = null;
+
+ /**
+ * The cached value of the '{@link #getFromGitRepo() From Git Repo}' attribute.
+ *
+ *
+ * @see #getFromGitRepo()
+ * @generated
+ * @ordered
+ */
+ protected String fromGitRepo = FROM_GIT_REPO_EDEFAULT;
+
+ /**
+ * The cached value of the '{@link #getDependency() Dependency}' containment reference list.
+ *
+ *
+ * @see #getDependency()
+ * @generated
+ * @ordered
+ */
+ protected EList dependency;
+
+ /**
+ *
+ *
+ * @generated NOT
+ */
+ public PackageImpl() {
super();
}
@@ -147,6 +180,42 @@ public EList getArtifact() {
return artifact;
}
+ /**
+ *
+ *
+ * @generated
+ */
+ @Override
+ public String getFromGitRepo() {
+ return fromGitRepo;
+ }
+
+ /**
+ *
+ *
+ * @generated
+ */
+ @Override
+ public void setFromGitRepo(String newFromGitRepo) {
+ String oldFromGitRepo = fromGitRepo;
+ fromGitRepo = newFromGitRepo;
+ if (eNotificationRequired())
+ eNotify(new ENotificationImpl(this, Notification.SET, RosPackage.PACKAGE__FROM_GIT_REPO, oldFromGitRepo, fromGitRepo));
+ }
+
+ /**
+ *
+ *
+ * @generated
+ */
+ @Override
+ public EList getDependency() {
+ if (dependency == null) {
+ dependency = new EObjectContainmentEList(Dependency.class, this, RosPackage.PACKAGE__DEPENDENCY);
+ }
+ return dependency;
+ }
+
/**
*
*
@@ -174,6 +243,8 @@ public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID,
return ((InternalEList>)getSpec()).basicRemove(otherEnd, msgs);
case RosPackage.PACKAGE__ARTIFACT:
return ((InternalEList>)getArtifact()).basicRemove(otherEnd, msgs);
+ case RosPackage.PACKAGE__DEPENDENCY:
+ return ((InternalEList>)getDependency()).basicRemove(otherEnd, msgs);
}
return super.eInverseRemove(otherEnd, featureID, msgs);
}
@@ -192,6 +263,10 @@ public Object eGet(int featureID, boolean resolve, boolean coreType) {
return getSpec();
case RosPackage.PACKAGE__ARTIFACT:
return getArtifact();
+ case RosPackage.PACKAGE__FROM_GIT_REPO:
+ return getFromGitRepo();
+ case RosPackage.PACKAGE__DEPENDENCY:
+ return getDependency();
}
return super.eGet(featureID, resolve, coreType);
}
@@ -216,6 +291,13 @@ public void eSet(int featureID, Object newValue) {
getArtifact().clear();
getArtifact().addAll((Collection extends Artifact>)newValue);
return;
+ case RosPackage.PACKAGE__FROM_GIT_REPO:
+ setFromGitRepo((String)newValue);
+ return;
+ case RosPackage.PACKAGE__DEPENDENCY:
+ getDependency().clear();
+ getDependency().addAll((Collection extends Dependency>)newValue);
+ return;
}
super.eSet(featureID, newValue);
}
@@ -237,6 +319,12 @@ public void eUnset(int featureID) {
case RosPackage.PACKAGE__ARTIFACT:
getArtifact().clear();
return;
+ case RosPackage.PACKAGE__FROM_GIT_REPO:
+ setFromGitRepo(FROM_GIT_REPO_EDEFAULT);
+ return;
+ case RosPackage.PACKAGE__DEPENDENCY:
+ getDependency().clear();
+ return;
}
super.eUnset(featureID);
}
@@ -255,6 +343,10 @@ public boolean eIsSet(int featureID) {
return spec != null && !spec.isEmpty();
case RosPackage.PACKAGE__ARTIFACT:
return artifact != null && !artifact.isEmpty();
+ case RosPackage.PACKAGE__FROM_GIT_REPO:
+ return FROM_GIT_REPO_EDEFAULT == null ? fromGitRepo != null : !FROM_GIT_REPO_EDEFAULT.equals(fromGitRepo);
+ case RosPackage.PACKAGE__DEPENDENCY:
+ return dependency != null && !dependency.isEmpty();
}
return super.eIsSet(featureID);
}
@@ -271,6 +363,8 @@ public String toString() {
StringBuilder result = new StringBuilder(super.toString());
result.append(" (name: ");
result.append(name);
+ result.append(", fromGitRepo: ");
+ result.append(fromGitRepo);
result.append(')');
return result.toString();
}
diff --git a/plugins/de.fraunhofer.ipa.ros/src/ros/impl/ParameterImpl.java b/plugins/de.fraunhofer.ipa.ros/src/ros/impl/ParameterImpl.java
index 31d781d17..65027d362 100644
--- a/plugins/de.fraunhofer.ipa.ros/src/ros/impl/ParameterImpl.java
+++ b/plugins/de.fraunhofer.ipa.ros/src/ros/impl/ParameterImpl.java
@@ -53,9 +53,9 @@ public class ParameterImpl extends NamespacedElementImpl implements Parameter {
/**
*
*
- * @generated
+ * @generated NOT
*/
- protected ParameterImpl() {
+ public ParameterImpl() {
super();
}
diff --git a/plugins/de.fraunhofer.ipa.ros/src/ros/impl/PublisherImpl.java b/plugins/de.fraunhofer.ipa.ros/src/ros/impl/PublisherImpl.java
index 99a977bb1..1cb45d834 100644
--- a/plugins/de.fraunhofer.ipa.ros/src/ros/impl/PublisherImpl.java
+++ b/plugins/de.fraunhofer.ipa.ros/src/ros/impl/PublisherImpl.java
@@ -40,9 +40,9 @@ public class PublisherImpl extends NamespacedElementImpl implements Publisher {
/**
*
*
- * @generated
+ * @generated NOT
*/
- protected PublisherImpl() {
+ public PublisherImpl() {
super();
}
diff --git a/plugins/de.fraunhofer.ipa.ros/src/ros/impl/RosFactoryImpl.java b/plugins/de.fraunhofer.ipa.ros/src/ros/impl/RosFactoryImpl.java
index 6bde94d9f..56977a400 100644
--- a/plugins/de.fraunhofer.ipa.ros/src/ros/impl/RosFactoryImpl.java
+++ b/plugins/de.fraunhofer.ipa.ros/src/ros/impl/RosFactoryImpl.java
@@ -14,6 +14,7 @@
import ros.ActionClient;
import ros.ActionServer;
import ros.ActionSpec;
+import ros.AmentPackage;
import ros.Artifact;
import ros.CatkinPackage;
import ros.ExternalDependency;
@@ -143,6 +144,7 @@ public EObject create(EClass eClass) {
case RosPackage.PARAMETER_STRUCT: return createParameterStruct();
case RosPackage.PARAMETER_STRUCT_MEMBER: return createParameterStructMember();
case RosPackage.PARAMETER_DATE: return createParameterDate();
+ case RosPackage.AMENT_PACKAGE: return createAmentPackage();
default:
throw new IllegalArgumentException("The class '" + eClass.getName() + "' is not a valid classifier");
}
@@ -651,6 +653,17 @@ public ParameterDate createParameterDate() {
return parameterDate;
}
+ /**
+ *
+ *
+ * @generated
+ */
+ @Override
+ public AmentPackage createAmentPackage() {
+ AmentPackageImpl amentPackage = new AmentPackageImpl();
+ return amentPackage;
+ }
+
/**
*
*
diff --git a/plugins/de.fraunhofer.ipa.ros/src/ros/impl/RosPackageImpl.java b/plugins/de.fraunhofer.ipa.ros/src/ros/impl/RosPackageImpl.java
index 9188a52c6..511ce08d2 100644
--- a/plugins/de.fraunhofer.ipa.ros/src/ros/impl/RosPackageImpl.java
+++ b/plugins/de.fraunhofer.ipa.ros/src/ros/impl/RosPackageImpl.java
@@ -17,6 +17,7 @@
import ros.ActionClient;
import ros.ActionServer;
import ros.ActionSpec;
+import ros.AmentPackage;
import ros.Artifact;
import ros.CatkinPackage;
import ros.Dependency;
@@ -407,6 +408,13 @@ public class RosPackageImpl extends EPackageImpl implements RosPackage {
*/
private EClass parameterDateEClass = null;
+ /**
+ *
+ *
+ * @generated
+ */
+ private EClass amentPackageEClass = null;
+
/**
*
*
@@ -427,9 +435,9 @@ public class RosPackageImpl extends EPackageImpl implements RosPackage {
* @see org.eclipse.emf.ecore.EPackage.Registry
* @see ros.RosPackage#eNS_URI
* @see #init()
- * @generated
+ * @generated NOT
*/
- private RosPackageImpl() {
+ public RosPackageImpl() {
super(eNS_URI, RosFactory.eINSTANCE);
}
@@ -614,6 +622,26 @@ public EReference getPackage_Artifact() {
return (EReference)packageEClass.getEStructuralFeatures().get(2);
}
+ /**
+ *
+ *
+ * @generated
+ */
+ @Override
+ public EAttribute getPackage_FromGitRepo() {
+ return (EAttribute)packageEClass.getEStructuralFeatures().get(3);
+ }
+
+ /**
+ *
+ *
+ * @generated
+ */
+ @Override
+ public EReference getPackage_Dependency() {
+ return (EReference)packageEClass.getEStructuralFeatures().get(4);
+ }
+
/**
*
*
@@ -764,16 +792,6 @@ public EClass getCatkinPackage() {
return catkinPackageEClass;
}
- /**
- *
- *
- * @generated
- */
- @Override
- public EReference getCatkinPackage_Dependency() {
- return (EReference)catkinPackageEClass.getEStructuralFeatures().get(0);
- }
-
/**
*
*
@@ -1604,6 +1622,16 @@ public EAttribute getParameterDate_Value() {
return (EAttribute)parameterDateEClass.getEStructuralFeatures().get(0);
}
+ /**
+ *
+ *
+ * @generated
+ */
+ @Override
+ public EClass getAmentPackage() {
+ return amentPackageEClass;
+ }
+
/**
*
*
@@ -1657,6 +1685,8 @@ public void createPackageContents() {
createEAttribute(packageEClass, PACKAGE__NAME);
createEReference(packageEClass, PACKAGE__SPEC);
createEReference(packageEClass, PACKAGE__ARTIFACT);
+ createEAttribute(packageEClass, PACKAGE__FROM_GIT_REPO);
+ createEReference(packageEClass, PACKAGE__DEPENDENCY);
dependencyEClass = createEClass(DEPENDENCY);
@@ -1677,7 +1707,6 @@ public void createPackageContents() {
createEAttribute(externalDependencyEClass, EXTERNAL_DEPENDENCY__NAME);
catkinPackageEClass = createEClass(CATKIN_PACKAGE);
- createEReference(catkinPackageEClass, CATKIN_PACKAGE__DEPENDENCY);
publisherEClass = createEClass(PUBLISHER);
createEReference(publisherEClass, PUBLISHER__MESSAGE);
@@ -1803,6 +1832,8 @@ public void createPackageContents() {
parameterDateEClass = createEClass(PARAMETER_DATE);
createEAttribute(parameterDateEClass, PARAMETER_DATE__VALUE);
+ amentPackageEClass = createEClass(AMENT_PACKAGE);
+
// Create data types
graphNameEDataType = createEDataType(GRAPH_NAME);
}
@@ -1874,6 +1905,7 @@ public void initializePackageContents() {
parameterSequenceEClass.getESuperTypes().add(this.getParameterValue());
parameterStructEClass.getESuperTypes().add(this.getParameterValue());
parameterDateEClass.getESuperTypes().add(this.getParameterValue());
+ amentPackageEClass.getESuperTypes().add(this.getPackage());
// Initialize classes, features, and operations; add parameters
initEClass(nodeEClass, Node.class, "Node", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
@@ -1890,6 +1922,8 @@ public void initializePackageContents() {
initEAttribute(getPackage_Name(), ecorePackage.getEString(), "name", null, 1, 1, ros.Package.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
initEReference(getPackage_Spec(), this.getSpecBase(), this.getSpecBase_Package(), "spec", null, 0, -1, ros.Package.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
initEReference(getPackage_Artifact(), this.getArtifact(), null, "artifact", null, 0, -1, ros.Package.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+ initEAttribute(getPackage_FromGitRepo(), ecorePackage.getEString(), "fromGitRepo", null, 0, 1, ros.Package.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+ initEReference(getPackage_Dependency(), this.getDependency(), null, "dependency", null, 0, -1, ros.Package.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
initEClass(dependencyEClass, Dependency.class, "Dependency", IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
@@ -1910,7 +1944,6 @@ public void initializePackageContents() {
initEAttribute(getExternalDependency_Name(), ecorePackage.getEString(), "name", null, 1, 1, ExternalDependency.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
initEClass(catkinPackageEClass, CatkinPackage.class, "CatkinPackage", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
- initEReference(getCatkinPackage_Dependency(), this.getDependency(), null, "dependency", null, 0, -1, CatkinPackage.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
initEClass(publisherEClass, Publisher.class, "Publisher", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
initEReference(getPublisher_Message(), this.getTopicSpec(), null, "message", null, 1, 1, Publisher.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
@@ -2036,6 +2069,8 @@ public void initializePackageContents() {
initEClass(parameterDateEClass, ParameterDate.class, "ParameterDate", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
initEAttribute(getParameterDate_Value(), theXMLTypePackage.getDateTime(), "value", null, 1, 1, ParameterDate.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+ initEClass(amentPackageEClass, AmentPackage.class, "AmentPackage", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+
// Initialize data types
initEDataType(graphNameEDataType, String.class, "GraphName", IS_SERIALIZABLE, !IS_GENERATED_INSTANCE_CLASS);
diff --git a/plugins/de.fraunhofer.ipa.ros/src/ros/impl/SubscriberImpl.java b/plugins/de.fraunhofer.ipa.ros/src/ros/impl/SubscriberImpl.java
index 119c195cd..92ddac04d 100644
--- a/plugins/de.fraunhofer.ipa.ros/src/ros/impl/SubscriberImpl.java
+++ b/plugins/de.fraunhofer.ipa.ros/src/ros/impl/SubscriberImpl.java
@@ -40,7 +40,7 @@ public class SubscriberImpl extends NamespacedElementImpl implements Subscriber
/**
*
*
- * @generated
+ * @generated NOT
*/
public SubscriberImpl() {
super();
diff --git a/plugins/de.fraunhofer.ipa.ros/src/ros/impl/TopicSpecImpl.java b/plugins/de.fraunhofer.ipa.ros/src/ros/impl/TopicSpecImpl.java
index 6124fee65..182e07166 100644
--- a/plugins/de.fraunhofer.ipa.ros/src/ros/impl/TopicSpecImpl.java
+++ b/plugins/de.fraunhofer.ipa.ros/src/ros/impl/TopicSpecImpl.java
@@ -41,9 +41,9 @@ public class TopicSpecImpl extends SpecBaseImpl implements TopicSpec {
/**
*
*
- * @generated
+ * @generated NOT
*/
- protected TopicSpecImpl() {
+ public TopicSpecImpl() {
super();
}
diff --git a/plugins/de.fraunhofer.ipa.ros/src/ros/util/RosAdapterFactory.java b/plugins/de.fraunhofer.ipa.ros/src/ros/util/RosAdapterFactory.java
index 1e63f3725..ea43dcb00 100644
--- a/plugins/de.fraunhofer.ipa.ros/src/ros/util/RosAdapterFactory.java
+++ b/plugins/de.fraunhofer.ipa.ros/src/ros/util/RosAdapterFactory.java
@@ -11,6 +11,7 @@
import ros.ActionClient;
import ros.ActionServer;
import ros.ActionSpec;
+import ros.AmentPackage;
import ros.Artifact;
import ros.CatkinPackage;
import ros.Dependency;
@@ -306,6 +307,10 @@ public Adapter caseParameterDate(ParameterDate object) {
return createParameterDateAdapter();
}
@Override
+ public Adapter caseAmentPackage(AmentPackage object) {
+ return createAmentPackageAdapter();
+ }
+ @Override
public Adapter defaultCase(EObject object) {
return createEObjectAdapter();
}
@@ -997,6 +1002,20 @@ public Adapter createParameterDateAdapter() {
return null;
}
+ /**
+ * Creates a new adapter for an object of class '{@link ros.AmentPackage Ament Package}'.
+ *
+ * This default implementation returns null so that we can easily ignore cases;
+ * it's useful to ignore a case when inheritance will catch all the cases anyway.
+ *
+ * @return the new adapter.
+ * @see ros.AmentPackage
+ * @generated
+ */
+ public Adapter createAmentPackageAdapter() {
+ return null;
+ }
+
/**
* Creates a new adapter for the default case.
*
diff --git a/plugins/de.fraunhofer.ipa.ros/src/ros/util/RosSwitch.java b/plugins/de.fraunhofer.ipa.ros/src/ros/util/RosSwitch.java
index 49d96888c..dfb2d591b 100644
--- a/plugins/de.fraunhofer.ipa.ros/src/ros/util/RosSwitch.java
+++ b/plugins/de.fraunhofer.ipa.ros/src/ros/util/RosSwitch.java
@@ -9,6 +9,7 @@
import ros.ActionClient;
import ros.ActionServer;
import ros.ActionSpec;
+import ros.AmentPackage;
import ros.Artifact;
import ros.CatkinPackage;
import ros.Dependency;
@@ -436,6 +437,13 @@ protected T doSwitch(int classifierID, EObject theEObject) {
if (result == null) result = defaultCase(theEObject);
return result;
}
+ case RosPackage.AMENT_PACKAGE: {
+ AmentPackage amentPackage = (AmentPackage)theEObject;
+ T result = caseAmentPackage(amentPackage);
+ if (result == null) result = casePackage(amentPackage);
+ if (result == null) result = defaultCase(theEObject);
+ return result;
+ }
default: return defaultCase(theEObject);
}
}
@@ -1160,6 +1168,21 @@ public T caseParameterDate(ParameterDate object) {
return null;
}
+ /**
+ * Returns the result of interpreting the object as an instance of 'Ament Package'.
+ *
+ * This implementation returns null;
+ * returning a non-null result will terminate the switch.
+ *
+ * @param object the target of the switch.
+ * @return the result of interpreting the object as an instance of 'Ament Package'.
+ * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+ * @generated
+ */
+ public T caseAmentPackage(AmentPackage object) {
+ return null;
+ }
+
/**
* Returns the result of interpreting the object as an instance of 'EObject'.
*
diff --git a/plugins/de.fraunhofer.ipa.roscode.generator/META-INF/MANIFEST.MF b/plugins/de.fraunhofer.ipa.roscode.generator/META-INF/MANIFEST.MF
index faaf774b6..01badcbb0 100644
--- a/plugins/de.fraunhofer.ipa.roscode.generator/META-INF/MANIFEST.MF
+++ b/plugins/de.fraunhofer.ipa.roscode.generator/META-INF/MANIFEST.MF
@@ -2,7 +2,7 @@ Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: de.seronet_projekt.componentGateway.generator
Bundle-SymbolicName: de.fraunhofer.ipa.roscode.generator;singleton:=true
-Bundle-Version: 1.5.0.qualifier
+Bundle-Version: 2.0.0.qualifier
Bundle-Vendor: SeRoNet (www.seronet-projekt.de)
Export-Package: de.fraunhofer.ipa.roscode.generator
Bundle-RequiredExecutionEnvironment: JavaSE-1.8
diff --git a/plugins/de.fraunhofer.ipa.roscode.generator/pom.xml b/plugins/de.fraunhofer.ipa.roscode.generator/pom.xml
index 9a1f37b1a..bf60bf567 100644
--- a/plugins/de.fraunhofer.ipa.roscode.generator/pom.xml
+++ b/plugins/de.fraunhofer.ipa.roscode.generator/pom.xml
@@ -4,7 +4,7 @@
de.fraunhofer.ipa.ros
de.fraunhofer.ipa.ros.parent
- 1.5.0-SNAPSHOT
+ 2.0.0-SNAPSHOT
../de.fraunhofer.ipa.ros.parent/pom.xml
de.fraunhofer.ipa.roscode.generator
diff --git a/plugins/de.fraunhofer.ipa.rossystem.deployment/.classpath b/plugins/de.fraunhofer.ipa.rossystem.deployment/.classpath
new file mode 100644
index 000000000..428337e56
--- /dev/null
+++ b/plugins/de.fraunhofer.ipa.rossystem.deployment/.classpath
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
diff --git a/plugins/de.fraunhofer.ipa.rossystem.deployment/.project b/plugins/de.fraunhofer.ipa.rossystem.deployment/.project
new file mode 100644
index 000000000..c2616bc9f
--- /dev/null
+++ b/plugins/de.fraunhofer.ipa.rossystem.deployment/.project
@@ -0,0 +1,34 @@
+
+
+ de.fraunhofer.ipa.rossystem.deployment
+
+
+
+
+
+ org.eclipse.xtext.ui.shared.xtextBuilder
+
+
+
+
+ org.eclipse.jdt.core.javabuilder
+
+
+
+
+ org.eclipse.pde.ManifestBuilder
+
+
+
+
+ org.eclipse.pde.SchemaBuilder
+
+
+
+
+
+ org.eclipse.xtext.ui.shared.xtextNature
+ org.eclipse.jdt.core.javanature
+ org.eclipse.pde.PluginNature
+
+
diff --git a/plugins/de.fraunhofer.ipa.rossystem.deployment/.settings/org.eclipse.core.resources.prefs b/plugins/de.fraunhofer.ipa.rossystem.deployment/.settings/org.eclipse.core.resources.prefs
new file mode 100644
index 000000000..99f26c020
--- /dev/null
+++ b/plugins/de.fraunhofer.ipa.rossystem.deployment/.settings/org.eclipse.core.resources.prefs
@@ -0,0 +1,2 @@
+eclipse.preferences.version=1
+encoding/=UTF-8
diff --git a/plugins/de.fraunhofer.ipa.rossystem.deployment/.settings/org.eclipse.jdt.core.prefs b/plugins/de.fraunhofer.ipa.rossystem.deployment/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 000000000..0c68a61dc
--- /dev/null
+++ b/plugins/de.fraunhofer.ipa.rossystem.deployment/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,7 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.compliance=1.8
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.8
diff --git a/plugins/de.fraunhofer.ipa.rossystem.deployment/META-INF/MANIFEST.MF b/plugins/de.fraunhofer.ipa.rossystem.deployment/META-INF/MANIFEST.MF
new file mode 100644
index 000000000..6a189c239
--- /dev/null
+++ b/plugins/de.fraunhofer.ipa.rossystem.deployment/META-INF/MANIFEST.MF
@@ -0,0 +1,18 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: de.fraunhofer.ipa.rossystem.deployment
+Bundle-SymbolicName: de.fraunhofer.ipa.rossystem.deployment;singleton:=true
+Bundle-Version: 2.0.0.qualifier
+Export-Package: de.fraunhofer.ipa.rossystem.deployment
+Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+Import-Package: javax.inject;version="1.0.0",
+ org.eclipse.ui.handlers,
+ org.eclipse.xtext.ui.resource
+Bundle-ActivationPolicy: lazy
+Bundle-Activator: de.fraunhofer.ipa.rossystem.deployment.Activator
+Require-Bundle: org.eclipse.xtext.builder,
+ org.eclipse.xtext.ui,
+ de.fraunhofer.ipa.rossystem.xtext;bundle-version="1.5.0",
+ de.fraunhofer.ipa.rossystem.xtext.ide;bundle-version="1.5.0",
+ de.fraunhofer.ipa.rossystem.xtext.ui;bundle-version="1.5.0",
+ de.fraunhofer.ipa.rossystem;bundle-version="1.5.0"
diff --git a/plugins/de.fraunhofer.ipa.rossystem.deployment/build.properties b/plugins/de.fraunhofer.ipa.rossystem.deployment/build.properties
new file mode 100644
index 000000000..b7541b62b
--- /dev/null
+++ b/plugins/de.fraunhofer.ipa.rossystem.deployment/build.properties
@@ -0,0 +1,18 @@
+source.. = src/,\
+ xtend-gen/
+bin.includes = .,\
+ META-INF/,\
+ plugin.xml
+bin.excludes = **/*.mwe2,\
+ **/*.xtend
+additional.bundles = org.eclipse.xtext.xbase,\
+ org.eclipse.xtext.common.types,\
+ org.eclipse.xtext.xtext.generator,\
+ org.eclipse.emf.codegen.ecore,\
+ org.eclipse.emf.mwe.utils,\
+ org.eclipse.emf.mwe2.lib,\
+ org.objectweb.asm,\
+ org.apache.commons.logging,\
+ org.apache.log4j,\
+ com.ibm.icu,\
+ org.eclipse.xtext.generator
diff --git a/plugins/de.fraunhofer.ipa.rossystem.deployment/plugin.xml b/plugins/de.fraunhofer.ipa.rossystem.deployment/plugin.xml
new file mode 100644
index 000000000..53a752438
--- /dev/null
+++ b/plugins/de.fraunhofer.ipa.rossystem.deployment/plugin.xml
@@ -0,0 +1,50 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/plugins/de.fraunhofer.ipa.rossystem.deployment/pom.xml b/plugins/de.fraunhofer.ipa.rossystem.deployment/pom.xml
new file mode 100644
index 000000000..951ddd370
--- /dev/null
+++ b/plugins/de.fraunhofer.ipa.rossystem.deployment/pom.xml
@@ -0,0 +1,31 @@
+
+ 4.0.0
+
+ de.fraunhofer.ipa.ros
+ de.fraunhofer.ipa.ros.parent
+ 2.0.0-SNAPSHOT
+ ../de.fraunhofer.ipa.ros.parent/pom.xml
+
+ de.fraunhofer.ipa.rossystem.deployment
+ eclipse-plugin
+
+
+
+
+ org.eclipse.xtend
+ xtend-maven-plugin
+
+
+ org.apache.maven.plugins
+ maven-clean-plugin
+
+
+ xtend-gen-clean
+ clean
+
+
+
+
+
+
diff --git a/plugins/de.fraunhofer.ipa.rossystem.deployment/src/de/fraunhofer/ipa/rossystem/deployment/Activator.java b/plugins/de.fraunhofer.ipa.rossystem.deployment/src/de/fraunhofer/ipa/rossystem/deployment/Activator.java
new file mode 100644
index 000000000..5e6b08b79
--- /dev/null
+++ b/plugins/de.fraunhofer.ipa.rossystem.deployment/src/de/fraunhofer/ipa/rossystem/deployment/Activator.java
@@ -0,0 +1,7 @@
+package de.fraunhofer.ipa.rossystem.deployment;
+
+import de.fraunhofer.ipa.rossystem.xtext.ui.internal.XtextActivator;
+
+public class Activator extends XtextActivator {
+
+}
diff --git a/plugins/de.fraunhofer.ipa.rossystem.deployment/src/de/fraunhofer/ipa/rossystem/deployment/DeploymentArtifactsGenerator.xtend b/plugins/de.fraunhofer.ipa.rossystem.deployment/src/de/fraunhofer/ipa/rossystem/deployment/DeploymentArtifactsGenerator.xtend
new file mode 100644
index 000000000..66ade27c4
--- /dev/null
+++ b/plugins/de.fraunhofer.ipa.rossystem.deployment/src/de/fraunhofer/ipa/rossystem/deployment/DeploymentArtifactsGenerator.xtend
@@ -0,0 +1,112 @@
+package de.fraunhofer.ipa.rossystem.deployment
+
+import java.util.Set
+import org.eclipse.emf.ecore.resource.Resource
+import org.eclipse.xtext.generator.AbstractGenerator
+import org.eclipse.xtext.generator.IFileSystemAccess2
+import org.eclipse.xtext.generator.IGeneratorContext
+import org.eclipse.xtext.generator.IOutputConfigurationProvider
+import org.eclipse.xtext.generator.OutputConfiguration
+import de.fraunhofer.ipa.rossystem.deployment.RosInstallCompiler
+import de.fraunhofer.ipa.rossystem.deployment.DockerComposeCompiler
+import de.fraunhofer.ipa.rossystem.deployment.DockerContainerCompiler
+import de.fraunhofer.ipa.rossystem.deployment.GitActionCompiler
+import de.fraunhofer.ipa.rossystem.deployment.DeploymentHelpers
+import rossystem.RosSystem;
+import java.util.HashMap
+import java.util.Map
+import java.util.List
+import componentInterface.RosParameter
+
+class CustomOutputProvider implements IOutputConfigurationProvider {
+ public final static String DEFAULT_OUTPUT = "DEFAULT_OUTPUT"
+
+
+ override Set getOutputConfigurations() {
+ var OutputConfiguration default_config = new OutputConfiguration(DEFAULT_OUTPUT)
+ default_config.setDescription("DEFAULT_OUTPUT");
+ default_config.setOutputDirectory("./src-gen/");
+ default_config.setOverrideExistingResources(true);
+ default_config.setCreateOutputDirectory(true);
+ default_config.setCleanUpDerivedResources(true);
+ default_config.setSetDerivedProperty(true);
+ return newHashSet(default_config)
+ }
+}
+
+/**
+ * Generates code from your model files on save.
+ *
+ * See https://www.eclipse.org/Xtext/documentation/303_runtime_concepts.html#code-generation
+ */
+class DeploymentArtifactsGenerator extends AbstractGenerator {
+
+ DockerContainerCompiler docker_compiler = new DockerContainerCompiler()
+ RosInstallCompiler rosintall_compiler = new RosInstallCompiler()
+ DockerComposeCompiler dockercompose_compiler = new DockerComposeCompiler()
+ GitActionCompiler gitaction_compiler = new GitActionCompiler()
+
+ DeploymentHelpers generator_helper = new DeploymentHelpers()
+
+ String ros_distro
+ String system_folder_prefix
+ Integer ros_version
+ Map> device_map = new HashMap>
+
+ def get_ros_distro(String distro) {
+ ros_distro = distro
+ }
+ def get_ros_version(Integer version){
+ ros_version = version
+ }
+
+ def create_system_prefix(RosSystem system){
+ if (ros_version == 2) {
+ return system.getName().toLowerCase + "_ros2"
+ }else{
+ return system.getName().toLowerCase
+ }
+ }
+ def get_portt_list(Map> ports_map){
+ for (key: ports_map.keySet()){
+ val values = newArrayList()
+ for (k: ports_map.get(key).keySet()){
+ val v = ports_map.get(key).get(k);
+ values.add(ports_map.get(key).get(k))
+ }
+ device_map.put(key, values);
+ }
+ }
+
+ override void doGenerate(Resource resource, IFileSystemAccess2 fsa, IGeneratorContext context) {
+ // ROS1 package
+ device_map.keySet().forEach[String key|
+ if (device_map.get(key).contains(null)) {
+ throw new IllegalArgumentException("Values of some device ports are not defined.")
+ }
+ ]
+ for (system : resource.allContents.toIterable.filter(RosSystem)){
+ system_folder_prefix = create_system_prefix(system)
+ if (system.componentStack.size==0){
+ fsa.generateFile(system_folder_prefix +"/Dockerfile",docker_compiler.compile_toDockerContainer(system, null, ros_distro, ros_version))
+ fsa.generateFile(system_folder_prefix +"/extra_layer/" + system.getName().toLowerCase + ".rosinstall",rosintall_compiler.compile_toRosInstall(system,null))
+ fsa.generateFile(system_folder_prefix +"/extra_layer/Dockerfile",docker_compiler.compile_toDockerImageExtraLayer(system, null,ros_distro, ros_version))
+ } else {
+ for (stack : system.componentStack){
+ val stack_folder_prefix = String.join("/", system_folder_prefix, system.name.toLowerCase+'_'+stack.name.toLowerCase)
+ fsa.generateFile(String.join("/", stack_folder_prefix, "Dockerfile"),docker_compiler.compile_toDockerContainer(system, stack, ros_distro, ros_version))
+ fsa.generateFile(String.join("/", stack_folder_prefix, "extra_layer", stack.name.toLowerCase+".rosinstall"),rosintall_compiler.compile_toRosInstall(system,stack))
+ fsa.generateFile(String.join("/", stack_folder_prefix, "extra_layer", "Dockerfile"),docker_compiler.compile_toDockerImageExtraLayer(system,stack, ros_distro, ros_version))
+ }
+ }
+
+ fsa.generateFile(String.join("/", system_folder_prefix, "docker-compose.yml"),dockercompose_compiler.compile_toDockerCompose(system, ros_distro, ros_version, device_map))
+ }
+
+ // git action workflow
+ for (system : resource.allContents.toIterable.filter(RosSystem)){
+ fsa.generateFile(String.join("/", system_folder_prefix, generator_helper.get_uniqe_name(system.name.toLowerCase, ros_distro) + "_workflow.yml") ,gitaction_compiler.compile_toGitAction(system, ros_version, ros_distro))
+ }
+ }
+
+}
diff --git a/plugins/de.fraunhofer.ipa.rossystem.deployment/src/de/fraunhofer/ipa/rossystem/deployment/DeploymentArtifactsGeneratorExecutableExtensionFactory.java b/plugins/de.fraunhofer.ipa.rossystem.deployment/src/de/fraunhofer/ipa/rossystem/deployment/DeploymentArtifactsGeneratorExecutableExtensionFactory.java
new file mode 100644
index 000000000..d3470060c
--- /dev/null
+++ b/plugins/de.fraunhofer.ipa.rossystem.deployment/src/de/fraunhofer/ipa/rossystem/deployment/DeploymentArtifactsGeneratorExecutableExtensionFactory.java
@@ -0,0 +1,19 @@
+package de.fraunhofer.ipa.rossystem.deployment;
+
+import org.eclipse.xtext.ui.guice.AbstractGuiceAwareExecutableExtensionFactory;
+import org.osgi.framework.Bundle;
+
+import com.google.inject.Injector;
+
+public class DeploymentArtifactsGeneratorExecutableExtensionFactory extends AbstractGuiceAwareExecutableExtensionFactory {
+
+ @Override
+ protected Bundle getBundle() {
+ return Activator.getInstance().getBundle();
+ }
+
+ @Override
+ protected Injector getInjector() {
+ return Activator.getInstance().getInjector(Activator.DE_FRAUNHOFER_IPA_ROSSYSTEM_ROSSYSTEM);
+ }
+ }
diff --git a/plugins/de.fraunhofer.ipa.rossystem.deployment/src/de/fraunhofer/ipa/rossystem/deployment/DeploymentHelpers.xtend b/plugins/de.fraunhofer.ipa.rossystem.deployment/src/de/fraunhofer/ipa/rossystem/deployment/DeploymentHelpers.xtend
new file mode 100644
index 000000000..286e7d241
--- /dev/null
+++ b/plugins/de.fraunhofer.ipa.rossystem.deployment/src/de/fraunhofer/ipa/rossystem/deployment/DeploymentHelpers.xtend
@@ -0,0 +1,61 @@
+package de.fraunhofer.ipa.rossystem.deployment
+
+import componentInterface.ComponentInterface
+import de.fraunhofer.ipa.rossystem.generator.GeneratorHelpers
+import java.util.ArrayList
+import java.util.HashSet
+import java.util.List
+import java.util.Set
+import ros.Dependency
+import ros.PackageDependency
+import ros.impl.PackageImpl
+import rossystem.ComponentStack
+import rossystem.RosSystem
+
+class DeploymentHelpers extends GeneratorHelpers {
+ List ComponentsList
+ PackageImpl component_package
+ Set Repos
+
+ def get_uniqe_name(String prefix, String ros_distro) {
+ return prefix + "_" + ros_distro
+ }
+
+ def get_folder_name(String prefix, String ros_distro) {
+ if(ros_distro=="foxy") {
+ return prefix + "_ros2"
+ }
+ else{
+ return prefix
+ }
+ }
+
+ def Set listOfRepos(Object subsystem) {
+ new ArrayList()
+ ComponentsList = new ArrayList();
+ if (subsystem.class.toString.contains("RosSystemImpl")){
+ ComponentsList = (subsystem as RosSystem).rosComponent
+ } else if (subsystem.class.toString.contains("ComponentStackImpl")) {
+ ComponentsList = (subsystem as ComponentStack).rosComponent
+ }
+
+ Repos = new HashSet();
+ for (ComponentInterface component: ComponentsList){
+ component_package = null;
+ component_package = get_pkg(component);
+ if (component_package !== null){
+ if (component_package.fromGitRepo !== null){
+ Repos.add(component_package.fromGitRepo);
+ }
+ if (!component_package.dependency.empty){
+ for (Dependency depend: component_package.dependency){
+ if ((depend as PackageDependency).package !== null){
+ if ((depend as PackageDependency).package.fromGitRepo !== null){
+ Repos.add((depend as PackageDependency).package.fromGitRepo);
+ }
+ }
+ }
+ }}}
+ return Repos;
+ }
+}
diff --git a/plugins/de.fraunhofer.ipa.rossystem.deployment/src/de/fraunhofer/ipa/rossystem/deployment/DockerComposeCompiler.xtend b/plugins/de.fraunhofer.ipa.rossystem.deployment/src/de/fraunhofer/ipa/rossystem/deployment/DockerComposeCompiler.xtend
new file mode 100644
index 000000000..6a8c51473
--- /dev/null
+++ b/plugins/de.fraunhofer.ipa.rossystem.deployment/src/de/fraunhofer/ipa/rossystem/deployment/DockerComposeCompiler.xtend
@@ -0,0 +1,80 @@
+package de.fraunhofer.ipa.rossystem.deployment
+
+import rossystem.RosSystem
+import de.fraunhofer.ipa.rossystem.deployment.DeploymentHelpers
+import java.util.Map
+import java.util.List
+
+class DockerComposeCompiler {
+
+ DeploymentHelpers generator_helper = new DeploymentHelpers()
+
+def create_devices(List ports)'''
+«IF ports.size() > 0»
+devices:
+«FOR p: ports»
+«" "»- "«p»:«p»"
+«ENDFOR»
+«ENDIF»
+'''
+ def compile_toDockerCompose(RosSystem system, String ros_distro, Integer ros_version, Map> device_map) '''«generator_helper.init_pkg()»
+«IF ros_version == 1»
+version: "3.3"
+networks:
+ ros:
+ driver: bridge
+services:
+ ros-master:
+ image: ros:«ros_distro»-ros-core
+ command: stdbuf -o L roscore
+ networks:
+ - ros
+
+«IF system.getComponentStack().isEmpty()»
+«" "»«generator_helper.get_uniqe_name(system.name.toLowerCase, ros_distro)»:
+ image: "«generator_helper.get_uniqe_name(system.name.toLowerCase, ros_distro)»:latest"
+ depends_on:
+ - ros-master
+ environment:
+ - "ROS_MASTER_URI=http://ros-master:11311"
+ - "ROS_HOSTNAME=«system.name.toLowerCase»"
+ networks:
+ - ros
+ «create_devices(device_map.get(system.name))»
+ command: stdbuf -o L roslaunch «system.name.toLowerCase» «system.name.toLowerCase».launch --wait
+«ELSE»
+«FOR stack:system.componentStack»
+«" "»«generator_helper.get_uniqe_name(system.name.toLowerCase, ros_distro)»_«stack.name.toLowerCase»:
+ image: "«generator_helper.get_uniqe_name(system.name.toLowerCase, ros_distro)»_«stack.name.toLowerCase»:latest"
+ depends_on:
+ - ros-master
+ environment:
+ - "ROS_MASTER_URI=http://ros-master:11311"
+ - "ROS_HOSTNAME=«stack.name.toLowerCase»"
+ networks:
+ - ros
+ «create_devices(device_map.get(stack.name))»
+ command: stdbuf -o L roslaunch «system.name.toLowerCase»_«stack.name.toLowerCase» «stack.name.toLowerCase».launch --wait
+
+«ENDFOR»
+«ENDIF»
+«ELSE»
+version: "3.3"
+services:
+«IF system.getComponentStack().isEmpty()»
+«" "»«generator_helper.get_uniqe_name(system.name.toLowerCase, ros_distro)»:
+ image: "«generator_helper.get_uniqe_name(system.name.toLowerCase, ros_distro)»:latest"
+ «create_devices(device_map.get(system.name))»
+ command: stdbuf -o L ros2 launch «system.name.toLowerCase» «system.name.toLowerCase».launch.py
+«ELSE»
+«FOR stack:system.componentStack»
+«" "»«generator_helper.get_uniqe_name(system.name.toLowerCase, ros_distro)»_«stack.name.toLowerCase»:
+ image: "«generator_helper.get_uniqe_name(system.name.toLowerCase, ros_distro)»_«stack.name.toLowerCase»:latest"
+ «create_devices(device_map.get(stack.name))»
+ command: stdbuf -o L ros2 launch «system.name.toLowerCase»_«stack.name.toLowerCase» «stack.name.toLowerCase».launch.py
+
+«ENDFOR»
+«ENDIF»
+«ENDIF»
+'''
+}
diff --git a/plugins/de.fraunhofer.ipa.rossystem.deployment/src/de/fraunhofer/ipa/rossystem/deployment/DockerContainerCompiler.xtend b/plugins/de.fraunhofer.ipa.rossystem.deployment/src/de/fraunhofer/ipa/rossystem/deployment/DockerContainerCompiler.xtend
new file mode 100644
index 000000000..891a68123
--- /dev/null
+++ b/plugins/de.fraunhofer.ipa.rossystem.deployment/src/de/fraunhofer/ipa/rossystem/deployment/DockerContainerCompiler.xtend
@@ -0,0 +1,122 @@
+package de.fraunhofer.ipa.rossystem.deployment
+
+import rossystem.RosSystem
+import rossystem.ComponentStack
+import de.fraunhofer.ipa.rossystem.deployment.DeploymentHelpers
+
+class DockerContainerCompiler {
+ DeploymentHelpers generator_helper = new DeploymentHelpers()
+
+ def dockerfile_header(Integer ros_version) '''
+# syntax=docker/dockerfile:experimental
+ARG SUFFIX=
+ARG BUILDER_SUFFIX=:ros«ros_version»
+ARG PREFIX=
+ '''
+ def compile_toDockerContainer(RosSystem system, ComponentStack stack, String ros_distro, Integer ros_version) '''«generator_helper.init_pkg()»
+«dockerfile_header(ros_version)»
+«IF stack===null»
+ «IF generator_helper.listOfRepos(system).isEmpty()»
+FROM ros:«ros_distro»-ros-core as base
+ «ELSE»
+FROM ${PREFIX}extra_layer_«generator_helper.get_uniqe_name(system.name.toLowerCase, ros_distro)»${SUFFIX} as base
+ «ENDIF»
+«ELSE»
+ «IF generator_helper.listOfRepos(stack).isEmpty()»
+FROM ros:«ros_distro»-ros-core as base
+ «ELSE»
+FROM ${PREFIX}extra_layer_«generator_helper.get_uniqe_name(system.name.toLowerCase, ros_distro)»_«stack.name.toLowerCase»${SUFFIX} as base
+ «ENDIF»
+«ENDIF»
+FROM ${PREFIX}builder${BUILDER_SUFFIX} as builder
+
+FROM base as build
+COPY . /root/ws/src/«IF stack===null»«system.name.toLowerCase»«ELSE»«system.name.toLowerCase»_«stack.name.toLowerCase»«ENDIF»«IF ros_version===2»_ros2«ENDIF»/
+RUN --mount=type=bind,from=builder,target=/builder \
+ apt-get update -qq && \
+ «IF ros_version===2»/builder/workspace.bash builder_setup && \«ENDIF»
+ /builder/workspace.bash build_workspace /root/ws && \
+ rm -rf /var/lib/apt/lists/*
+
+FROM build as test
+RUN --mount=type=bind,from=builder,target=/builder \
+ apt-get update -qq && \
+ /builder/workspace.bash test_workspace /root/ws && \
+ rm -rf /var/lib/apt/lists/*
+
+FROM build as install
+RUN --mount=type=bind,from=builder,target=/builder \
+ apt-get update -qq && \
+ /builder/workspace.bash install_workspace /root/ws && \
+ rm -rf /var/lib/apt/lists/*
+
+FROM install as full
+RUN --mount=type=bind,from=builder,target=/builder \
+ apt-get update -qq && \
+ /builder/workspace.bash install_depends /root/ws && \
+ rm -rf /var/lib/apt/lists/*
+
+FROM base as deploy
+RUN --mount=type=bind,from=builder,target=/builder --mount=type=bind,target=/root/ws,from=install,source=/root/ws \
+ apt-get update -qq && \
+ /builder/workspace.bash install_depends /root/ws && \
+ rm -rf /var/lib/apt/lists/*
+COPY --from=install /opt/ros/$ROS_DISTRO /opt/ros/$ROS_DISTRO
+
+FROM deploy as launch
+«IF ros_version==1»
+«IF stack===null»CMD ["roslaunch", "«system.name»", "«system.name».launch"]«ELSE»CMD ["roslaunch", "«system.name.toLowerCase»_«stack.name.toLowerCase»", "«stack.name.toLowerCase».launch"]«ENDIF»
+«ELSE»
+«IF stack===null»CMD ["ros2", "launch", "«system.name.toLowerCase»", "«system.name.toLowerCase».launch.py"]«ELSE»CMD ["ros2", "launch", "«system.name.toLowerCase»_«stack.name.toLowerCase»", "«stack.name.toLowerCase».launch.py"]«ENDIF»
+«ENDIF»
+'''
+
+ def compile_toDockerImageExtraLayer(RosSystem system, ComponentStack stack, String ros_distro, Integer ros_version) '''«generator_helper.init_pkg()»
+«IF (stack===null && !generator_helper.listOfRepos(system).isEmpty()) || (stack !==null && !generator_helper.listOfRepos(stack).isEmpty()) »
+«dockerfile_header(ros_version)»
+FROM ros:«ros_distro»-ros-core as base
+FROM ${PREFIX}builder${BUILDER_SUFFIX} as builder
+
+FROM base as pre_build
+COPY * /root/ws/src/
+RUN --mount=type=bind,from=builder,target=/builder \
+ apt-get update -qq && \
+ «IF ros_version===2»/builder/workspace.bash builder_setup && \«ENDIF»
+ /builder/workspace.bash update_list /root/ws && \
+ rm -rf /var/lib/apt/lists/*
+
+FROM pre_build as build
+RUN --mount=type=bind,from=builder,target=/builder \
+ apt-get update -qq && \
+ /builder/workspace.bash build_workspace /root/ws && \
+ rm -rf /var/lib/apt/lists/*
+
+FROM build as test
+RUN --mount=type=bind,from=builder,target=/builder \
+ apt-get update -qq && \
+ /builder/workspace.bash test_workspace /root/ws && \
+ rm -rf /var/lib/apt/lists/*
+
+FROM build as install
+RUN --mount=type=bind,from=builder,target=/builder \
+ apt-get update -qq && \
+ /builder/workspace.bash install_workspace /root/ws && \
+ rm -rf /var/lib/apt/lists/*
+
+FROM install as full
+RUN --mount=type=bind,from=builder,target=/builder \
+ apt-get update -qq && \
+ /builder/workspace.bash install_depends /root/ws && \
+ rm -rf /var/lib/apt/lists/*
+
+FROM build as deploy
+RUN --mount=type=bind,from=builder,target=/builder \
+ --mount=type=bind,target=/root/ws,from=install,source=/root/ws \
+ apt-get update -qq && \
+ /builder/workspace.bash install_depends /root/ws && \
+ rm -rf /var/lib/apt/lists/*
+COPY --from=install /opt/ros/$ROS_DISTRO /opt/ros/$ROS_DISTRO
+ «ENDIF»
+'''
+
+}
diff --git a/plugins/de.fraunhofer.ipa.rossystem.deployment/src/de/fraunhofer/ipa/rossystem/deployment/GenerationHandler.java b/plugins/de.fraunhofer.ipa.rossystem.deployment/src/de/fraunhofer/ipa/rossystem/deployment/GenerationHandler.java
new file mode 100644
index 000000000..ad2eda7c7
--- /dev/null
+++ b/plugins/de.fraunhofer.ipa.rossystem.deployment/src/de/fraunhofer/ipa/rossystem/deployment/GenerationHandler.java
@@ -0,0 +1,207 @@
+package de.fraunhofer.ipa.rossystem.deployment;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.core.commands.AbstractHandler;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.core.commands.IHandler;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.emf.common.util.BasicEList;
+import org.eclipse.emf.common.util.EList;
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.emf.ecore.resource.ResourceSet;
+import org.eclipse.jface.dialogs.InputDialog;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.dialogs.ElementListSelectionDialog;
+import org.eclipse.ui.handlers.HandlerUtil;
+import org.eclipse.xtext.builder.EclipseResourceFileSystemAccess2;
+import org.eclipse.xtext.generator.GeneratorContext;
+import org.eclipse.xtext.generator.IOutputConfigurationProvider;
+import org.eclipse.xtext.generator.OutputConfiguration;
+import org.eclipse.xtext.resource.IResourceDescriptions;
+import org.eclipse.xtext.ui.resource.IResourceSetProvider;
+
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+
+import componentInterface.ComponentInterface;
+import componentInterface.RosParameter;
+import rossystem.ComponentStack;
+import rossystem.RosSystem;
+
+public class GenerationHandler extends AbstractHandler implements IHandler {
+
+ @Inject
+ private Provider fileAccessProvider;
+
+ @Inject
+ IResourceDescriptions resourceDescriptions;
+
+ @Inject
+ IResourceSetProvider resourceSetProvider;
+
+ static Map getOutputConfigurationsAsMap(IOutputConfigurationProvider provider) {
+ Map outputs = new HashMap();
+ for(OutputConfiguration c: provider.getOutputConfigurations()) {
+ outputs.put(c.getName(), c);
+ }
+ return outputs;
+ }
+
+ @Override
+ public Object execute(ExecutionEvent event) throws ExecutionException {
+
+ ISelection selection = HandlerUtil.getCurrentSelection(event);
+ if (selection instanceof IStructuredSelection) {
+ IStructuredSelection structuredSelection = (IStructuredSelection) selection;
+ Object firstElement = structuredSelection.getFirstElement();
+ if (firstElement instanceof IFile) {
+ IFile file = (IFile) firstElement;
+ IProject project = file.getProject();
+
+ final EclipseResourceFileSystemAccess2 fsa = fileAccessProvider.get();
+ fsa.setProject(project);
+ fsa.setOutputConfigurations(getOutputConfigurationsAsMap(new CustomOutputProvider()));
+ fsa.setMonitor(new NullProgressMonitor());
+
+ URI uri = URI.createPlatformResourceURI(file.getFullPath().toString(), true);
+ ResourceSet rs = resourceSetProvider.get(project);
+ Resource r = rs.getResource(uri, true);
+ RosSystem system = (RosSystem)r.getContents().get(0);
+
+ Display display = Display.getDefault();
+ Shell shell = display.getActiveShell();
+
+ Map result = select_ros_distro(shell, project);
+
+ DeploymentArtifactsGenerator generator = new DeploymentArtifactsGenerator();
+ String distro = result.keySet().stream().findFirst().get();
+ generator.get_ros_distro(distro);
+ generator.get_ros_version(result.get(distro));
+
+ Map> sys_param_port = set_ports_from_parameters(shell, system);
+ generator.get_portt_list(sys_param_port);
+ // Todo: check if package type maps to the select version
+ generator.doGenerate(r, fsa, new GeneratorContext());
+ }
+ }
+ return null;
+ }
+
+ private Map select_ros_distro(Shell shell, IProject project) {
+ Map ros_distro_map = new HashMap() {{
+ put("melodic", 1);
+ put("noetic", 1);
+ put("foxy", 2);
+ }};
+
+ ElementListSelectionDialog dialog = new ElementListSelectionDialog(shell, new LabelProvider());
+ dialog.setElements(ros_distro_map.keySet().toArray());
+ dialog.setTitle("Select a ROS Distro");
+ dialog.setMultipleSelection(false);
+ dialog.open();
+
+ Map result = new HashMap() {{
+ put(dialog.getResult()[0].toString(), ros_distro_map.get(dialog.getResult()[0]));
+ }};
+ return result;
+ }
+
+ private Map> set_ports_from_parameters(Shell shell, RosSystem system) {
+ Map> sys_param_portvalue_map=new HashMap<>();
+ EList roscomponents = new BasicEList();
+ EList stacks = system.getComponentStack();
+ String label = system.getName();
+ if (stacks.size() == 0) {
+ roscomponents = system.getRosComponent();
+ sys_param_portvalue_map.put(system.getName(), get_component_port_value(shell, roscomponents, label));
+ }else {
+ for (ComponentStack stack: stacks) {
+ label = stack.getName();
+ roscomponents = stack.getRosComponent();
+ sys_param_portvalue_map.put(stack.getName(), get_component_port_value(shell, roscomponents, label));
+ }
+ }
+
+ return sys_param_portvalue_map;
+ }
+
+ private Mapget_component_port_value(Shell shell, EList roscomponents, String label) {
+ Map param_portvalue_map=new HashMap<>();
+ Map param_name_map = new HashMap();
+ List param_names = new ArrayList();
+ for (RosParameter param : get_all_ros_params(roscomponents)) {
+ param_names.add(param.getName());
+ param_name_map.put(param.getName(), param);
+ }
+
+ if (param_names.size() > 0) {
+ ElementListSelectionDialog dialog = new ElementListSelectionDialog(shell, new LabelProvider());
+ dialog.setElements(param_names.toArray());
+ dialog.setTitle(String.format("%s: Select parameters for setting ports", label));
+ dialog.setMessage("If your robot setup has devices connected through ports that have to be configure, please select their parameters. Otherwise, press cancel ");
+ dialog.setMultipleSelection(true);
+ dialog.open();
+
+ if(dialog.getResult() != null) {
+ for(Object param_name : dialog.getResult()) {
+ RosParameter tmp_value = param_name_map.get(param_name.toString());
+ if(tmp_value != null) {
+ if(tmp_value.getValue() != null) {
+ String raw_value = tmp_value.getValue().toString().replace(" ", "");
+ String value = raw_value.substring(raw_value.lastIndexOf(":")+1, raw_value.lastIndexOf(")"));
+ MessageDialog dialog_check_port = new MessageDialog(shell, String.format("Check ports' values in %s", label), null,
+ String.format("The value of \"%s\" is \"%s\"", param_name.toString(), value), MessageDialog.INFORMATION, new String[] { "OK" }, 0);
+ dialog_check_port.open();
+ param_portvalue_map.put(tmp_value, value);
+ }
+ else {
+ String value = "Deployment Artifacts couldn't be generated. The selected parameter ("+param_name.toString()+") doesn't have a value set, please define it on the rossystem file and try again.";
+ MessageDialog error_dialog = new MessageDialog(shell, "ERROR", null,
+ value, MessageDialog.ERROR, new String[] { "Cancel" }, 0);
+ error_dialog.open();
+ param_portvalue_map.put(tmp_value, null);
+ }
+ }
+ }
+ }
+ }
+ return param_portvalue_map;
+ }
+
+ private EList get_all_ros_params(EList roscomponents) {
+ EList all_ros_params = new BasicEList();
+ for (int i=0; i component_params = get_ros_component_params(roscomponents.get(i));
+ for (int j= 0;j get_ros_component_params(ComponentInterface componentInterface_model){
+ List ros_component_params = new ArrayList();
+ for (RosParameter ros_param: componentInterface_model.getRosparameter()) {
+ ros_component_params.add(ros_param);
+ }
+ return ros_component_params;
+ }
+
+ @Override
+ public boolean isEnabled() {
+ return true;
+ }
+ }
diff --git a/plugins/de.fraunhofer.ipa.rossystem.deployment/src/de/fraunhofer/ipa/rossystem/deployment/GitActionCompiler.xtend b/plugins/de.fraunhofer.ipa.rossystem.deployment/src/de/fraunhofer/ipa/rossystem/deployment/GitActionCompiler.xtend
new file mode 100644
index 000000000..c31a6ea11
--- /dev/null
+++ b/plugins/de.fraunhofer.ipa.rossystem.deployment/src/de/fraunhofer/ipa/rossystem/deployment/GitActionCompiler.xtend
@@ -0,0 +1,127 @@
+package de.fraunhofer.ipa.rossystem.deployment
+
+import rossystem.RosSystem
+import de.fraunhofer.ipa.rossystem.deployment.DeploymentHelpers
+
+class GitActionCompiler {
+
+ DeploymentHelpers generator_helper = new DeploymentHelpers()
+
+ def default_part(String layer, String context_path, String needed_layer, String tag)'''
+«layer»:
+ runs-on: ubuntu-latest
+ «IF needed_layer !== null»
+ needs: «needed_layer»
+ «ENDIF»
+ steps:
+ -
+ name: Checkout
+ uses: actions/checkout@v2
+ - name: Log in to Docker Hub
+ uses: docker/login-action@v1
+ with:
+ username: ${{ secrets.DOCKER_USERNAME }}
+ password: ${{ secrets.DOCKER_PASSWORD }}
+ -
+ name: Set up QEMU
+ uses: docker/setup-qemu-action@v1
+ -
+ name: Set up Docker Buildx
+ uses: docker/setup-buildx-action@v1
+ with:
+ driver-opts: network=host
+ -
+ name: Cache Docker layers
+ uses: actions/cache@v2
+ with:
+ path: /tmp/.buildx-cache
+ key: ${{ runner.os }}-buildx-${{ github.sha }}
+ restore-keys: |
+ ${{ runner.os }}-buildx-
+ -
+ name: Get Branch
+ id: extract_branch
+ run: echo ::set-output name=branch::$(echo ${GITHUB_REF#refs/heads/} | sed 's/[^a-zA-Z0-9-]/_/g')
+ -
+ name: Docker meta
+ id: docker_meta
+ uses: docker/metadata-action@v3
+ with:
+ images: ${{ secrets.DOCKER_USERNAME }}/${{ github.job }}
+ tags: |
+ «tag»
+ type=raw,value=latest
+ -
+ name: Build and Push Docker Image
+ uses: docker/build-push-action@v2
+ with:
+ context: «context_path»
+ push: true
+ tags: ${{ steps.docker_meta.outputs.tags }}
+ labels: ${{ steps.docker_meta.outputs.labels }}
+ build-args: |
+ SUFFIX=:${{ steps.extract_branch.outputs.branch }}
+ BUILDER_SUFFIX=:${{ env.BUILDER_SUFFIX }}
+ PREFIX=${{ env.PREFIX }}
+ cache-from: type=local,src=/tmp/.buildx-cache
+ cache-to: type=local,dest=/tmp/.buildx-cache-new,mode=max
+ -
+ name: Move cache
+ run: |
+ rm -rf /tmp/.buildx-cache
+ mv /tmp/.buildx-cache-new /tmp/.buildx-cache
+ '''
+ def build_layer()'''
+ «default_part("builder", "./builder", null, "type=raw,value=${{ env.BUILDER_SUFFIX }}")»
+'''
+ def extra_layer(String sys_name, String ros_distro)
+'''
+ «default_part("extra_layer_"+ generator_helper.get_uniqe_name(sys_name, ros_distro), String.join("/", ".",generator_helper.get_folder_name(sys_name, ros_distro),"extra_layer"), null, "type=raw,value=${{ steps.extract_branch.outputs.branch }}")»
+'''
+ def extra_layer(String sys_name, String stack_name,String ros_distro)
+'''
+ «default_part(String.join("_", "extra_layer", generator_helper.get_uniqe_name(sys_name, ros_distro), stack_name), String.join("/", ".",generator_helper.get_folder_name(sys_name, ros_distro), String.join("_", sys_name, stack_name),"extra_layer"), null, "type=raw,value=${{ steps.extract_branch.outputs.branch }}")»
+'''
+ def system_layer(String sys_name, Boolean need_extra, String ros_distro)'''
+ «IF need_extra»
+ «default_part(generator_helper.get_uniqe_name(sys_name, ros_distro), "./"+ generator_helper.get_folder_name(sys_name, ros_distro), "extra_layer_"+ generator_helper.get_uniqe_name(sys_name, ros_distro), "type=raw,value=${{ steps.extract_branch.outputs.branch }}")»
+ «ELSE»
+ «default_part(generator_helper.get_uniqe_name(sys_name, ros_distro), "./"+ generator_helper.get_folder_name(sys_name, ros_distro), null, "type=raw,value=${{ steps.extract_branch.outputs.branch }}")»
+ «ENDIF»
+ '''
+ def stack_layer(String sys_name, String stack_name, String ros_distro, Boolean need_extra)'''
+ «IF need_extra»
+ «default_part(generator_helper.get_uniqe_name(sys_name, ros_distro)+"_"+stack_name, String.join("/", ".",generator_helper.get_folder_name(sys_name, ros_distro), sys_name+"_"+stack_name), String.join("_", "extra_layer", generator_helper.get_uniqe_name(sys_name, ros_distro), stack_name), "type=raw,value=${{ steps.extract_branch.outputs.branch }}")»
+ «ELSE»
+ «default_part(generator_helper.get_uniqe_name(sys_name, ros_distro)+"_"+stack_name, String.join("/", ".",generator_helper.get_folder_name(sys_name, ros_distro), sys_name+"_"+stack_name), null, "type=raw,value=${{ steps.extract_branch.outputs.branch }}")»
+ «ENDIF»
+'''
+ def compile_toGitAction(RosSystem system, Integer ros_version, String ros_distro) '''«generator_helper.init_pkg()»
+name: «generator_helper.get_uniqe_name(system.name.toLowerCase, ros_distro)»
+on:
+ push:
+ paths:
+ - '«generator_helper.get_folder_name(system.name.toLowerCase, ros_distro)»/**'
+env:
+ PREFIX: "${{ secrets.DOCKER_USERNAME }}/"
+ SUFFIX: ""
+««« Todo: get distro from model
+ BUILDER_SUFFIX: ros«ros_version»
+jobs:
+ «IF system.getComponentStack().isEmpty()»
+ «IF !generator_helper.listOfRepos(system).isEmpty()»
+ «extra_layer(system.name.toLowerCase, ros_distro)»
+ «system_layer(system.name.toLowerCase, true, ros_distro)»
+ «ELSE»
+ «system_layer(system.name.toLowerCase, false, ros_distro)»
+«ENDIF»
+«ELSE»«FOR stack : system.getComponentStack()»«IF !generator_helper.listOfRepos(stack).isEmpty()»
+ «extra_layer(system.name.toLowerCase, stack.name.toLowerCase, ros_distro)»
+ «stack_layer(system.name.toLowerCase, stack.name.toLowerCase, ros_distro, true)»
+ «ELSE»
+ «stack_layer(system.name.toLowerCase, stack.name.toLowerCase, ros_distro, false)»
+«ENDIF»
+ «ENDFOR»
+«ENDIF»
+'''
+}
\ No newline at end of file
diff --git a/plugins/de.fraunhofer.ipa.rossystem.deployment/src/de/fraunhofer/ipa/rossystem/deployment/RosInstallCompiler.xtend b/plugins/de.fraunhofer.ipa.rossystem.deployment/src/de/fraunhofer/ipa/rossystem/deployment/RosInstallCompiler.xtend
new file mode 100644
index 000000000..a283135a7
--- /dev/null
+++ b/plugins/de.fraunhofer.ipa.rossystem.deployment/src/de/fraunhofer/ipa/rossystem/deployment/RosInstallCompiler.xtend
@@ -0,0 +1,42 @@
+package de.fraunhofer.ipa.rossystem.deployment
+
+import rossystem.ComponentStack
+import rossystem.RosSystem
+import de.fraunhofer.ipa.rossystem.deployment.DeploymentHelpers
+
+class RosInstallCompiler {
+ DeploymentHelpers generator_helper = new DeploymentHelpers()
+ val repo_info = newLinkedHashMap('local_name' -> null, 'branch' -> null, 'uri' -> null)
+
+def get_repo_info(String repo){
+ repo_info.put('branch', null)
+ repo_info.put('local_name', null)
+ repo_info.put('uri', null)
+ if(repo.indexOf(":", repo.indexOf(":") + 1) > 1) {
+ repo_info.put('branch', repo.substring(repo.lastIndexOf(':')+ 1))
+ val uri = repo.substring(0,repo.lastIndexOf(':'))
+ repo_info.put('uri', uri)
+ repo_info.put('local_name', uri.substring(uri.lastIndexOf("/") + 1).replace(".git",""))
+ }
+ else {
+ repo_info.put('branch', null)
+ repo_info.put('uri', repo)
+ repo_info.put('local_name', repo.substring(repo.lastIndexOf("/") + 1).replace(".git",""))
+ }
+}
+
+ def create_repo_link (String repo)
+ '''«get_repo_info(repo)»
+- git: {local-name: «repo_info.get('local_name')», uri: «repo_info.get('uri')»«IF repo_info.get('branch')!==null», version: «repo_info.get('branch')»«ENDIF»}
+ '''
+
+ def compile_toRosInstall (RosSystem system,ComponentStack stack) '''«generator_helper.init_pkg()»
+«IF stack===null»«FOR repo: generator_helper.listOfRepos(system)»
+«create_repo_link(repo)»
+«ENDFOR»
+«ELSE»«FOR repo: generator_helper.listOfRepos(stack)»
+«create_repo_link(repo)»
+«ENDFOR»
+«ENDIF»
+'''
+}
diff --git a/plugins/de.fraunhofer.ipa.rossystem.edit/META-INF/MANIFEST.MF b/plugins/de.fraunhofer.ipa.rossystem.edit/META-INF/MANIFEST.MF
index a9b9cc8b4..db63b7b7b 100644
--- a/plugins/de.fraunhofer.ipa.rossystem.edit/META-INF/MANIFEST.MF
+++ b/plugins/de.fraunhofer.ipa.rossystem.edit/META-INF/MANIFEST.MF
@@ -3,7 +3,7 @@ Bundle-ManifestVersion: 2
Bundle-Name: %pluginName
Bundle-SymbolicName: de.fraunhofer.ipa.rossystem.edit;singleton:=true
Automatic-Module-Name: de.fraunhofer.ipa.rossystem.edit
-Bundle-Version: 1.5.0.qualifier
+Bundle-Version: 2.0.0.qualifier
Bundle-ClassPath: .
Bundle-Activator: rossystem.provider.RossystemEditPlugin$Implementation
Bundle-Vendor: %providerName
diff --git a/plugins/de.fraunhofer.ipa.rossystem.edit/icons/full/ctool16/CreateComponentStack_QualityAttribute_QualityAttribute.gif b/plugins/de.fraunhofer.ipa.rossystem.edit/icons/full/ctool16/CreateComponentStack_QualityAttribute_QualityAttribute.gif
new file mode 100644
index 000000000..fe6b442c4
Binary files /dev/null and b/plugins/de.fraunhofer.ipa.rossystem.edit/icons/full/ctool16/CreateComponentStack_QualityAttribute_QualityAttribute.gif differ
diff --git a/plugins/de.fraunhofer.ipa.rossystem.edit/icons/full/ctool16/CreateComponentStack_RosComponent_ComponentInterface.gif b/plugins/de.fraunhofer.ipa.rossystem.edit/icons/full/ctool16/CreateComponentStack_RosComponent_ComponentInterface.gif
new file mode 100644
index 000000000..100ff270f
Binary files /dev/null and b/plugins/de.fraunhofer.ipa.rossystem.edit/icons/full/ctool16/CreateComponentStack_RosComponent_ComponentInterface.gif differ
diff --git a/plugins/de.fraunhofer.ipa.rossystem.edit/icons/full/ctool16/CreateQualityAttribute_Type_ParameterAnyType.gif b/plugins/de.fraunhofer.ipa.rossystem.edit/icons/full/ctool16/CreateQualityAttribute_Type_ParameterAnyType.gif
new file mode 100644
index 000000000..83969f9eb
Binary files /dev/null and b/plugins/de.fraunhofer.ipa.rossystem.edit/icons/full/ctool16/CreateQualityAttribute_Type_ParameterAnyType.gif differ
diff --git a/plugins/de.fraunhofer.ipa.rossystem.edit/icons/full/ctool16/CreateQualityAttribute_Type_ParameterArrayType.gif b/plugins/de.fraunhofer.ipa.rossystem.edit/icons/full/ctool16/CreateQualityAttribute_Type_ParameterArrayType.gif
new file mode 100644
index 000000000..1b954c54b
Binary files /dev/null and b/plugins/de.fraunhofer.ipa.rossystem.edit/icons/full/ctool16/CreateQualityAttribute_Type_ParameterArrayType.gif differ
diff --git a/plugins/de.fraunhofer.ipa.rossystem.edit/icons/full/ctool16/CreateQualityAttribute_Type_ParameterBase64Type.gif b/plugins/de.fraunhofer.ipa.rossystem.edit/icons/full/ctool16/CreateQualityAttribute_Type_ParameterBase64Type.gif
new file mode 100644
index 000000000..7bef7ae19
Binary files /dev/null and b/plugins/de.fraunhofer.ipa.rossystem.edit/icons/full/ctool16/CreateQualityAttribute_Type_ParameterBase64Type.gif differ
diff --git a/plugins/de.fraunhofer.ipa.rossystem.edit/icons/full/ctool16/CreateQualityAttribute_Type_ParameterBooleanType.gif b/plugins/de.fraunhofer.ipa.rossystem.edit/icons/full/ctool16/CreateQualityAttribute_Type_ParameterBooleanType.gif
new file mode 100644
index 000000000..f5472ecdc
Binary files /dev/null and b/plugins/de.fraunhofer.ipa.rossystem.edit/icons/full/ctool16/CreateQualityAttribute_Type_ParameterBooleanType.gif differ
diff --git a/plugins/de.fraunhofer.ipa.rossystem.edit/icons/full/ctool16/CreateQualityAttribute_Type_ParameterDateType.gif b/plugins/de.fraunhofer.ipa.rossystem.edit/icons/full/ctool16/CreateQualityAttribute_Type_ParameterDateType.gif
new file mode 100644
index 000000000..d1da83e1f
Binary files /dev/null and b/plugins/de.fraunhofer.ipa.rossystem.edit/icons/full/ctool16/CreateQualityAttribute_Type_ParameterDateType.gif differ
diff --git a/plugins/de.fraunhofer.ipa.rossystem.edit/icons/full/ctool16/CreateQualityAttribute_Type_ParameterDoubleType.gif b/plugins/de.fraunhofer.ipa.rossystem.edit/icons/full/ctool16/CreateQualityAttribute_Type_ParameterDoubleType.gif
new file mode 100644
index 000000000..90bc42c70
Binary files /dev/null and b/plugins/de.fraunhofer.ipa.rossystem.edit/icons/full/ctool16/CreateQualityAttribute_Type_ParameterDoubleType.gif differ
diff --git a/plugins/de.fraunhofer.ipa.rossystem.edit/icons/full/ctool16/CreateQualityAttribute_Type_ParameterIntegerType.gif b/plugins/de.fraunhofer.ipa.rossystem.edit/icons/full/ctool16/CreateQualityAttribute_Type_ParameterIntegerType.gif
new file mode 100644
index 000000000..ced536d9d
Binary files /dev/null and b/plugins/de.fraunhofer.ipa.rossystem.edit/icons/full/ctool16/CreateQualityAttribute_Type_ParameterIntegerType.gif differ
diff --git a/plugins/de.fraunhofer.ipa.rossystem.edit/icons/full/ctool16/CreateQualityAttribute_Type_ParameterListType.gif b/plugins/de.fraunhofer.ipa.rossystem.edit/icons/full/ctool16/CreateQualityAttribute_Type_ParameterListType.gif
new file mode 100644
index 000000000..c345ca5a1
Binary files /dev/null and b/plugins/de.fraunhofer.ipa.rossystem.edit/icons/full/ctool16/CreateQualityAttribute_Type_ParameterListType.gif differ
diff --git a/plugins/de.fraunhofer.ipa.rossystem.edit/icons/full/ctool16/CreateQualityAttribute_Type_ParameterStringType.gif b/plugins/de.fraunhofer.ipa.rossystem.edit/icons/full/ctool16/CreateQualityAttribute_Type_ParameterStringType.gif
new file mode 100644
index 000000000..c39f97857
Binary files /dev/null and b/plugins/de.fraunhofer.ipa.rossystem.edit/icons/full/ctool16/CreateQualityAttribute_Type_ParameterStringType.gif differ
diff --git a/plugins/de.fraunhofer.ipa.rossystem.edit/icons/full/ctool16/CreateQualityAttribute_Type_ParameterStructType.gif b/plugins/de.fraunhofer.ipa.rossystem.edit/icons/full/ctool16/CreateQualityAttribute_Type_ParameterStructType.gif
new file mode 100644
index 000000000..25e4762a6
Binary files /dev/null and b/plugins/de.fraunhofer.ipa.rossystem.edit/icons/full/ctool16/CreateQualityAttribute_Type_ParameterStructType.gif differ
diff --git a/plugins/de.fraunhofer.ipa.rossystem.edit/icons/full/ctool16/CreateRosSystem_ComponentStack_ComponentStack.gif b/plugins/de.fraunhofer.ipa.rossystem.edit/icons/full/ctool16/CreateRosSystem_ComponentStack_ComponentStack.gif
new file mode 100644
index 000000000..d35eb7464
Binary files /dev/null and b/plugins/de.fraunhofer.ipa.rossystem.edit/icons/full/ctool16/CreateRosSystem_ComponentStack_ComponentStack.gif differ
diff --git a/plugins/de.fraunhofer.ipa.rossystem.edit/icons/full/ctool16/CreateRosSystem_RosComponent_ComponentInterface.gif b/plugins/de.fraunhofer.ipa.rossystem.edit/icons/full/ctool16/CreateRosSystem_RosComponent_ComponentInterface.gif
new file mode 100644
index 000000000..967985834
Binary files /dev/null and b/plugins/de.fraunhofer.ipa.rossystem.edit/icons/full/ctool16/CreateRosSystem_RosComponent_ComponentInterface.gif differ
diff --git a/plugins/de.fraunhofer.ipa.rossystem.edit/icons/full/obj16/ComponentStack.gif b/plugins/de.fraunhofer.ipa.rossystem.edit/icons/full/obj16/ComponentStack.gif
new file mode 100644
index 000000000..caf280451
Binary files /dev/null and b/plugins/de.fraunhofer.ipa.rossystem.edit/icons/full/obj16/ComponentStack.gif differ
diff --git a/plugins/de.fraunhofer.ipa.rossystem.edit/icons/full/obj16/QualityAttribute.gif b/plugins/de.fraunhofer.ipa.rossystem.edit/icons/full/obj16/QualityAttribute.gif
new file mode 100644
index 000000000..14af8aaee
Binary files /dev/null and b/plugins/de.fraunhofer.ipa.rossystem.edit/icons/full/obj16/QualityAttribute.gif differ
diff --git a/plugins/de.fraunhofer.ipa.rossystem.edit/plugin.properties b/plugins/de.fraunhofer.ipa.rossystem.edit/plugin.properties
index c1d0a187e..5eabec013 100644
--- a/plugins/de.fraunhofer.ipa.rossystem.edit/plugin.properties
+++ b/plugins/de.fraunhofer.ipa.rossystem.edit/plugin.properties
@@ -39,3 +39,12 @@ _UI_ActionConnection_To_feature = To
_UI_ActionConnection_ActionName_feature = Action Name
_UI_RosSystem_ActionConnections_feature = Action Connections
_UI_RosSystem_Parameter_feature = Parameter
+_UI_ComponentStack_type = Component Stack
+_UI_QualityAttribute_type = Quality Attribute
+_UI_RosSystem_ComponentStack_feature = Component Stack
+_UI_ComponentStack_Name_feature = Name
+_UI_ComponentStack_RosComponent_feature = Ros Component
+_UI_ComponentStack_QualityAttribute_feature = Quality Attribute
+_UI_QualityAttribute_Name_feature = Name
+_UI_QualityAttribute_Type_feature = Type
+_UI_QualityAttribute_Value_feature = Value
diff --git a/plugins/de.fraunhofer.ipa.rossystem.edit/pom.xml b/plugins/de.fraunhofer.ipa.rossystem.edit/pom.xml
index abf3ccaa1..74fb19745 100644
--- a/plugins/de.fraunhofer.ipa.rossystem.edit/pom.xml
+++ b/plugins/de.fraunhofer.ipa.rossystem.edit/pom.xml
@@ -4,7 +4,7 @@
de.fraunhofer.ipa.ros
de.fraunhofer.ipa.ros.parent
- 1.5.0-SNAPSHOT
+ 2.0.0-SNAPSHOT
../de.fraunhofer.ipa.ros.parent/pom.xml
de.fraunhofer.ipa.rossystem.edit
diff --git a/plugins/de.fraunhofer.ipa.rossystem.edit/src/rossystem/provider/ComponentStackItemProvider.java b/plugins/de.fraunhofer.ipa.rossystem.edit/src/rossystem/provider/ComponentStackItemProvider.java
new file mode 100644
index 000000000..04a51edc0
--- /dev/null
+++ b/plugins/de.fraunhofer.ipa.rossystem.edit/src/rossystem/provider/ComponentStackItemProvider.java
@@ -0,0 +1,208 @@
+/**
+ */
+package rossystem.provider;
+
+
+import componentInterface.ComponentInterfaceFactory;
+
+import java.util.Collection;
+import java.util.List;
+
+import org.eclipse.emf.common.notify.AdapterFactory;
+import org.eclipse.emf.common.notify.Notification;
+
+import org.eclipse.emf.common.util.ResourceLocator;
+
+import org.eclipse.emf.ecore.EStructuralFeature;
+
+import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
+import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
+import org.eclipse.emf.edit.provider.IItemLabelProvider;
+import org.eclipse.emf.edit.provider.IItemPropertyDescriptor;
+import org.eclipse.emf.edit.provider.IItemPropertySource;
+import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
+import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
+import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
+import org.eclipse.emf.edit.provider.ItemProviderAdapter;
+import org.eclipse.emf.edit.provider.ViewerNotification;
+
+import rossystem.ComponentStack;
+import rossystem.RossystemFactory;
+import rossystem.RossystemPackage;
+
+/**
+ * This is the item provider adapter for a {@link rossystem.ComponentStack} object.
+ *
+ *
+ * @generated
+ */
+public class ComponentStackItemProvider
+ extends ItemProviderAdapter
+ implements
+ IEditingDomainItemProvider,
+ IStructuredItemContentProvider,
+ ITreeItemContentProvider,
+ IItemLabelProvider,
+ IItemPropertySource {
+ /**
+ * This constructs an instance from a factory and a notifier.
+ *
+ *
+ * @generated
+ */
+ public ComponentStackItemProvider(AdapterFactory adapterFactory) {
+ super(adapterFactory);
+ }
+
+ /**
+ * This returns the property descriptors for the adapted class.
+ *
+ *
+ * @generated
+ */
+ @Override
+ public List getPropertyDescriptors(Object object) {
+ if (itemPropertyDescriptors == null) {
+ super.getPropertyDescriptors(object);
+
+ addNamePropertyDescriptor(object);
+ }
+ return itemPropertyDescriptors;
+ }
+
+ /**
+ * This adds a property descriptor for the Name feature.
+ *
+ *
+ * @generated
+ */
+ protected void addNamePropertyDescriptor(Object object) {
+ itemPropertyDescriptors.add
+ (createItemPropertyDescriptor
+ (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
+ getResourceLocator(),
+ getString("_UI_ComponentStack_Name_feature"),
+ getString("_UI_PropertyDescriptor_description", "_UI_ComponentStack_Name_feature", "_UI_ComponentStack_type"),
+ RossystemPackage.Literals.COMPONENT_STACK__NAME,
+ true,
+ false,
+ false,
+ ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
+ null,
+ null));
+ }
+
+ /**
+ * This specifies how to implement {@link #getChildren} and is used to deduce an appropriate feature for an
+ * {@link org.eclipse.emf.edit.command.AddCommand}, {@link org.eclipse.emf.edit.command.RemoveCommand} or
+ * {@link org.eclipse.emf.edit.command.MoveCommand} in {@link #createCommand}.
+ *
+ *
+ * @generated
+ */
+ @Override
+ public Collection extends EStructuralFeature> getChildrenFeatures(Object object) {
+ if (childrenFeatures == null) {
+ super.getChildrenFeatures(object);
+ childrenFeatures.add(RossystemPackage.Literals.COMPONENT_STACK__ROS_COMPONENT);
+ childrenFeatures.add(RossystemPackage.Literals.COMPONENT_STACK__QUALITY_ATTRIBUTE);
+ }
+ return childrenFeatures;
+ }
+
+ /**
+ *
+ *
+ * @generated
+ */
+ @Override
+ protected EStructuralFeature getChildFeature(Object object, Object child) {
+ // Check the type of the specified child object and return the proper feature to use for
+ // adding (see {@link AddCommand}) it as a child.
+
+ return super.getChildFeature(object, child);
+ }
+
+ /**
+ * This returns ComponentStack.gif.
+ *
+ *
+ * @generated
+ */
+ @Override
+ public Object getImage(Object object) {
+ return overlayImage(object, getResourceLocator().getImage("full/obj16/ComponentStack"));
+ }
+
+ /**
+ * This returns the label text for the adapted class.
+ *
+ *
+ * @generated
+ */
+ @Override
+ public String getText(Object object) {
+ String label = ((ComponentStack)object).getName();
+ return label == null || label.length() == 0 ?
+ getString("_UI_ComponentStack_type") :
+ getString("_UI_ComponentStack_type") + " " + label;
+ }
+
+
+ /**
+ * This handles model notifications by calling {@link #updateChildren} to update any cached
+ * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
+ *
+ *
+ * @generated
+ */
+ @Override
+ public void notifyChanged(Notification notification) {
+ updateChildren(notification);
+
+ switch (notification.getFeatureID(ComponentStack.class)) {
+ case RossystemPackage.COMPONENT_STACK__NAME:
+ fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
+ return;
+ case RossystemPackage.COMPONENT_STACK__ROS_COMPONENT:
+ case RossystemPackage.COMPONENT_STACK__QUALITY_ATTRIBUTE:
+ fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), true, false));
+ return;
+ }
+ super.notifyChanged(notification);
+ }
+
+ /**
+ * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
+ * that can be created under this object.
+ *
+ *
+ * @generated
+ */
+ @Override
+ protected void collectNewChildDescriptors(Collection