Work on *.globalanalysis.execution.ui plug-in (not run).
Change-Id: I5e1a0dca9600fc8655e44e2b1a944cafc02a4ec3
diff --git a/analysis/globalanalysis/execution/org.polarsys.esf.globalanalysis.execution.ui/META-INF/MANIFEST.MF b/analysis/globalanalysis/execution/org.polarsys.esf.globalanalysis.execution.ui/META-INF/MANIFEST.MF
index ac2a2de..0ebecdd 100644
--- a/analysis/globalanalysis/execution/org.polarsys.esf.globalanalysis.execution.ui/META-INF/MANIFEST.MF
+++ b/analysis/globalanalysis/execution/org.polarsys.esf.globalanalysis.execution.ui/META-INF/MANIFEST.MF
@@ -16,6 +16,9 @@
org.eclipse.uml2.uml,
org.polarsys.esf.analysis.common.ui;bundle-version="0.7.0";visibility:=reexport,
org.polarsys.esf.localanalysis.profile;bundle-version="0.7.0";visibility:=reexport,
- org.polarsys.esf.globalanalysis.execution;bundle-version="0.7.0";visibility:=reexport
+ org.polarsys.esf.globalanalysis.execution;bundle-version="0.7.0";visibility:=reexport,
+ org.polarsys.esf.core.common;bundle-version="0.7.0";visibility:=reexport,
+ org.polarsys.esf.core.common.ui;bundle-version="0.7.0";visibility:=reexport,
+ org.polarsys.esf.localanalysis.profile.tools
Bundle-RequiredExecutionEnvironment: JavaSE-1.7
Bundle-ActivationPolicy: lazy
diff --git a/analysis/globalanalysis/execution/org.polarsys.esf.globalanalysis.execution.ui/src/main/java/org/polarsys/esf/globalanalysis/execution/ui/GlobalAnalysisExecutionUIActivator.java b/analysis/globalanalysis/execution/org.polarsys.esf.globalanalysis.execution.ui/src/main/java/org/polarsys/esf/globalanalysis/execution/ui/GlobalAnalysisExecutionUIActivator.java
index 5ac60ce..a4037ec 100644
--- a/analysis/globalanalysis/execution/org.polarsys.esf.globalanalysis.execution.ui/src/main/java/org/polarsys/esf/globalanalysis/execution/ui/GlobalAnalysisExecutionUIActivator.java
+++ b/analysis/globalanalysis/execution/org.polarsys.esf.globalanalysis.execution.ui/src/main/java/org/polarsys/esf/globalanalysis/execution/ui/GlobalAnalysisExecutionUIActivator.java
@@ -10,12 +10,20 @@
******************************************************************************/
package org.polarsys.esf.globalanalysis.execution.ui;
+import java.util.ResourceBundle;
+
+import org.eclipse.core.runtime.Assert;
+import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.PlatformObject;
import org.eclipse.core.runtime.Status;
import org.eclipse.emf.common.EMFPlugin;
import org.eclipse.emf.common.ui.EclipseUIPlugin;
import org.eclipse.emf.common.util.ResourceLocator;
+import org.eclipse.jface.resource.ImageRegistry;
import org.osgi.framework.BundleContext;
+import org.polarsys.esf.core.common.messages.Messages;
/**
* The activator class controls the plug-in life cycle.
@@ -31,6 +39,9 @@
/** Keep track of the implementation singleton. */
private static Implementation sPlugin = null;
+ /** Messages class used to find localised string. */
+ private static Messages sMessages = new Messages(ResourceBundle.getBundle(Messages.BUNDLE_NAME));
+
/**
* Create the instance.
*/
@@ -91,6 +102,88 @@
}
/**
+ * @return The messages class used to return localised string
+ */
+ public static Messages getMessages() {
+ return sMessages;
+ }
+
+ /**
+ * If it is possible to adapt the given object to the given type, this
+ * returns the right adapter.
+ *
+ * Performs the following checks:
+ * <ol>
+ * <li>Returns <code>sourceObject</code> if it is an instance of the adapter type.</li>
+ * <li>If sourceObject implements IAdaptable, it is queried for adapters.</li>
+ * <li>If sourceObject is not an instance of PlatformObject, the adapter manager is queried for adapters</li>
+ * </ol>
+ *
+ * Otherwise returns <code>null</code>.
+ *
+ * @param pSourceObject Object to adapt, or null
+ * @param pAdapterClass Type to adapt to
+ * @param pActivatePlugins <code>true</code> if IAdapterManager.loadAdapter should be used
+ * (may trigger plugin activation)
+ *
+ * @return A representation of the source object that is assignable to the
+ * adapter type, or null if no such representation exists
+ *
+ * @see org.eclipse.ui.internal.views.ViewsPlugin.getAdapter
+ */
+ @SuppressWarnings("restriction")
+ public static Object getAdapter(
+ final Object pSourceObject,
+ final Class<?> pAdapterClass,
+ final boolean pActivatePlugins) {
+
+ Object vAdapterObject = null;
+
+ Assert.isNotNull(pAdapterClass);
+ if (pSourceObject != null) {
+
+ // If the source object is already an instance of the target type,
+ // return it directly
+ if (pAdapterClass.isInstance(pSourceObject)) {
+ vAdapterObject = pSourceObject;
+
+ } else {
+ // Check if the source object is adaptable
+ // In this case, use its mechanism directly
+ if (pSourceObject instanceof IAdaptable) {
+ // Get the adapter using the source object method
+ vAdapterObject = ((IAdaptable) pSourceObject).getAdapter(pAdapterClass);
+
+ // Sanity-check
+ if (vAdapterObject != null) {
+ Assert.isTrue(pAdapterClass.isInstance(vAdapterObject));
+ }
+ }
+
+ // Then, if the adapter object is still not found, check
+ // if the source object is an instance of PlatformObject to use
+ // its specific adaptation mechanism
+ if (vAdapterObject == null && !(pSourceObject instanceof PlatformObject)) {
+ // Try to find the adapter, with or without a load, according
+ // to the flag value
+ if (pActivatePlugins) {
+ vAdapterObject = Platform.getAdapterManager().loadAdapter(
+ pSourceObject,
+ pAdapterClass.getName());
+
+ } else {
+ vAdapterObject = Platform.getAdapterManager().getAdapter(
+ pSourceObject,
+ pAdapterClass);
+ }
+ }
+ }
+ }
+
+ return vAdapterObject;
+ }
+
+ /**
* Returns the singleton instance of the Eclipse plugin.
*
* @return The singleton instance.
@@ -105,6 +198,12 @@
public static class Implementation
extends EclipseUIPlugin {
+ /** Key for run propagation icon. */
+ public static final String ICON_PROPAGATION_KEY = "icon.propagation"; //$NON-NLS-1$
+
+ /** Key for wizard propagation image. */
+ public static final String ICON_WIZARD_PROPAGATION_KEY = "icon.wizard.propagation"; //$NON-NLS-1$
+
/**
* Creates an instance.
*/
@@ -123,7 +222,24 @@
public void start(final BundleContext pContext) throws Exception {
super.start(pContext);
}
- }
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ protected void initializeImageRegistry(final ImageRegistry pReg) {
+ super.initializeImageRegistry(pReg);
+
+ // Icon paths are not externalised as they are no reason to modify it or to access to it externally
+ String vSymbolicName = getPlugin().getSymbolicName();
+
+ pReg.put(ICON_PROPAGATION_KEY,
+ imageDescriptorFromPlugin(vSymbolicName, "src/main/resources/icons/icon_propagation.png")); //$NON-NLS-1$
+
+ pReg.put(ICON_WIZARD_PROPAGATION_KEY,
+ imageDescriptorFromPlugin(vSymbolicName, "src/main/resources/icons/wizard_propagation.png")); //$NON-NLS-1$
+ }
+
+ }
}
diff --git a/analysis/globalanalysis/execution/org.polarsys.esf.globalanalysis.execution.ui/src/main/java/org/polarsys/esf/globalanalysis/execution/ui/wizard/FearedEventsSelectionPage.java b/analysis/globalanalysis/execution/org.polarsys.esf.globalanalysis.execution.ui/src/main/java/org/polarsys/esf/globalanalysis/execution/ui/wizard/FearedEventsSelectionPage.java
new file mode 100644
index 0000000..a39fc58
--- /dev/null
+++ b/analysis/globalanalysis/execution/org.polarsys.esf.globalanalysis.execution.ui/src/main/java/org/polarsys/esf/globalanalysis/execution/ui/wizard/FearedEventsSelectionPage.java
@@ -0,0 +1,223 @@
+/*******************************************************************************
+ * Copyright (c) 2016 ALL4TEC & CEA LIST.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * ALL4TEC & CEA LIST - initial API and implementation
+ ******************************************************************************/
+package org.polarsys.esf.globalanalysis.execution.ui.wizard;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
+
+import org.eclipse.jface.viewers.ILabelProvider;
+import org.eclipse.jface.wizard.WizardPage;
+import org.eclipse.swt.widgets.Composite;
+import org.polarsys.esf.core.common.messages.Messages;
+import org.polarsys.esf.core.common.observer.IObserver;
+import org.polarsys.esf.core.common.ui.widget.MultipleChoicesComposite;
+import org.polarsys.esf.esflocalanalysis.IAbstractSLocalAnalysisElement;
+import org.polarsys.esf.globalanalysis.execution.ui.GlobalAnalysisExecutionUIActivator;
+import org.polarsys.esf.localanalysis.profile.tools.util.IFearedEventItemUtils;
+
+/**
+ * Second page of propagation handler, where user select effective hazardous events and their propagations orders.
+ *
+ * @author $Author: jdumont $
+ * @version $Revision: 83 $
+ */
+public final class FearedEventsSelectionPage
+ extends WizardPage
+ implements IObserver {
+
+ /** Name of this page. */
+ public static final String PAGE_NAME = "wizard.propagation.second"; //$NON-NLS-1$
+
+ /** Messages class. */
+ private static final Messages MESSAGES_PROVIDER = GlobalAnalysisExecutionUIActivator.getMessages();
+
+ /** Text for title of available hazardous events list. */
+ private static final String AVAILABLE_TITLE = MESSAGES_PROVIDER
+ .getString("PropagationWizardFearedEventsSelectionPage.description.label.list.available"); //$NON-NLS-1$
+
+ /** Text for title of selected hazardous events list. */
+ private static final String SELECTED_TITLE = MESSAGES_PROVIDER
+ .getString("PropagationWizardFearedEventsSelectionPage.description.label.list.selected"); //$NON-NLS-1$
+
+ /** Title of this page. */
+ private static final String MAIN_TITLE =
+ MESSAGES_PROVIDER.getString("PropagationWizardFearedEventsSelectionPage.description.title"); //$NON-NLS-1$
+
+ /** Description. */
+ private static final String DESCRIPTION =
+ MESSAGES_PROVIDER.getString("PropagationWizardFearedEventsSelectionPage.description.description"); //$NON-NLS-1$
+
+ /** Visual part of this wizard page. */
+ private MultipleChoicesComposite mMultiDialog = null;
+
+ /** Selected feared events list. */
+ private List<IAbstractSLocalAnalysisElement> mSelectedList = new ArrayList<IAbstractSLocalAnalysisElement>();
+
+ /** Available failure mode list. */
+ private List<IAbstractSLocalAnalysisElement> mAvailableList = new ArrayList<IAbstractSLocalAnalysisElement>();
+
+ /** Utility object used to manipulate Model. */
+ private IModelUtils mModelUtils = null;
+
+ /** Utility object used to manipulate feared event items. */
+ private IFearedEventItemUtils mFearedEventUtils = null;
+
+ /**
+ * Default constructor.
+ *
+ */
+ public FearedEventsSelectionPage() {
+ super(PAGE_NAME, MAIN_TITLE, null);
+ setDescription(DESCRIPTION);
+
+ mModelUtils = ModelUtilsFactory.init().getModelUtils();
+ mFearedEventUtils = FearedEventUtilsFactory.init().getFearedEventItemUtils();
+
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void createControl(final Composite pParent) {
+
+ // Create a label provider
+ ILabelProvider vLabelProvider = new FearedEventsItemLabelProvider();
+
+ // Instantiate composite, and register this page as observer.
+ mMultiDialog =
+ new MultipleChoicesComposite(pParent, vLabelProvider, true, AVAILABLE_TITLE, SELECTED_TITLE, this);
+ mMultiDialog.setInputList(mAvailableList, mSelectedList);
+
+ setPageComplete(checkCompletionPage());
+ setControl(mMultiDialog);
+
+ }
+
+ /**
+ * Create a new list, which is ordered by alphabetical order.
+ *
+ * @param pSelectedList list of failure mode to order.
+ * @return a new list, ordered by rank.
+ */
+ private List<IAbstractSLocalAnalysisElement> orderSelectedList(final List<IAbstractSLocalAnalysisElement> pSelectedList) {
+
+ // Instantiate a new list
+ List<IAbstractSLocalAnalysisElement> vOrderedList = new ArrayList<IAbstractSLocalAnalysisElement>(pSelectedList);
+
+ // Sort it by rank
+ Collections.sort(vOrderedList, new Comparator<IAbstractSLocalAnalysisElement>() {
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public int compare(
+ final IAbstractSLocalAnalysisElement pFirstElement,
+ final IAbstractSLocalAnalysisElement pSecondElement) {
+
+ return pFirstElement.getName().compareTo(pSecondElement.getName());
+ }
+ });
+
+ return vOrderedList;
+ }
+
+ /**
+ * Initialise list.
+ */
+ public void initSelectionLists() {
+ mSelectedList.clear();
+ mAvailableList.clear();
+
+ // Get selected model
+ PropagationWizard vPropagationWizard = (PropagationWizard) getWizard();
+ IModel vModel = vPropagationWizard.getModel();
+
+ // Split between those already selected and the others
+ for (IAbstractSLocalAnalysisElement vItem : mModelUtils.getAllFearedEventsItemAssociatedInModel(vModel)) {
+ if (mFearedEventUtils.isSelected(vItem)) {
+ mSelectedList.add(vItem);
+ } else {
+ mAvailableList.add(vItem);
+ }
+ }
+
+ // Now order each list by alphabetical order
+ mSelectedList = orderSelectedList(mSelectedList);
+ mAvailableList = orderSelectedList(mAvailableList);
+
+ // When wizard is on other page and input values is updated
+ if (mMultiDialog != null) {
+ mMultiDialog.setInputList(mAvailableList, mSelectedList);
+ }
+
+ setPageComplete(checkCompletionPage());
+ }
+
+ /**
+ * Do not allow user to finish if not events selected.
+ *
+ * @return <code>true</code> if least one failure mode is selected, otherwise <code>false</code>
+ */
+ private boolean checkCompletionPage() {
+ return !mSelectedList.isEmpty();
+ }
+
+ /**
+ * @return ordered list of feared events item selected to propagation.
+ */
+ public List<IAbstractSLocalAnalysisElement> getSelectedList() {
+ List<IAbstractSLocalAnalysisElement> vSelectedList = new ArrayList<IAbstractSLocalAnalysisElement>();
+
+ if (mMultiDialog != null) {
+ for (Object vCurrentObject : mMultiDialog.getResults()) {
+ // Add each item.
+ vSelectedList.add((IAbstractSLocalAnalysisElement) vCurrentObject);
+ }
+ }
+
+ return vSelectedList;
+ }
+
+ /**
+ * @return ordered list of failure mode not selected.
+ */
+ public List<IAbstractSLocalAnalysisElement> getNotSelectedList() {
+ List<IAbstractSLocalAnalysisElement> vNotSelectedList = new ArrayList<IAbstractSLocalAnalysisElement>();
+
+ if (mMultiDialog != null) {
+ for (Object vCurrentObject : mMultiDialog.getAvailableValues()) {
+ // Add each item.
+ vNotSelectedList.add((IAbstractSLocalAnalysisElement) vCurrentObject);
+ }
+ }
+
+ return vNotSelectedList;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void update(final Object pSubject) {
+ if (pSubject instanceof MultipleChoicesComposite) {
+ MultipleChoicesComposite vMultiChoicesDialog = (MultipleChoicesComposite) pSubject;
+ mSelectedList.clear();
+ mSelectedList.addAll((Collection<? extends IAbstractSLocalAnalysisElement>) vMultiChoicesDialog.getResults());
+
+ setPageComplete(checkCompletionPage());
+ }
+ }
+}
diff --git a/analysis/globalanalysis/execution/org.polarsys.esf.globalanalysis.execution.ui/src/main/java/org/polarsys/esf/globalanalysis/execution/ui/wizard/IPropagationWizardFactory.java b/analysis/globalanalysis/execution/org.polarsys.esf.globalanalysis.execution.ui/src/main/java/org/polarsys/esf/globalanalysis/execution/ui/wizard/IPropagationWizardFactory.java
new file mode 100644
index 0000000..1e94583
--- /dev/null
+++ b/analysis/globalanalysis/execution/org.polarsys.esf.globalanalysis.execution.ui/src/main/java/org/polarsys/esf/globalanalysis/execution/ui/wizard/IPropagationWizardFactory.java
@@ -0,0 +1,32 @@
+/*******************************************************************************
+ * Copyright (c) 2016 ALL4TEC & CEA LIST.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * ALL4TEC & CEA LIST - initial API and implementation
+ ******************************************************************************/
+package org.polarsys.esf.globalanalysis.execution.ui.wizard;
+
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.wizard.IWizard;
+
+/**
+ *
+ * Classes able to create wizard for propagation must implemented this interface.
+ *
+ * @author $Author: jdumont $
+ * @version $Revision: 83 $
+ */
+public interface IPropagationWizardFactory {
+
+ /**
+ * Method called to create wizard for propagation.
+ *
+ * @param pSelection selection concerned by wizard
+ * @return Wizard for propagation
+ */
+ IWizard createPropagationWizard(final ISelection pSelection);
+}
diff --git a/analysis/globalanalysis/execution/org.polarsys.esf.globalanalysis.execution.ui/src/main/java/org/polarsys/esf/globalanalysis/execution/ui/wizard/PropagationWizard.java b/analysis/globalanalysis/execution/org.polarsys.esf.globalanalysis.execution.ui/src/main/java/org/polarsys/esf/globalanalysis/execution/ui/wizard/PropagationWizard.java
new file mode 100644
index 0000000..f1d319d
--- /dev/null
+++ b/analysis/globalanalysis/execution/org.polarsys.esf.globalanalysis.execution.ui/src/main/java/org/polarsys/esf/globalanalysis/execution/ui/wizard/PropagationWizard.java
@@ -0,0 +1,201 @@
+/*******************************************************************************
+ * Copyright (c) 2016 ALL4TEC & CEA LIST.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * ALL4TEC & CEA LIST - initial API and implementation
+ ******************************************************************************/
+package org.polarsys.esf.globalanalysis.execution.ui.wizard;
+
+import java.io.IOException;
+import java.util.List;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.wizard.IWizard;
+import org.polarsys.esf.core.common.ui.selection.SelectAndRevealResourceJob;
+import org.polarsys.esf.core.common.ui.wizard.AbstractGenericWizard;
+import org.polarsys.esf.esflocalanalysis.IAbstractSLocalAnalysisElement;
+import org.polarsys.esf.esflocalanalysis.ISLocalAnalysis;
+import org.polarsys.esf.globalanalysis.execution.ui.GlobalAnalysisExecutionUIActivator;
+import org.polarsys.esf.globalanalysis.execution.ui.GlobalAnalysisExecutionUIActivator.Implementation;
+
+/**
+ *
+ * Concrete propagation Wizard.
+ *
+ * @author $Author: jdumont $
+ * @version $Revision: 83 $
+ */
+public final class PropagationWizard
+ extends AbstractGenericWizard
+ implements IWizard {
+
+ /** Title of wizard window. */
+ private static final String PROPAGATION_WIZARD_TITLE = GlobalAnalysisExecutionUIActivator.getMessages().getString(
+ "PropagationWizard.title"); //$NON-NLS-1$
+
+ /** Propagation success message. */
+ private static final String PROPAGATION_SUCCEED = GlobalAnalysisExecutionUIActivator.getMessages().getString(
+ "PropagationWizard.sentence.succeed"); //$NON-NLS-1$
+
+ /**
+ * Second page of wizard, which allows to select the item to propagate.
+ * NB : Use concrete type to get access to parameter.
+ */
+ private FearedEventsSelectionPage mFearedEventsSelectionPage = null;
+
+ /** Model selected to run wizard on. */
+ private ISLocalAnalysis mSLocalAnalysis = null;
+
+ /** Propagation engine. */
+ private IInternalPropagatorEngine mPropagatorEngine = null;
+
+ /** List of feared event items from which propagate. */
+ private List<IAbstractSLocalAnalysisElement> mPropagatedFearedEventItems = null;
+
+ /** List of not propagated feared event items. */
+ private List<IAbstractSLocalAnalysisElement> mNotPropagatedFearedEventItems = null;
+
+
+ /** Utility object used to manipulate feared event items. */
+ private IFearedEventItemUtils mFearedEventUtils = null;
+
+ /** The selection given when the wizard is created. */
+ private ISelection mSelection = null;
+
+ /**
+ * Default constructor.
+ *
+ * @param pSelection selection concerned by wizard
+ */
+ public PropagationWizard(final ISelection pSelection) {
+ super(PROPAGATION_SUCCEED, false);
+
+ // Add icons
+ setDefaultPageImageDescriptor(GlobalAnalysisExecutionUIActivator.getPlugin().getImageRegistry()
+ .getDescriptor(Implementation.ICON_WIZARD_PROPAGATION_KEY));
+
+ // Set wizard window title
+ setWindowTitle(PROPAGATION_WIZARD_TITLE);
+
+ // Remember of the selection helper
+ mSelection = pSelection;
+
+ // Initialise the utils
+ mFearedEventUtils = FearedEventUtilsFactory.init().getFearedEventItemUtils();
+ mModelUtils = ModelUtilsFactory.init().getModelUtils();
+
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * This will create all the page potentially displayed,
+ * even does which won't be displayed. This is mandatory
+ * to be able to load them after.
+ */
+ @Override
+ public void addPages() {
+ // Call the parent method
+ super.addPages();
+
+ // Create the feared events selection
+ mFearedEventsSelectionPage = new FearedEventsSelectionPage();
+ addPage(mFearedEventsSelectionPage);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ protected void prepareFinish() {
+ // Get parameters
+ readPropagationParameter();
+
+ // Update each feared event item, to modify selected status
+ for (IAbstractSLocalAnalysisElement vItem : mPropagatedFearedEventItems) {
+ mFearedEventUtils.setSelected(vItem, true);
+ }
+
+ for (IAbstractSLocalAnalysisElement vItem : mNotPropagatedFearedEventItems) {
+ mFearedEventUtils.setSelected(vItem, false);
+ }
+
+ // Save library
+ try {
+ IFearedEventsLibrary vLibrary = mModelUtils.getLibraryFromModel(mSLocalAnalysis, FearedEventsLibrary.class);
+
+ vLibrary.eResource().save(null);
+ } catch (final IOException pException) {
+ AnalysisCoreUIActivator.logError(pException.getMessage(), pException);
+ }
+ }
+
+ /**
+ * Read all parameters from wizard pages.
+ */
+ private void readPropagationParameter() {
+
+ // Selected feared event items to propagate
+ mPropagatedFearedEventItems = mFearedEventsSelectionPage.getSelectedList();
+
+ // Not selected feared event items
+ mNotPropagatedFearedEventItems = mFearedEventsSelectionPage.getNotSelectedList();
+
+ // Get the selected propagation engine and read its specific parameters
+ mPropagatorEngine = mEngineSelectionPage.getSelectedEngine();
+ mPropagatorEngine.readSpecificParameters();
+
+
+ }
+
+ /**
+ * Wizard save selected model to share between page and job.
+ *
+ * @param pModel Model to share.
+ */
+ public void setModel(final ISLocalAnalysis pModel) {
+ mSLocalAnalysis = pModel;
+ mFearedEventsSelectionPage.initSelectionLists();
+ }
+
+ /**
+ * @return Current model.
+ */
+ public ISLocalAnalysis getModel() {
+ return mSLocalAnalysis;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ protected IStatus doFinish(final IProgressMonitor pMonitor) {
+ IStatus vStatus = null;
+
+ vStatus = runPropagation(pMonitor);
+
+ // Finally, run an asynchronous job to show the results
+ // NB : This is voluntary performed even if the propagation failed, or finished with a warning
+ SelectAndRevealResourceJob vSelectJob =
+ new SelectAndRevealResourceJob(mPropagatorEngine.getResultsFolder());
+ vSelectJob.schedule();
+
+ return vStatus;
+ }
+
+ /**
+ * Run the propagation.
+ *
+ * @param pMonitor Used to follow propagation progression
+ * @return A status, according to final results
+ */
+ private IStatus runPropagation(final IProgressMonitor pMonitor) {
+ return mPropagatorEngine.propagateSAModel(mSLocalAnalysis, pMonitor);
+ }
+}
diff --git a/analysis/globalanalysis/execution/org.polarsys.esf.globalanalysis.execution.ui/src/main/java/org/polarsys/esf/globalanalysis/execution/ui/wizard/PropagationWizardFactory.java b/analysis/globalanalysis/execution/org.polarsys.esf.globalanalysis.execution.ui/src/main/java/org/polarsys/esf/globalanalysis/execution/ui/wizard/PropagationWizardFactory.java
new file mode 100644
index 0000000..d70389f
--- /dev/null
+++ b/analysis/globalanalysis/execution/org.polarsys.esf.globalanalysis.execution.ui/src/main/java/org/polarsys/esf/globalanalysis/execution/ui/wizard/PropagationWizardFactory.java
@@ -0,0 +1,43 @@
+/*******************************************************************************
+ * Copyright (c) 2016 ALL4TEC & CEA LIST.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * ALL4TEC & CEA LIST - initial API and implementation
+ ******************************************************************************/
+package org.polarsys.esf.globalanalysis.execution.ui.wizard;
+
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.wizard.IWizard;
+
+/**
+ *
+ * Concrete factory for propagation wizard.
+ *
+ * @author $Author: jdumont $
+ * @version $Revision: 83 $
+ */
+public final class PropagationWizardFactory
+ implements IPropagationWizardFactory {
+
+ /**
+ * Default constructor.
+ */
+ public PropagationWizardFactory() {
+ super();
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public IWizard createPropagationWizard(final ISelection pSelection) {
+ IWizard vPropagationWizard = new PropagationWizard(pSelection);
+
+ return vPropagationWizard;
+ }
+
+}
diff --git a/analysis/globalanalysis/execution/org.polarsys.esf.globalanalysis.execution.ui/src/main/resources/icons/icon_propagation.png b/analysis/globalanalysis/execution/org.polarsys.esf.globalanalysis.execution.ui/src/main/resources/icons/icon_propagation.png
new file mode 100644
index 0000000..3f228e7
--- /dev/null
+++ b/analysis/globalanalysis/execution/org.polarsys.esf.globalanalysis.execution.ui/src/main/resources/icons/icon_propagation.png
Binary files differ
diff --git a/analysis/globalanalysis/execution/org.polarsys.esf.globalanalysis.execution.ui/src/main/resources/icons/wizard_propagation.png b/analysis/globalanalysis/execution/org.polarsys.esf.globalanalysis.execution.ui/src/main/resources/icons/wizard_propagation.png
new file mode 100644
index 0000000..51cbb05
--- /dev/null
+++ b/analysis/globalanalysis/execution/org.polarsys.esf.globalanalysis.execution.ui/src/main/resources/icons/wizard_propagation.png
Binary files differ
diff --git a/analysis/globalanalysis/execution/org.polarsys.esf.globalanalysis.execution.ui/src/main/resources/properties/nls/messages.properties b/analysis/globalanalysis/execution/org.polarsys.esf.globalanalysis.execution.ui/src/main/resources/properties/nls/messages.properties
new file mode 100644
index 0000000..ccdee37
--- /dev/null
+++ b/analysis/globalanalysis/execution/org.polarsys.esf.globalanalysis.execution.ui/src/main/resources/properties/nls/messages.properties
@@ -0,0 +1,12 @@
+PropagationPreferencePage.label.engine = Default engine :
+PropagationPreferencePage.label.runcontrol = Run control before propagation by default
+
+PropagationWizard.job.focus = Show Info.log
+PropagationWizard.sentence.coherence.failed = Propagation not done, control of coherence failed.
+PropagationWizard.title = Propagation
+PropagationWizard.sentence.succeed = Propagation successful
+
+PropagationWizardFearedEventsSelectionPage.description = Generic propagation options
+PropagationWizardFearedEventsSelectionPage.description.label.list.available = Feared events referenced in local analysis
+PropagationWizardFearedEventsSelectionPage.description.label.list.selected = Propagated events
+PropagationWizardFearedEventsSelectionPage.description.title = Common options
diff --git a/analysis/localanalysis/profile/org.polarsys.esf.localanalysis.profile.tools/src/main/java/org/polarsys/esf/localanalysis/profile/tools/util/FearedEventItemUtils.java b/analysis/localanalysis/profile/org.polarsys.esf.localanalysis.profile.tools/src/main/java/org/polarsys/esf/localanalysis/profile/tools/util/FearedEventItemUtils.java
new file mode 100644
index 0000000..b41dc0a
--- /dev/null
+++ b/analysis/localanalysis/profile/org.polarsys.esf.localanalysis.profile.tools/src/main/java/org/polarsys/esf/localanalysis/profile/tools/util/FearedEventItemUtils.java
@@ -0,0 +1,176 @@
+/*******************************************************************************
+ * Copyright (c) 2016 ALL4TEC & CEA LIST.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * ALL4TEC & CEA LIST - initial API and implementation
+ ******************************************************************************/
+package org.polarsys.esf.localanalysis.profile.tools.util;
+
+import java.security.InvalidParameterException;
+import java.util.HashSet;
+import java.util.Set;
+
+import org.polarsys.esf.esflocalanalysis.IAbstractSFailureModeLAnalysis;
+import org.polarsys.esf.esflocalanalysis.IAbstractSLocalAnalysisElement;
+import org.polarsys.esf.esflocalanalysis.ISFearedEvent;
+import org.polarsys.esf.esflocalanalysis.ISFearedEventsFamily;
+import org.polarsys.esf.esflocalanalysis.ISFearedEventsLibrary;
+
+/**
+ * Utility class used with item of feared event library.
+ *
+ * @author $Author: jdumont $
+ * @version $Revision: 83 $
+ */
+public class FearedEventItemUtils
+ implements IFearedEventItemUtils {
+
+ /**
+ * Default constructor.
+ */
+ public FearedEventItemUtils() {
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void setSelected(final IAbstractSLocalAnalysisElement pObject, final boolean pValue) {
+ if (pObject instanceof ISFearedEvent) {
+ ((ISFearedEvent) pObject).setIsSelected(pValue);
+ } else if (pObject instanceof ISFearedEventsFamily) {
+ ((ISFearedEventsFamily) pObject).setIsSelected(pValue);
+ } else {
+ throw new InvalidParameterException();
+ }
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public boolean isSelected(final IAbstractSLocalAnalysisElement pObject) {
+ boolean vResult = false;
+
+ if (pObject instanceof ISFearedEvent) {
+ vResult = ((ISFearedEvent) pObject).isSelected();
+ } else if (pObject instanceof ISFearedEventsFamily) {
+ vResult = ((ISFearedEventsFamily) pObject).isSelected();
+ } else {
+ throw new InvalidParameterException();
+ }
+
+ return vResult;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public Set<IAbstractSFailureModeLAnalysis> getFailureModesForPropagation(
+ final IAbstractSLocalAnalysisElement pFearedEventItem) {
+
+ Set<IAbstractSFailureModeLAnalysis> vReturnedSet = new HashSet<IAbstractSFailureModeLAnalysis>();
+
+ // Check if parameter is not null
+ if (pFearedEventItem != null) {
+
+ // Run exploration
+ extractAssociatedFailureModes(pFearedEventItem, vReturnedSet, false);
+ }
+
+ return vReturnedSet;
+ }
+
+ /**
+ * Recursive method to extract associated failure modes with <b>selected</b> feared events library items. Method
+ * fills a set of failure modes during exploration.
+ *
+ * <p>
+ * With a set, we are certain that there is not doublon.
+ * </p>
+ *
+ * @param pFearedEventsLibraryItem Feared events library to handle
+ * @param pAssociatedFailureModesSet Set to fill
+ * @param pSelectedParent <code>true</code> if ancestor of item is selected, otherwise <code>false</code>
+ */
+ private void extractAssociatedFailureModes(
+ final IAbstractSLocalAnalysisElement pFearedEventsLibraryItem,
+ final Set<IAbstractSFailureModeLAnalysis> pAssociatedFailureModesSet,
+ final boolean pSelectedParent) {
+
+ // If item is a library so root element
+ if (pFearedEventsLibraryItem instanceof ISFearedEventsLibrary) {
+
+ // Explore all family to extract linked selected item
+ for (ISFearedEvent vFearedEvent : ((ISFearedEventsLibrary) pFearedEventsLibraryItem)
+ .getSFearedEventsList()) {
+ extractAssociatedFailureModes(vFearedEvent, pAssociatedFailureModesSet, false);
+ }
+
+ // Then explore all feared events at root to extract selected feared events that is not contained in family
+ // children
+ for (ISFearedEventsFamily vFamily : ((ISFearedEventsLibrary) pFearedEventsLibraryItem)
+ .getSFearedEventsFamiliesList()) {
+ extractAssociatedFailureModes(vFamily, pAssociatedFailureModesSet, false);
+ }
+
+ } else if (pFearedEventsLibraryItem instanceof ISFearedEvent) {
+ // If item is a feared event,
+ // add associated failure mode if it or its parent is selected
+ if (pSelectedParent || ((ISFearedEvent) pFearedEventsLibraryItem).isSelected()) {
+ pAssociatedFailureModesSet
+ .addAll(((ISFearedEvent) pFearedEventsLibraryItem).getSFailureModesLAnalysisList());
+ }
+
+ } else if (pFearedEventsLibraryItem instanceof ISFearedEventsFamily) {
+ // If item is a family
+
+ // Add associated failure if it or its parent is selected
+ boolean vSelectedFamily = ((ISFearedEventsFamily) pFearedEventsLibraryItem).isSelected();
+ if (vSelectedFamily || pSelectedParent) {
+ pAssociatedFailureModesSet
+ .addAll(((ISFearedEventsFamily) pFearedEventsLibraryItem).getSFailureModesLAnalysisList());
+ }
+
+ // Pass selection state to children exploration
+ // First explore sub family
+ for (ISFearedEventsFamily vSubFamily : ((ISFearedEventsFamily) pFearedEventsLibraryItem)
+ .getSubFamiliesList()) {
+ extractAssociatedFailureModes(vSubFamily, pAssociatedFailureModesSet, vSelectedFamily);
+ }
+
+ // Then linked feared events
+ for (ISFearedEvent vFearedEvent : ((ISFearedEventsFamily) pFearedEventsLibraryItem)
+ .getAllSFearedEventsList()) {
+ extractAssociatedFailureModes(vFearedEvent, pAssociatedFailureModesSet, vSelectedFamily);
+ }
+ }
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public boolean isFamilyEmpty(final ISFearedEventsFamily pFamily) {
+
+ // Check if the family contains some feared events
+ boolean vEmpty = pFamily.getSFearedEventsList().isEmpty();
+
+ // If the family doesn't contain any feared event, check if it contains
+ // only empty sub families, as soon as one non empty sub family is found,
+ // the current family is not considered as empty
+ int vIndex = 0;
+ while (vEmpty && vIndex < pFamily.getSubFamiliesList().size()) {
+ vEmpty = isFamilyEmpty(pFamily.getSubFamiliesList().get(vIndex));
+
+ vIndex++;
+ }
+
+ return vEmpty;
+ }
+}
diff --git a/analysis/localanalysis/profile/org.polarsys.esf.localanalysis.profile.tools/src/main/java/org/polarsys/esf/localanalysis/profile/tools/util/FearedEventUtilsFactory.java b/analysis/localanalysis/profile/org.polarsys.esf.localanalysis.profile.tools/src/main/java/org/polarsys/esf/localanalysis/profile/tools/util/FearedEventUtilsFactory.java
new file mode 100644
index 0000000..fa4f304
--- /dev/null
+++ b/analysis/localanalysis/profile/org.polarsys.esf.localanalysis.profile.tools/src/main/java/org/polarsys/esf/localanalysis/profile/tools/util/FearedEventUtilsFactory.java
@@ -0,0 +1,63 @@
+/*******************************************************************************
+ * Copyright (c) 2016 ALL4TEC & CEA LIST.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * ALL4TEC & CEA LIST - initial API and implementation
+ ******************************************************************************/
+package org.polarsys.esf.localanalysis.profile.tools.util;
+
+/**
+ * Factory for utility classes about feared event items.
+ *
+ * @author $Author: jdumont $
+ * @version $Revision: 83 $
+ */
+public final class FearedEventUtilsFactory
+ implements IFearedEventUtilsFactory {
+
+ /**
+ * Utility class for feared event items.
+ */
+ private IFearedEventItemUtils mFearedEventItemUtils = null;
+
+ /**
+ * Default constructor.
+ *
+ * Private to avoid instantiation.
+ */
+ private FearedEventUtilsFactory() {
+ }
+
+ /**
+ * Create and initialise a new factory.
+ *
+ * @return A new factory.
+ */
+ public static IFearedEventUtilsFactory init() {
+ IFearedEventUtilsFactory vFactory = new FearedEventUtilsFactory();
+
+ vFactory.setFearedEventItemUtils(new FearedEventItemUtils());
+
+ return vFactory;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public IFearedEventItemUtils getFearedEventItemUtils() {
+ return mFearedEventItemUtils;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void setFearedEventItemUtils(final IFearedEventItemUtils pFearedEventItemUtils) {
+ mFearedEventItemUtils = pFearedEventItemUtils;
+ }
+}
diff --git a/analysis/localanalysis/profile/org.polarsys.esf.localanalysis.profile.tools/src/main/java/org/polarsys/esf/localanalysis/profile/tools/util/IFearedEventItemUtils.java b/analysis/localanalysis/profile/org.polarsys.esf.localanalysis.profile.tools/src/main/java/org/polarsys/esf/localanalysis/profile/tools/util/IFearedEventItemUtils.java
new file mode 100644
index 0000000..8c65fe3
--- /dev/null
+++ b/analysis/localanalysis/profile/org.polarsys.esf.localanalysis.profile.tools/src/main/java/org/polarsys/esf/localanalysis/profile/tools/util/IFearedEventItemUtils.java
@@ -0,0 +1,64 @@
+/*******************************************************************************
+ * Copyright (c) 2016 ALL4TEC & CEA LIST.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * ALL4TEC & CEA LIST - initial API and implementation
+ ******************************************************************************/
+package org.polarsys.esf.localanalysis.profile.tools.util;
+
+import java.util.Set;
+
+import org.polarsys.esf.esflocalanalysis.IAbstractSFailureModeLAnalysis;
+import org.polarsys.esf.esflocalanalysis.IAbstractSLocalAnalysisElement;
+import org.polarsys.esf.esflocalanalysis.ISFearedEventsFamily;
+
+/**
+ * Interface which offers facilities about Library items.
+ *
+ * @author $Author: jdumont $
+ * @version $Revision: 83 $
+ */
+public interface IFearedEventItemUtils {
+
+ /**
+ * Set the selected status.
+ *
+ * WARNING : concrete type of pObject must be {@link FearedEvent} or {@link FearedEventsFamily}
+ *
+ * @param pObject Target for which selected status will be modified
+ * @param pValue The value to set
+ */
+ void setSelected(IAbstractSLocalAnalysisElement pObject, boolean pValue);
+
+ /**
+ * Get if current item is selected.
+ *
+ * WARNING : concrete type of pObject must be {@link FearedEvent} or {@link FearedEventsFamily}
+ *
+ * @param pObject Object for which selected status is computed
+ * @return The selected status
+ */
+ boolean isSelected(IAbstractSLocalAnalysisElement pObject);
+
+ /**
+ * Get associated failure modes with <b>selected</b> feared events library items.
+ *
+ * @param pFearedEventItem Root element where exploration begin
+ * @return Set of found failure modes
+ */
+ Set<IAbstractSFailureModeLAnalysis> getFailureModesForPropagation(IAbstractSLocalAnalysisElement pFearedEventItem);
+
+ /**
+ * Recursive method which check if a family contains at least one feared event,
+ * or one non empty sub family. In these case, the given family is not considered as empty.
+ *
+ * @param pFamily The family to check
+ * @return <code>true</code> if the given family is empty
+ */
+ boolean isFamilyEmpty(final ISFearedEventsFamily pFamily);
+
+}
diff --git a/analysis/localanalysis/profile/org.polarsys.esf.localanalysis.profile.tools/src/main/java/org/polarsys/esf/localanalysis/profile/tools/util/IFearedEventUtilsFactory.java b/analysis/localanalysis/profile/org.polarsys.esf.localanalysis.profile.tools/src/main/java/org/polarsys/esf/localanalysis/profile/tools/util/IFearedEventUtilsFactory.java
new file mode 100644
index 0000000..58d45a8
--- /dev/null
+++ b/analysis/localanalysis/profile/org.polarsys.esf.localanalysis.profile.tools/src/main/java/org/polarsys/esf/localanalysis/profile/tools/util/IFearedEventUtilsFactory.java
@@ -0,0 +1,31 @@
+/*******************************************************************************
+ * Copyright (c) 2016 ALL4TEC & CEA LIST.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * ALL4TEC & CEA LIST - initial API and implementation
+ ******************************************************************************/
+package org.polarsys.esf.localanalysis.profile.tools.util;
+
+/**
+ * Utility used with item of feared event library.
+ *
+ * @author $Author: jdumont $
+ * @version $Revision: 83 $
+ */
+public interface IFearedEventUtilsFactory {
+
+ /**
+ * @return The feared event item utility
+ */
+ IFearedEventItemUtils getFearedEventItemUtils();
+
+ /**
+ * @param pFearedEventItemUtils The feared event item utility class to set
+ */
+ void setFearedEventItemUtils(IFearedEventItemUtils pFearedEventItemUtils);
+
+}