[491016] - [Resource MGT] FeaturePlugins version could be 0.0.0

Bug: 491016
Change-Id: I5866192a7d203f6b9e6c7c01764f6daa39925f86
Signed-off-by: Boubekeur Zendagui <boubekeur.zendagui@obeo.fr>
diff --git a/portfolio/org.eclipse.egf.eclipse.resources.mgt/src/org/eclipse/egf/eclipse/resources/mgt/operation/UpdateFeatureOperation.java b/portfolio/org.eclipse.egf.eclipse.resources.mgt/src/org/eclipse/egf/eclipse/resources/mgt/operation/UpdateFeatureOperation.java
index c91fd7d..ac07949 100644
--- a/portfolio/org.eclipse.egf.eclipse.resources.mgt/src/org/eclipse/egf/eclipse/resources/mgt/operation/UpdateFeatureOperation.java
+++ b/portfolio/org.eclipse.egf.eclipse.resources.mgt/src/org/eclipse/egf/eclipse/resources/mgt/operation/UpdateFeatureOperation.java
@@ -1,153 +1,156 @@
-/**

- * <copyright>

- * 

- * Copyright (c) 2014 Thales Corporate Services S.A.S.

- * 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:

- * Thales Corporate Services S.A.S - initial API and implementation

- * 

- * </copyright>

- */

-

-package org.eclipse.egf.eclipse.resources.mgt.operation;

-

-import java.lang.reflect.InvocationTargetException;

-

-import org.eclipse.core.resources.IFile;

-import org.eclipse.core.resources.IProject;

-import org.eclipse.core.resources.ResourcesPlugin;

-import org.eclipse.core.runtime.Assert;

-import org.eclipse.core.runtime.CoreException;

-import org.eclipse.core.runtime.IProgressMonitor;

-import org.eclipse.core.runtime.NullProgressMonitor;

-import org.eclipse.pde.core.plugin.IPluginModelBase;

-import org.eclipse.pde.internal.core.feature.FeatureChild;

-import org.eclipse.pde.internal.core.feature.FeaturePlugin;

-import org.eclipse.pde.internal.core.feature.WorkspaceFeatureModel;

-import org.eclipse.pde.internal.core.ifeature.IFeature;

-import org.eclipse.pde.internal.core.ifeature.IFeatureChild;

-import org.eclipse.pde.internal.core.ifeature.IFeatureModel;

-import org.eclipse.pde.internal.core.ifeature.IFeaturePlugin;

-import org.eclipse.pde.internal.core.project.PDEProject;

-import org.eclipse.pde.internal.core.util.CoreUtility;

-import org.eclipse.ui.actions.WorkspaceModifyOperation;

-import org.eclipse.egf.eclipse.resources.mgt.util.EclipseModelsAccessor;

-

-/**

- * @author Boubekeur Zendagui

- */

-

-@SuppressWarnings("restriction")

