[567929] Allow Launch tasks to be run on every startup

https://bugs.eclipse.org/bugs/show_bug.cgi?id=567929

Add new attribute runEveryStartup to Launch task.

Change-Id: I9c29b304bb57a745f1adfe82d37bd4d1cc427d20
Signed-off-by: Joe Shannon <joe.shannon@diamond.ac.uk>
diff --git a/features/org.eclipse.oomph.setup.launching-feature/feature.xml b/features/org.eclipse.oomph.setup.launching-feature/feature.xml
index 47b0af3..dda13e3 100644
--- a/features/org.eclipse.oomph.setup.launching-feature/feature.xml
+++ b/features/org.eclipse.oomph.setup.launching-feature/feature.xml
@@ -12,7 +12,7 @@
 <feature
       id="org.eclipse.oomph.setup.launching"
       label="%featureName"
-      version="1.13.0.qualifier"
+      version="1.14.0.qualifier"
       provider-name="%providerName"
       license-feature="org.eclipse.oomph.license"
       license-feature-version="0.0.0">
diff --git a/features/org.eclipse.oomph.setup.launching-feature/pom.xml b/features/org.eclipse.oomph.setup.launching-feature/pom.xml
index df19907..52b0095 100644
--- a/features/org.eclipse.oomph.setup.launching-feature/pom.xml
+++ b/features/org.eclipse.oomph.setup.launching-feature/pom.xml
@@ -20,6 +20,6 @@
   </parent>
   <groupId>org.eclipse.oomph.features</groupId>
   <artifactId>org.eclipse.oomph.setup.launching</artifactId>
-  <version>1.13.0-SNAPSHOT</version>
+  <version>1.14.0-SNAPSHOT</version>
   <packaging>eclipse-feature</packaging>
 </project>
diff --git a/features/org.eclipse.oomph.setup.sdk-feature/feature.xml b/features/org.eclipse.oomph.setup.sdk-feature/feature.xml
index 8a876e2..ce71bb7 100644
--- a/features/org.eclipse.oomph.setup.sdk-feature/feature.xml
+++ b/features/org.eclipse.oomph.setup.sdk-feature/feature.xml
@@ -12,7 +12,7 @@
 <feature
       id="org.eclipse.oomph.setup.sdk"
       label="%featureName"
-      version="1.18.0.qualifier"
+      version="1.19.0.qualifier"
       provider-name="%providerName"
       license-feature="org.eclipse.oomph.license"
       license-feature-version="0.0.0">
diff --git a/features/org.eclipse.oomph.setup.sdk-feature/pom.xml b/features/org.eclipse.oomph.setup.sdk-feature/pom.xml
index 00f73a9..c9830c5 100644
--- a/features/org.eclipse.oomph.setup.sdk-feature/pom.xml
+++ b/features/org.eclipse.oomph.setup.sdk-feature/pom.xml
@@ -20,6 +20,6 @@
   </parent>
   <groupId>org.eclipse.oomph.features</groupId>
   <artifactId>org.eclipse.oomph.setup.sdk</artifactId>
-  <version>1.18.0-SNAPSHOT</version>
+  <version>1.19.0-SNAPSHOT</version>
   <packaging>eclipse-feature</packaging>
 </project>
diff --git a/features/org.eclipse.oomph.tests-feature/feature.xml b/features/org.eclipse.oomph.tests-feature/feature.xml
index 31437f2..d07d0d3 100644
--- a/features/org.eclipse.oomph.tests-feature/feature.xml
+++ b/features/org.eclipse.oomph.tests-feature/feature.xml
@@ -12,7 +12,7 @@
 <feature
       id="org.eclipse.oomph.tests"
       label="%featureName"
-      version="1.15.0.qualifier"
+      version="1.16.0.qualifier"
       provider-name="%providerName"
       license-feature="org.eclipse.oomph.license"
       license-feature-version="0.0.0">
diff --git a/features/org.eclipse.oomph.tests-feature/pom.xml b/features/org.eclipse.oomph.tests-feature/pom.xml
index b843e4c..f0b82d5 100644
--- a/features/org.eclipse.oomph.tests-feature/pom.xml
+++ b/features/org.eclipse.oomph.tests-feature/pom.xml
@@ -22,7 +22,7 @@
 
   <groupId>org.eclipse.oomph.features</groupId>
   <artifactId>org.eclipse.oomph.tests</artifactId>
