[491001] Build application create a new Feature data

Bug: 491001
Change-Id: Ie4caacdd872b6ccce62ce4635fb9ae55b584c750
diff --git a/portfolio/org.eclipse.egf.portfolio.genchain.tools.ui/src/org/eclipse/egf/portfolio/genchain/tools/ui/actions/FeatureHelper.java b/portfolio/org.eclipse.egf.portfolio.genchain.tools.ui/src/org/eclipse/egf/portfolio/genchain/tools/ui/actions/FeatureHelper.java
index fd8135a..d882141 100644
--- a/portfolio/org.eclipse.egf.portfolio.genchain.tools.ui/src/org/eclipse/egf/portfolio/genchain/tools/ui/actions/FeatureHelper.java
+++ b/portfolio/org.eclipse.egf.portfolio.genchain.tools.ui/src/org/eclipse/egf/portfolio/genchain/tools/ui/actions/FeatureHelper.java
@@ -1,135 +1,165 @@
-package org.eclipse.egf.portfolio.genchain.tools.ui.actions;

-

-import java.lang.reflect.InvocationTargetException;

-import java.util.ArrayList;

-import java.util.Collection;

-import java.util.List;

-

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

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

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

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

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

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

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

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

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

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

-import org.eclipse.egf.portfolio.genchain.tools.Activator;

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

-import org.eclipse.pde.internal.core.bundle.WorkspaceBundlePluginModel;

-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.IFeaturePlugin;

-import org.eclipse.pde.internal.ui.wizards.feature.CreateFeatureProjectOperation;

-import org.eclipse.pde.internal.ui.wizards.feature.FeatureData;

-

-public class FeatureHelper {

-	public static final String VERSION = "1.0.0.qualifier";

-	// private static final Shell SHELL =

-	// PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell();

-	private static final Path PLUGIN_PATH = new Path("/plugin.xml");

-	private static final Path METAFEST_PATH = new Path("/META-INF/MANIFEST.MF");

-	private static final IWorkspaceRoot ROOT = ResourcesPlugin.getWorkspace().getRoot();

-

-	@SuppressWarnings("restriction")

-	public static IProject createFeatureProject(Collection<String> includedFeatureList, Collection<String> pluginList, String id, String name, final IProgressMonitor monitor) throws CoreException {

-

-		final IPluginBase[] pluginBase = getPluginBase(pluginList);

-		final FeatureData featureData = getFeatureData(id, name);

-		final IProject projectF = ROOT.getProject(featureData.id);

-

-		CreateFeatureProjectOperation operation = new MyCreateFeatureProjectOperation(projectF, ROOT.getLocation(), featureData, pluginBase, new ArrayList<String>(includedFeatureList));

-		try {

-			operation.run(monitor);

-		} catch (Exception e) {

-			throw new CoreException(new Status(IStatus.ERROR, Activator.getDefault().getPluginID(), e.getMessage(), e));

-		}

-

-		return projectF;

-	}

-

-	private static IPluginBase[] getPluginBase(Collection<String> pluginList) {

-		if (pluginList != null && pluginList.size() > 0) {

-			int size = pluginList.size();

-			IPluginBase[] result = new IPluginBase[size];

-			size = 0;

-			for (String id : pluginList) {

-				result[size++] = getPluginBase(id);

-			}

-			return result;

-		}

-		return null;

-

-	}

-

-	@SuppressWarnings("restriction")

-	private static IPluginBase getPluginBase(String pluginName) {

-		IProject project = ROOT.getProject(pluginName);

-		IFile manifestFile = project.getFile(METAFEST_PATH);

-		IFile pluginFile = project.getFile(PLUGIN_PATH);

-		WorkspaceBundlePluginModel model = new WorkspaceBundlePluginModel(manifestFile, pluginFile);

-		IPluginBase pluginBase = model.getPluginBase();

-		return pluginBase;

-	}

-

-	@SuppressWarnings("restriction")

-	private static FeatureData getFeatureData(String id, String name) {

-		FeatureData featureData = new FeatureData();

-		featureData.id = id + ".feature";

-		featureData.name = name + " Feature";

-		featureData.version = VERSION;

-		// featureData.provider = "THALESGROUP";

-		return featureData;

-	}

-

-	@SuppressWarnings("restriction")

-	private static class MyCreateFeatureProjectOperation extends CreateFeatureProjectOperation {

-

-		private List<String> includedFeatureList;

-

-		public MyCreateFeatureProjectOperation(IProject project, IPath location, FeatureData featureData, IPluginBase[] plugins, List<String> includedFeatureList) {

-			super(project, location, featureData, plugins, null);

-			this.includedFeatureList = includedFeatureList;

-		}

-

-		@Override

-		protected void configureFeature(IFeature feature, WorkspaceFeatureModel model) throws CoreException {

-			IFeaturePlugin[] added = new IFeaturePlugin[fPlugins.length];

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

-				IPluginBase plugin = fPlugins[i];

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

-				fplugin.loadFrom(plugin);

-				fplugin.setVersion("0.0.0"); //$NON-NLS-1$

-				fplugin.setUnpack(false);

-				added[i] = fplugin;

-			}

-			feature.addPlugins(added);

-			IFeatureChild[] features = new IFeatureChild[includedFeatureList.size()];

-			for (int i = 0; i < includedFeatureList.size(); i++) {

-				IFeatureChild child = model.getFactory().createChild();

-				child.setId(includedFeatureList.get(i));

-				child.setVersion("0.0.0");

-				features[i] = child;

-			}

-			feature.addIncludedFeatures(features);

-		}

-

-		protected void openFeatureEditor(IFile manifestFile) {

-			// we don't need such a feature

-		}

-

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

-			if (fProject.exists())

-				fProject.delete(true, monitor);

-			super.execute(monitor);

-		}