-public class UpdateFeatureOperation extends WorkspaceModifyOperation{

-

-	private String _featureID; 

-	private String _pluginID; 

-	private String _featureToIncludeID;

-	

-	public UpdateFeatureOperation(String featureID, String pluginID, String featureToIncludeID) {

-		super();

-		_featureID = featureID; 

-		_pluginID = pluginID; 

-		_featureToIncludeID = featureToIncludeID;

-	}

-	

-	@Override

-	protected void execute(IProgressMonitor monitor) throws CoreException, InvocationTargetException, InterruptedException {

-		Assert.isNotNull(_featureID, "Feature ID must be not null");

-		Assert.isTrue(!( _featureID != null && _featureID.trim().length() == 0) , "Feature ID must be not empty");

-		

-		IProject fProject = ResourcesPlugin.getWorkspace().getRoot().getProject(_featureID);

-		fProject.refreshLocal(IProject.DEPTH_INFINITE, new NullProgressMonitor());

-		IFile file = PDEProject.getFeatureXml(fProject);

-		WorkspaceFeatureModel model = new WorkspaceFeatureModel(file);

-		model.load();

-		// check if the feature model is ok

-		IFeature feature = model.getFeature();

-		if (feature == null)

-			return;

-

-		if (_pluginID != null && _pluginID.length() != 0)

-			addPlugin(feature, _pluginID);

-

-		if (_featureToIncludeID != null && _featureToIncludeID.length() != 0)

-			addFeature(feature, _featureToIncludeID);

-

-		model.save();

-		model.dispose();

-	}

-	

-	private void addPlugin(IFeature feature, String pName) {

-		try {

-			IPluginModelBase[] pluginList = { EclipseModelsAccessor.getPluginModelBase(pName) };

-			addPlugins(feature, pluginList);

-		} catch (CoreException e) {

-			e.printStackTrace();

-		}

-	}

-	

-	private void addPlugins(IFeature feature, IPluginModelBase[] candidates) throws CoreException{

-		IFeatureModel model = feature.getModel();

-		IFeaturePlugin[] candidate_plugin = new IFeaturePlugin[candidates.length];

-		for (int i = 0; i < candidates.length; i++) {

-			IPluginModelBase candidate = candidates[i];		

-			FeaturePlugin fplugin = (FeaturePlugin) model.getFactory().createPlugin();

-			fplugin.loadFrom(candidate.getPluginBase());

-			fplugin.setVersion(candidate.getPluginBase().getVersion()); //$NON-NLS-1$

-			fplugin.setUnpack(CoreUtility.guessUnpack(candidate.getBundleDescription()));

-			candidate_plugin[i] = fplugin;

-		}

-		

-		// Merge of plug-in [New]

-		IFeaturePlugin[] plugin_to_add = {};

-		IFeaturePlugin[] existing_plugin = feature.getPlugins();

-		

-		for (int i = 0; i < candidate_plugin.length; i++) 

-		{

-			boolean add = true;

-			for (IFeaturePlugin iFeaturePlugin : existing_plugin) 

-			{

-				if (iFeaturePlugin.getId().equals(candidate_plugin[i].getId()))

-				{

-					add = false;

-					break;

-				}

-			}

-			if (add)

-			{

-				IFeaturePlugin[] temp_plugin_to_add = new IFeaturePlugin[plugin_to_add.length+1];

-				System.arraycopy(plugin_to_add, 0, temp_plugin_to_add, 0, plugin_to_add.length);

-				temp_plugin_to_add[plugin_to_add.length] = candidate_plugin[i];

-				plugin_to_add = new IFeaturePlugin[temp_plugin_to_add.length];

-				System.arraycopy(temp_plugin_to_add, 0, plugin_to_add, 0, plugin_to_add.length);

-			}

-		}

-		feature.addPlugins(plugin_to_add);

-	}

-	

-	private void addFeature(IFeature feature, String fname){

-		try {

-			IFeature[] featureToAdd = { EclipseModelsAccessor.getFeature(fname)};

-			addFeatures(feature, featureToAdd);

-		} catch (CoreException e) {

-			e.printStackTrace();

-		}

-	}

-	

-	private void addFeatures(IFeature feature, IFeature[] candidates) throws CoreException{

-		IFeatureModel model = feature.getModel();

-		IFeatureChild[] added = new IFeatureChild[candidates.length];

-		for (int i = 0; i < candidates.length; i++) {

-			IFeature candidate = candidates[i];

-			FeatureChild featureChild = (FeatureChild)model.getFactory().createChild();

-			featureChild.loadFrom(candidate);

-			featureChild.setVersion(candidate.getVersion()); //$NON-NLS-1$

-			added[i] = featureChild;

-		}

-		feature.addIncludedFeatures(added);

-	}

-

-}