-  <version>1.15.0-SNAPSHOT</version>
+  <version>1.16.0-SNAPSHOT</version>
   <packaging>eclipse-feature</packaging>
 
 </project>
diff --git a/plugins/org.eclipse.oomph.setup.launching.edit/META-INF/MANIFEST.MF b/plugins/org.eclipse.oomph.setup.launching.edit/META-INF/MANIFEST.MF
index 574fc6b..81db55c 100644
--- a/plugins/org.eclipse.oomph.setup.launching.edit/META-INF/MANIFEST.MF
+++ b/plugins/org.eclipse.oomph.setup.launching.edit/META-INF/MANIFEST.MF
@@ -2,7 +2,7 @@
 Bundle-ManifestVersion: 2
 Bundle-Name: %pluginName
 Bundle-SymbolicName: org.eclipse.oomph.setup.launching.edit;singleton:=true
-Bundle-Version: 1.11.0.qualifier
+Bundle-Version: 1.12.0.qualifier
 Bundle-ClassPath: .
 Bundle-Activator: org.eclipse.oomph.setup.launching.provider.LaunchingEditPlugin$Implementation
 Bundle-Vendor: %providerName
@@ -10,7 +10,7 @@
 Bundle-RequiredExecutionEnvironment: J2SE-1.5
 Export-Package: org.eclipse.oomph.setup.launching.provider;version="1.5.0";x-internal:=true
 Require-Bundle: org.eclipse.core.runtime;bundle-version="[3.5.0,4.0.0)",
- org.eclipse.oomph.setup.launching;bundle-version="[1.12.0,2.0.0)";visibility:=reexport,
+ org.eclipse.oomph.setup.launching;bundle-version="[1.13.0,2.0.0)";visibility:=reexport,
  org.eclipse.emf.edit;bundle-version="[2.10.0,3.0.0)";visibility:=reexport,
  org.eclipse.oomph.base.edit;bundle-version="[1.13.0,2.0.0)";visibility:=reexport,
  org.eclipse.oomph.setup.edit;bundle-version="[1.15.0,2.0.0)";visibility:=reexport
diff --git a/plugins/org.eclipse.oomph.setup.launching.edit/plugin.properties b/plugins/org.eclipse.oomph.setup.launching.edit/plugin.properties
index 47d3e7f..3df2ca0 100644
--- a/plugins/org.eclipse.oomph.setup.launching.edit/plugin.properties
+++ b/plugins/org.eclipse.oomph.setup.launching.edit/plugin.properties
@@ -30,3 +30,5 @@
 _UI_Unknown_feature = Unspecified
 
 
+_UI_LaunchTask_runEveryStartup_feature = Run Every Startup
+_UI_LaunchTask_runEveryStartup_description = Always run this launcher if triggered by STARTUP
diff --git a/plugins/org.eclipse.oomph.setup.launching.edit/pom.xml b/plugins/org.eclipse.oomph.setup.launching.edit/pom.xml
index 76c878b..6506289 100644
--- a/plugins/org.eclipse.oomph.setup.launching.edit/pom.xml
+++ b/plugins/org.eclipse.oomph.setup.launching.edit/pom.xml
@@ -20,7 +20,7 @@
   </parent>
   <groupId>org.eclipse.oomph</groupId>
   <artifactId>org.eclipse.oomph.setup.launching.edit</artifactId>
-  <version>1.11.0-SNAPSHOT</version>
+  <version>1.12.0-SNAPSHOT</version>
   <packaging>eclipse-plugin</packaging>
 
   <build>
diff --git a/plugins/org.eclipse.oomph.setup.launching.edit/src/org/eclipse/oomph/setup/launching/provider/LaunchTaskItemProvider.java b/plugins/org.eclipse.oomph.setup.launching.edit/src/org/eclipse/oomph/setup/launching/provider/LaunchTaskItemProvider.java
index c87dd44..15cc61c 100644
--- a/plugins/org.eclipse.oomph.setup.launching.edit/src/org/eclipse/oomph/setup/launching/provider/LaunchTaskItemProvider.java
+++ b/plugins/org.eclipse.oomph.setup.launching.edit/src/org/eclipse/oomph/setup/launching/provider/LaunchTaskItemProvider.java
@@ -58,6 +58,7 @@
       super.getPropertyDescriptors(object);
 
       addLauncherPropertyDescriptor(object);
+      addRunEveryStartupPropertyDescriptor(object);
     }
     return itemPropertyDescriptors;
   }