-

-		protected boolean shouldOverwriteFeature() {

-			return true;

-		}

-

-	}

-}

+package org.eclipse.egf.portfolio.genchain.tools.ui.actions;
+
+import java.lang.reflect.InvocationTargetException;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IWorkspaceRoot;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.egf.portfolio.genchain.tools.Activator;
+import org.eclipse.pde.core.plugin.IPluginBase;
+import org.eclipse.pde.internal.core.bundle.WorkspaceBundlePluginModel;
+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.IFeaturePlugin;
+import org.eclipse.pde.internal.core.project.PDEProject;
+import org.eclipse.pde.internal.ui.wizards.feature.CreateFeatureProjectOperation;
+import org.eclipse.pde.internal.ui.wizards.feature.FeatureData;
+
+public class FeatureHelper {
+	public static final String VERSION = "1.0.0.qualifier";
+	// private static final Shell SHELL =
+	// PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell();
+	private static final Path PLUGIN_PATH = new Path("/plugin.xml");
+	private static final Path METAFEST_PATH = new Path("/META-INF/MANIFEST.MF");
+	private static final IWorkspaceRoot ROOT = ResourcesPlugin.getWorkspace().getRoot();
+
+	@SuppressWarnings("restriction")
+	public static IProject createFeatureProject(Collection<String> includedFeatureList, Collection<String> pluginList, String id, String name, final IProgressMonitor monitor) throws CoreException {
+
+		final IPluginBase[] pluginBase = getPluginBase(pluginList);
+		final FeatureData featureData = getFeatureData(id, name);
+		final IProject projectF = ROOT.getProject(featureData.id);
+
+		CreateFeatureProjectOperation operation = new MyCreateFeatureProjectOperation(projectF, ROOT.getLocation(), featureData, pluginBase, new ArrayList<String>(includedFeatureList));
+		try {
+			operation.run(monitor);
+		} catch (Exception e) {
+			throw new CoreException(new Status(IStatus.ERROR, Activator.getDefault().getPluginID(), e.getMessage(), e));
+		}
+
+		return projectF;
+	}
+
+	private static IPluginBase[] getPluginBase(Collection<String> pluginList) {
+		if (pluginList != null && pluginList.size() > 0) {
+			int size = pluginList.size();
+			IPluginBase[] result = new IPluginBase[size];
+			size = 0;
+			for (String id : pluginList) {
+				result[size++] = getPluginBase(id);
+			}
+			return result;
+		}
+		return null;
+
+	}
+
+	@SuppressWarnings("restriction")
+	private static IPluginBase getPluginBase(String pluginName) {
+		IProject project = ROOT.getProject(pluginName);
+		IFile manifestFile = project.getFile(METAFEST_PATH);
+		IFile pluginFile = project.getFile(PLUGIN_PATH);
+		WorkspaceBundlePluginModel model = new WorkspaceBundlePluginModel(manifestFile, pluginFile);
+		IPluginBase pluginBase = model.getPluginBase();
+		return pluginBase;
+	}
+
+	@SuppressWarnings("restriction")
+	private static FeatureData getFeatureData(String id, String name) {
+		FeatureData featureData = new FeatureData();
+		featureData.id = id + ".feature";
+		featureData.name = name + " Feature";
+		// featureData.provider = "THALESGROUP";
+		final IProject fproject = ResourcesPlugin.getWorkspace().getRoot().getProject(id + ".feature");
+		featureData.version = getFeatureProjectVersion(fproject);
+		return featureData;
+	}
+	
+	@SuppressWarnings("restriction")
+	private static String getFeatureProjectVersion(IProject fproject){
+		String version = VERSION;
+		if (fproject.exists())
+		{
+			WorkspaceFeatureModel model = null;
+			try {
+				IFile file = PDEProject.getFeatureXml(fproject);
+				file.refreshLocal(IFile.DEPTH_ONE, new NullProgressMonitor());
+				model = new WorkspaceFeatureModel(file);
+				model.load();
+				IFeature feature = model.getFeature();
+				version = feature.getVersion();
+			} catch (Exception e) {
+				// Do nothing and return the default version
+			}
+			finally {
+				if (model!= null)
+				{
+					model.dispose();
+				}
+			}
+		}
+		
+		return version;
+	}
+
+	@SuppressWarnings("restriction")
+	private static class MyCreateFeatureProjectOperation extends CreateFeatureProjectOperation {
+
+		private List<String> includedFeatureList;
+
+		public MyCreateFeatureProjectOperation(IProject project, IPath location, FeatureData featureData, IPluginBase[] plugins, List<String> includedFeatureList) {
+			super(project, location, featureData, plugins, null);
+			this.includedFeatureList = includedFeatureList;
+		}
+
+		@Override
+		protected void configureFeature(IFeature feature, WorkspaceFeatureModel model) throws CoreException {
+			IFeaturePlugin[] added = new IFeaturePlugin[fPlugins.length];
+			for (int i = 0; i < fPlugins.length; i++) {
+				IPluginBase plugin = fPlugins[i];
+				FeaturePlugin fplugin = (FeaturePlugin) model.getFactory().createPlugin();
+				fplugin.loadFrom(plugin);
+				fplugin.setVersion("0.0.0"); //$NON-NLS-1$
+				fplugin.setUnpack(false);
+				added[i] = fplugin;
+			}
+			feature.addPlugins(added);
+			IFeatureChild[] features = new IFeatureChild[includedFeatureList.size()];
+			for (int i = 0; i < includedFeatureList.size(); i++) {
+				IFeatureChild child = model.getFactory().createChild();
+				child.setId(includedFeatureList.get(i));
+				child.setVersion("0.0.0");
+				features[i] = child;
+			}
+			feature.addIncludedFeatures(features);
+		}
+
+		protected void openFeatureEditor(IFile manifestFile) {
+			// we don't need such a feature
+		}
+
+		protected void execute(IProgressMonitor monitor) throws CoreException, InvocationTargetException, InterruptedException {
+			if (fProject.exists())
+				fProject.delete(true, monitor);
+			super.execute(monitor);
+		}
+
+		protected boolean shouldOverwriteFeature() {
+			return true;
+		}
+
+	}
+}