+/**
+ * <copyright>
+ * 
+ * Copyright (c) 2014 Thales Corporate Services S.A.S.
+ * 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:
+ * Thales Corporate Services S.A.S - initial API and implementation
+ * 
+ * </copyright>
+ */
+
+package org.eclipse.egf.eclipse.resources.mgt.operation;
+
+import java.lang.reflect.InvocationTargetException;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.Assert;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.pde.core.plugin.IPluginModelBase;
+import org.eclipse.pde.internal.core.feature.FeatureChild;
+import org.eclipse.pde.internal.core.feature.FeaturePlugin;
+import org.eclipse.pde.internal.core.feature.WorkspaceFeatureModel;
+import org.eclipse.pde.internal.core.ifeature.IFeature;
+import org.eclipse.pde.internal.core.ifeature.IFeatureChild;
+import org.eclipse.pde.internal.core.ifeature.IFeatureModel;
+import org.eclipse.pde.internal.core.ifeature.IFeaturePlugin;
+import org.eclipse.pde.internal.core.project.PDEProject;
+import org.eclipse.pde.internal.core.util.CoreUtility;
+import org.eclipse.ui.actions.WorkspaceModifyOperation;
+import org.eclipse.egf.eclipse.resources.mgt.util.EclipseModelsAccessor;
+
+/**
+ * @author Boubekeur Zendagui
+ */
+
+@SuppressWarnings("restriction")
+public class UpdateFeatureOperation extends WorkspaceModifyOperation{
+
+	private String _featureID; 
+	private String _pluginID; 
+	private String _featureToIncludeID;
+	private final String DEFAULT_VERSION = "0.0.0"; //$NON-NLS-1$
+	
+	public UpdateFeatureOperation(String featureID, String pluginID, String featureToIncludeID) {
+		super();
+		_featureID = featureID; 
+		_pluginID = pluginID; 
+		_featureToIncludeID = featureToIncludeID;
+	}
+	
+	@Override
+	protected void execute(IProgressMonitor monitor) throws CoreException, InvocationTargetException, InterruptedException {
+		Assert.isNotNull(_featureID, "Feature ID must be not null");
+		Assert.isTrue(!( _featureID != null && _featureID.trim().length() == 0) , "Feature ID must be not empty");
+		
+		IProject fProject = ResourcesPlugin.getWorkspace().getRoot().getProject(_featureID);
+		fProject.refreshLocal(IProject.DEPTH_INFINITE, new NullProgressMonitor());
+		IFile file = PDEProject.getFeatureXml(fProject);
+		WorkspaceFeatureModel model = new WorkspaceFeatureModel(file);
+		model.load();
+		// check if the feature model is ok
+		IFeature feature = model.getFeature();
+		if (feature == null)
+			return;
+
+		if (_pluginID != null && _pluginID.length() != 0)
+			addPlugin(feature, _pluginID);
+
+		if (_featureToIncludeID != null && _featureToIncludeID.length() != 0)
+			addFeature(feature, _featureToIncludeID);
+
+		model.save();
+		model.dispose();
+	}
+	
+	private void addPlugin(IFeature feature, String pName) {
+		try {
+			IPluginModelBase[] pluginList = { EclipseModelsAccessor.getPluginModelBase(pName) };
+			addPlugins(feature, pluginList);
+		} catch (CoreException e) {
+			e.printStackTrace();
+		}
+	}
+	
+	private void addPlugins(IFeature feature, IPluginModelBase[] candidates) throws CoreException{
+		IFeatureModel model = feature.getModel();
+		IFeaturePlugin[] candidate_plugin = new IFeaturePlugin[candidates.length];
+		for (int i = 0; i < candidates.length; i++) {
+			IPluginModelBase candidate = candidates[i];		
+			FeaturePlugin fplugin = (FeaturePlugin) model.getFactory().createPlugin();
+			fplugin.loadFrom(candidate.getPluginBase());
+//			fplugin.setVersion(candidate.getPluginBase().getVersion()); //$NON-NLS-1$
+			fplugin.setVersion(DEFAULT_VERSION);
+			fplugin.setUnpack(CoreUtility.guessUnpack(candidate.getBundleDescription()));
+			candidate_plugin[i] = fplugin;
+		}
+		
+		// Merge of plug-in [New]
+		IFeaturePlugin[] plugin_to_add = {};
+		IFeaturePlugin[] existing_plugin = feature.getPlugins();
+		
+		for (int i = 0; i < candidate_plugin.length; i++) 
+		{
+			boolean add = true;
+			for (IFeaturePlugin iFeaturePlugin : existing_plugin) 
+			{
+				if (iFeaturePlugin.getId().equals(candidate_plugin[i].getId()))
+				{
+					add = false;
+					break;
+				}
+			}
+			if (add)
+			{
+				IFeaturePlugin[] temp_plugin_to_add = new IFeaturePlugin[plugin_to_add.length+1];
+				System.arraycopy(plugin_to_add, 0, temp_plugin_to_add, 0, plugin_to_add.length);
+				temp_plugin_to_add[plugin_to_add.length] = candidate_plugin[i];
+				plugin_to_add = new IFeaturePlugin[temp_plugin_to_add.length];
+				System.arraycopy(temp_plugin_to_add, 0, plugin_to_add, 0, plugin_to_add.length);
+			}
+		}
+		feature.addPlugins(plugin_to_add);
+	}
+	
+	private void addFeature(IFeature feature, String fname){
+		try {
+			IFeature[] featureToAdd = { EclipseModelsAccessor.getFeature(fname)};
+			addFeatures(feature, featureToAdd);
+		} catch (CoreException e) {
+			e.printStackTrace();
+		}
+	}
+	
+	private void addFeatures(IFeature feature, IFeature[] candidates) throws CoreException{
+		IFeatureModel model = feature.getModel();
+		IFeatureChild[] added = new IFeatureChild[candidates.length];
+		for (int i = 0; i < candidates.length; i++) {
+			IFeature candidate = candidates[i];
+			FeatureChild featureChild = (FeatureChild)model.getFactory().createChild();
+			featureChild.loadFrom(candidate);
+//			featureChild.setVersion(candidate.getVersion()); //$NON-NLS-1$
+			featureChild.setVersion(DEFAULT_VERSION);
+			added[i] = featureChild;
+		}
+		feature.addIncludedFeatures(added);
+	}
+
+}