@@ -77,6 +78,20 @@
   }
 
   /**
+   * This adds a property descriptor for the Run Every Startup feature.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected void addRunEveryStartupPropertyDescriptor(Object object)
+  {
+    itemPropertyDescriptors.add(createItemPropertyDescriptor(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(), getResourceLocator(),
+        getString("_UI_LaunchTask_runEveryStartup_feature"), //$NON-NLS-1$
+        getString("_UI_LaunchTask_runEveryStartup_description"), //$NON-NLS-1$
+        LaunchingPackage.Literals.LAUNCH_TASK__RUN_EVERY_STARTUP, true, false, false, ItemPropertyDescriptor.BOOLEAN_VALUE_IMAGE, null, null));
+  }
+
+  /**
    * This returns LaunchTask.gif.
    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
@@ -128,6 +143,7 @@
     switch (notification.getFeatureID(LaunchTask.class))
     {
       case LaunchingPackage.LAUNCH_TASK__LAUNCHER:
+      case LaunchingPackage.LAUNCH_TASK__RUN_EVERY_STARTUP:
         fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
         return;
     }
diff --git a/plugins/org.eclipse.oomph.setup.launching/META-INF/MANIFEST.MF b/plugins/org.eclipse.oomph.setup.launching/META-INF/MANIFEST.MF
index 87a0d30..22ca471 100644
--- a/plugins/org.eclipse.oomph.setup.launching/META-INF/MANIFEST.MF
+++ b/plugins/org.eclipse.oomph.setup.launching/META-INF/MANIFEST.MF
@@ -2,14 +2,14 @@
 Bundle-ManifestVersion: 2
 Bundle-Name: %pluginName
 Bundle-SymbolicName: org.eclipse.oomph.setup.launching;singleton:=true
-Bundle-Version: 1.12.0.qualifier
+Bundle-Version: 1.13.0.qualifier
 Bundle-ClassPath: .
 Bundle-Vendor: %providerName
 Bundle-Localization: plugin
 Bundle-RequiredExecutionEnvironment: J2SE-1.5
-Export-Package: org.eclipse.oomph.setup.launching;version="1.12.0";x-internal:=true,
- org.eclipse.oomph.setup.launching.impl;version="1.12.0";x-internal:=true,
- org.eclipse.oomph.setup.launching.util;version="1.12.0";x-internal:=true
+Export-Package: org.eclipse.oomph.setup.launching;version="1.13.0";x-internal:=true,
+ org.eclipse.oomph.setup.launching.impl;version="1.13.0";x-internal:=true,
+ org.eclipse.oomph.setup.launching.util;version="1.13.0";x-internal:=true
 Require-Bundle: org.eclipse.core.runtime;bundle-version="[3.5.0,4.0.0)",
  org.eclipse.debug.core;bundle-version="[3.0.0,4.0.0)",
  org.eclipse.emf.ecore;bundle-version="[2.10.0,3.0.0)";visibility:=reexport,
diff --git a/plugins/org.eclipse.oomph.setup.launching/model/Launching.ecore b/plugins/org.eclipse.oomph.setup.launching/model/Launching.ecore
index a456a74..60e1252 100644
--- a/plugins/org.eclipse.oomph.setup.launching/model/Launching.ecore
+++ b/plugins/org.eclipse.oomph.setup.launching/model/Launching.ecore
@@ -19,5 +19,7 @@
     </eAnnotations>
     <eStructuralFeatures xsi:type="ecore:EAttribute" name="launcher" lowerBound="1"
         eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
+    <eStructuralFeatures xsi:type="ecore:EAttribute" name="runEveryStartup" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean"
+        defaultValueLiteral="false"/>
   </eClassifiers>
 </ecore:EPackage>
diff --git a/plugins/org.eclipse.oomph.setup.launching/model/Launching.genmodel b/plugins/org.eclipse.oomph.setup.launching/model/Launching.genmodel
index dc4d123..5a0e16e 100644
--- a/plugins/org.eclipse.oomph.setup.launching/model/Launching.genmodel
+++ b/plugins/org.eclipse.oomph.setup.launching/model/Launching.genmodel
@@ -12,6 +12,8 @@
     <genClasses ecoreClass="Launching.ecore#//LaunchTask" labelFeature="#//launching/LaunchTask/launcher">
       <genFeatures createChild="false" propertyDescription="The name of a launch configuration or the workspace absolute path of a launch configuration file"
           ecoreFeature="ecore:EAttribute Launching.ecore#//LaunchTask/launcher"/>
+      <genFeatures createChild="false" propertyDescription="Always run this launcher if triggered by STARTUP"
+          ecoreFeature="ecore:EAttribute Launching.ecore#//LaunchTask/runEveryStartup"/>
     </genClasses>
   </genPackages>
 </genmodel:GenModel>
diff --git a/plugins/org.eclipse.oomph.setup.launching/pom.xml b/plugins/org.eclipse.oomph.setup.launching/pom.xml
index efa6cd0..dc0a8c4 100644
--- a/plugins/org.eclipse.oomph.setup.launching/pom.xml
+++ b/plugins/org.eclipse.oomph.setup.launching/pom.xml
@@ -20,7 +20,7 @@
   </parent>
   <groupId>org.eclipse.oomph</groupId>
   <artifactId>org.eclipse.oomph.setup.launching</artifactId>
-  <version>1.12.0-SNAPSHOT</version>
+  <version>1.13.0-SNAPSHOT</version>
   <packaging>eclipse-plugin</packaging>
 
   <build>
diff --git a/plugins/org.eclipse.oomph.setup.launching/src/org/eclipse/oomph/setup/launching/LaunchTask.java b/plugins/org.eclipse.oomph.setup.launching/src/org/eclipse/oomph/setup/launching/LaunchTask.java
index d7eeacc..99c3b4e 100644
--- a/plugins/org.eclipse.oomph.setup.launching/src/org/eclipse/oomph/setup/launching/LaunchTask.java
+++ b/plugins/org.eclipse.oomph.setup.launching/src/org/eclipse/oomph/setup/launching/LaunchTask.java
@@ -22,6 +22,7 @@
  * </p>
  * <ul>
  *   <li>{@link org.eclipse.oomph.setup.launching.LaunchTask#getLauncher <em>Launcher</em>}</li>
+ *   <li>{@link org.eclipse.oomph.setup.launching.LaunchTask#isRunEveryStartup <em>Run Every Startup</em>}</li>
  * </ul>
  *
  * @see org.eclipse.oomph.setup.launching.LaunchingPackage#getLaunchTask()
@@ -56,4 +57,27 @@
    */
   void setLauncher(String value);
 
+  /**
+   * Returns the value of the '<em><b>Run Every Startup</b></em>' attribute.
+   * The default value is <code>"false"</code>.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the value of the '<em>Run Every Startup</em>' attribute.
+   * @see #setRunEveryStartup(boolean)
+   * @see org.eclipse.oomph.setup.launching.LaunchingPackage#getLaunchTask_RunEveryStartup()
+   * @model default="false"
+   * @generated
+   */
+  boolean isRunEveryStartup();
+
+  /**
+   * Sets the value of the '{@link org.eclipse.oomph.setup.launching.LaunchTask#isRunEveryStartup <em>Run Every Startup</em>}' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @param value the new value of the '<em>Run Every Startup</em>' attribute.
+   * @see #isRunEveryStartup()
+   * @generated
+   */
+  void setRunEveryStartup(boolean value);
+
 } // LaunchTask
diff --git a/plugins/org.eclipse.oomph.setup.launching/src/org/eclipse/oomph/setup/launching/LaunchingPackage.java b/plugins/org.eclipse.oomph.setup.launching/src/org/eclipse/oomph/setup/launching/LaunchingPackage.java
index d03c8d2..cea7b26 100644
--- a/plugins/org.eclipse.oomph.setup.launching/src/org/eclipse/oomph/setup/launching/LaunchingPackage.java
+++ b/plugins/org.eclipse.oomph.setup.launching/src/org/eclipse/oomph/setup/launching/LaunchingPackage.java
@@ -178,13 +178,22 @@
   int LAUNCH_TASK__LAUNCHER = SetupPackage.SETUP_TASK_FEATURE_COUNT + 0;
 
   /**
+   * The feature id for the '<em><b>Run Every Startup</b></em>' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int LAUNCH_TASK__RUN_EVERY_STARTUP = SetupPackage.SETUP_TASK_FEATURE_COUNT + 1;
+
+  /**
    * The number of structural features of the '<em>Launch Task</em>' class.
    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
    * @generated
    * @ordered
    */
-  int LAUNCH_TASK_FEATURE_COUNT = SetupPackage.SETUP_TASK_FEATURE_COUNT + 1;
+  int LAUNCH_TASK_FEATURE_COUNT = SetupPackage.SETUP_TASK_FEATURE_COUNT + 2;
 
   /**
    * Returns the meta object for class '{@link org.eclipse.oomph.setup.launching.LaunchTask <em>Launch Task</em>}'.
@@ -208,6 +217,17 @@
   EAttribute getLaunchTask_Launcher();
 
   /**
+   * Returns the meta object for the attribute '{@link org.eclipse.oomph.setup.launching.LaunchTask#isRunEveryStartup <em>Run Every Startup</em>}'.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the meta object for the attribute '<em>Run Every Startup</em>'.
+   * @see org.eclipse.oomph.setup.launching.LaunchTask#isRunEveryStartup()
+   * @see #getLaunchTask()
+   * @generated
+   */
+  EAttribute getLaunchTask_RunEveryStartup();
+
+  /**
    * Returns the factory that creates the instances of the model.
    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
@@ -248,6 +268,14 @@
      */
     EAttribute LAUNCH_TASK__LAUNCHER = eINSTANCE.getLaunchTask_Launcher();
 
+    /**
+     * The meta object literal for the '<em><b>Run Every Startup</b></em>' attribute feature.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    EAttribute LAUNCH_TASK__RUN_EVERY_STARTUP = eINSTANCE.getLaunchTask_RunEveryStartup();
+
   }
 
 } // LaunchingPackage
diff --git a/plugins/org.eclipse.oomph.setup.launching/src/org/eclipse/oomph/setup/launching/impl/LaunchTaskImpl.java b/plugins/org.eclipse.oomph.setup.launching/src/org/eclipse/oomph/setup/launching/impl/LaunchTaskImpl.java
index 8991e24..5b84afd 100644
--- a/plugins/org.eclipse.oomph.setup.launching/src/org/eclipse/oomph/setup/launching/impl/LaunchTaskImpl.java
+++ b/plugins/org.eclipse.oomph.setup.launching/src/org/eclipse/oomph/setup/launching/impl/LaunchTaskImpl.java
@@ -50,6 +50,7 @@
  * </p>
  * <ul>
  *   <li>{@link org.eclipse.oomph.setup.launching.impl.LaunchTaskImpl#getLauncher <em>Launcher</em>}</li>
+ *   <li>{@link org.eclipse.oomph.setup.launching.impl.LaunchTaskImpl#isRunEveryStartup <em>Run Every Startup</em>}</li>
  * </ul>
  *
  * @generated
@@ -79,6 +80,26 @@
   protected String launcher = LAUNCHER_EDEFAULT;
 
   /**
+   * The default value of the '{@link #isRunEveryStartup() <em>Run Every Startup</em>}' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @see #isRunEveryStartup()
+   * @generated
+   * @ordered
+   */
+  protected static final boolean RUN_EVERY_STARTUP_EDEFAULT = false;
+
+  /**
+   * The cached value of the '{@link #isRunEveryStartup() <em>Run Every Startup</em>}' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @see #isRunEveryStartup()
+   * @generated
+   * @ordered
+   */
+  protected boolean runEveryStartup = RUN_EVERY_STARTUP_EDEFAULT;
+
+  /**
    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
    * @generated
@@ -129,6 +150,31 @@
    * <!-- end-user-doc -->
    * @generated
    */
+  public boolean isRunEveryStartup()
+  {
+    return runEveryStartup;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public void setRunEveryStartup(boolean newRunEveryStartup)
+  {
+    boolean oldRunEveryStartup = runEveryStartup;
+    runEveryStartup = newRunEveryStartup;
+    if (eNotificationRequired())
+    {
+      eNotify(new ENotificationImpl(this, Notification.SET, LaunchingPackage.LAUNCH_TASK__RUN_EVERY_STARTUP, oldRunEveryStartup, runEveryStartup));
+    }
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
   @Override
   public Object eGet(int featureID, boolean resolve, boolean coreType)
   {
@@ -136,6 +182,8 @@
     {
       case LaunchingPackage.LAUNCH_TASK__LAUNCHER:
         return getLauncher();
+      case LaunchingPackage.LAUNCH_TASK__RUN_EVERY_STARTUP:
+        return isRunEveryStartup();
     }
     return super.eGet(featureID, resolve, coreType);
   }
@@ -153,6 +201,9 @@
       case LaunchingPackage.LAUNCH_TASK__LAUNCHER:
         setLauncher((String)newValue);
         return;
+      case LaunchingPackage.LAUNCH_TASK__RUN_EVERY_STARTUP:
+        setRunEveryStartup((Boolean)newValue);
+        return;
     }
     super.eSet(featureID, newValue);
   }
@@ -170,6 +221,9 @@
       case LaunchingPackage.LAUNCH_TASK__LAUNCHER:
         setLauncher(LAUNCHER_EDEFAULT);
         return;
+      case LaunchingPackage.LAUNCH_TASK__RUN_EVERY_STARTUP:
+        setRunEveryStartup(RUN_EVERY_STARTUP_EDEFAULT);
+        return;
     }
     super.eUnset(featureID);
   }
@@ -186,6 +240,8 @@
     {
       case LaunchingPackage.LAUNCH_TASK__LAUNCHER:
         return LAUNCHER_EDEFAULT == null ? launcher != null : !LAUNCHER_EDEFAULT.equals(launcher);
+      case LaunchingPackage.LAUNCH_TASK__RUN_EVERY_STARTUP:
+        return runEveryStartup != RUN_EVERY_STARTUP_EDEFAULT;
     }
     return super.eIsSet(featureID);
   }
@@ -206,6 +262,8 @@
     StringBuilder result = new StringBuilder(super.toString());
     result.append(" (launcher: "); //$NON-NLS-1$
     result.append(launcher);
+    result.append(", runEveryStartup: "); //$NON-NLS-1$
+    result.append(runEveryStartup);
     result.append(')');
     return result.toString();
   }
@@ -220,7 +278,7 @@
   {
     String launcher = getLauncher();
     Trigger trigger = context.getTrigger();
-    if (trigger == Trigger.STARTUP)
+    if (trigger == Trigger.STARTUP && !isRunEveryStartup())
     {
       // If we've performed this task at least once, don't do it automatically again.
       String property = HISTORY.getProperty(launcher, null);
diff --git a/plugins/org.eclipse.oomph.setup.launching/src/org/eclipse/oomph/setup/launching/impl/LaunchingPackageImpl.java b/plugins/org.eclipse.oomph.setup.launching/src/org/eclipse/oomph/setup/launching/impl/LaunchingPackageImpl.java
index df8d9da..0d2b96b 100644
--- a/plugins/org.eclipse.oomph.setup.launching/src/org/eclipse/oomph/setup/launching/impl/LaunchingPackageImpl.java
+++ b/plugins/org.eclipse.oomph.setup.launching/src/org/eclipse/oomph/setup/launching/impl/LaunchingPackageImpl.java
@@ -132,6 +132,16 @@
    * <!-- end-user-doc -->
    * @generated
    */
+  public EAttribute getLaunchTask_RunEveryStartup()
+  {
+    return (EAttribute)launchTaskEClass.getEStructuralFeatures().get(1);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
   public LaunchingFactory getLaunchingFactory()
   {
     return (LaunchingFactory)getEFactoryInstance();
@@ -162,6 +172,7 @@
     // Create classes and their features
     launchTaskEClass = createEClass(LAUNCH_TASK);
     createEAttribute(launchTaskEClass, LAUNCH_TASK__LAUNCHER);
+    createEAttribute(launchTaskEClass, LAUNCH_TASK__RUN_EVERY_STARTUP);
   }
 
   /**
@@ -206,6 +217,8 @@
     initEClass(launchTaskEClass, LaunchTask.class, "LaunchTask", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
     initEAttribute(getLaunchTask_Launcher(), ecorePackage.getEString(), "launcher", null, 1, 1, LaunchTask.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, //$NON-NLS-1$
         !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+    initEAttribute(getLaunchTask_RunEveryStartup(), ecorePackage.getEBoolean(), "runEveryStartup", "false", 0, 1, LaunchTask.class, !IS_TRANSIENT, !IS_VOLATILE, //$NON-NLS-1$ //$NON-NLS-2$
+        IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
 
     // Create resource
     createResource("http://git.eclipse.org/c/oomph/org.eclipse.oomph.git/plain/setups/models/Launching.ecore");
diff --git a/setups/models/Launching.ecore b/setups/models/Launching.ecore
index 4313d77..9889036 100644
--- a/setups/models/Launching.ecore
+++ b/setups/models/Launching.ecore
@@ -19,5 +19,7 @@
     </eAnnotations>
     <eStructuralFeatures xsi:type="ecore:EAttribute" name="launcher" lowerBound="1"
         eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
+    <eStructuralFeatures xsi:type="ecore:EAttribute" name="runEveryStartup" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean"
+        defaultValueLiteral="false"/>
   </eClassifiers>
 </ecore:EPackage>