Fixed shared configuration

Signed-off-by: Alexander Dudaev <aleksandr.dudayev@xored.com>
Change-Id: I00398f29ab6339a6e5ef8eacab6cab5f91a1bf22
diff --git a/launching/org.eclipse.rcptt.launching.ext/src/org/eclipse/rcptt/launching/ext/Q7ExternalLaunchDelegate.java b/launching/org.eclipse.rcptt.launching.ext/src/org/eclipse/rcptt/launching/ext/Q7ExternalLaunchDelegate.java
index 33f2eb9..f9eafe3 100644
--- a/launching/org.eclipse.rcptt.launching.ext/src/org/eclipse/rcptt/launching/ext/Q7ExternalLaunchDelegate.java
+++ b/launching/org.eclipse.rcptt.launching.ext/src/org/eclipse/rcptt/launching/ext/Q7ExternalLaunchDelegate.java
@@ -61,6 +61,7 @@
 import org.eclipse.jdt.launching.IVMInstallType;
 import org.eclipse.jdt.launching.JavaRuntime;
 import org.eclipse.pde.core.plugin.IPluginModelBase;
+import org.eclipse.pde.core.target.ITargetDefinition;
 import org.eclipse.pde.core.target.ITargetLocation;
 import org.eclipse.pde.core.target.TargetBundle;
 import org.eclipse.pde.internal.build.IPDEBuildConstants;
@@ -605,7 +606,7 @@
 		CachedInfo info = LaunchInfoCache.getInfo(configuration);
 		ITargetPlatformHelper target = (ITargetPlatformHelper) info.target;
 
-		BundlesToLaunch bundlesToLaunch = collectBundlesCheck(target.getQ7Target(), subm.newChild(50), configuration);
+		BundlesToLaunch bundlesToLaunch = collectBundlesCheck(target.getQ7Target(), target.getTarget(), subm.newChild(50), configuration);
 
 		setBundlesToLaunch(info, bundlesToLaunch);
 
@@ -761,7 +762,7 @@
 
 	}
 
-	public static BundlesToLaunch collectBundlesCheck(Q7Target target, IProgressMonitor monitor,
+	public static BundlesToLaunch collectBundlesCheck(Q7Target target, ITargetDefinition targetDefinition, IProgressMonitor monitor,
 			ILaunchConfiguration configuration) {
 		if (target.getInstall() != null && isAutConfigSimpleconfiguratorSet(target)) {
 			final CachedInfo info = LaunchInfoCache.getInfo(configuration);
@@ -770,10 +771,10 @@
 			setBundlesLevels(target, levelMap);
 		}
 
-		return collectBundles(target, monitor);
+		return collectBundles(target, targetDefinition, monitor);
 	}
 
-	public static BundlesToLaunch collectBundles(Q7Target target, IProgressMonitor monitor) {
+	public static BundlesToLaunch collectBundles(Q7Target target, ITargetDefinition targetDefinition, IProgressMonitor monitor) {
 		BundlesToLaunchCollector collector = new BundlesToLaunchCollector();
 		SubMonitor subm = SubMonitor.convert(monitor, "Collecting bundles", 3000);
 		SubMonitor install = subm.newChild(1000);
@@ -792,28 +793,14 @@
 		}
 		install.done();
 
-		SubMonitor pluginsDirMonitor = subm.newChild(1000);
-		if (target.getPluginsDirs().size() > 0) {
-			for(ITargetLocation location : target.getPluginsDirs()) {
-				TargetBundle[] bundles = location.getBundles();
-				pluginsDirMonitor.beginTask("Scanning " + location, bundles.length);
-				for (TargetBundle bundle : bundles) {
-					collector.addPluginBundle(bundle);
-					pluginsDirMonitor.worked(1);
-				}
-			}
+		final SubMonitor plugins = subm.newChild(1000);
+		TargetBundle[] bundles = targetDefinition.getAllBundles();
+		for (TargetBundle bundle : bundles) {
+			collector.addPluginBundle(bundle);
+			plugins.worked(1);
 		}
-		pluginsDirMonitor.done();
+		plugins.done();
 
-		SubMonitor extrasMonitor = subm.newChild(1000);
-		extrasMonitor.beginTask("Injecting RCPTT runtime", 1);
-		for (ITargetLocation extra : target.getExtras()) {
-			for (TargetBundle bundle : extra.getBundles()) {
-				collector.addExtraBundle(bundle);
-			}
-			extrasMonitor.worked(1);
-		}
-		extrasMonitor.done();
 
 		return new BundlesToLaunch(collector.rejectedBundles,
 				collector.plugins, collector.latestVersions);
diff --git a/launching/org.eclipse.rcptt.launching.ext/src/org/eclipse/rcptt/launching/internal/target/Q7Target.java b/launching/org.eclipse.rcptt.launching.ext/src/org/eclipse/rcptt/launching/internal/target/Q7Target.java
index 1cc0b81..831f833 100644
--- a/launching/org.eclipse.rcptt.launching.ext/src/org/eclipse/rcptt/launching/internal/target/Q7Target.java
+++ b/launching/org.eclipse.rcptt.launching.ext/src/org/eclipse/rcptt/launching/internal/target/Q7Target.java
@@ -10,7 +10,6 @@
  *******************************************************************************/
 package org.eclipse.rcptt.launching.internal.target;
 
-import static com.google.common.collect.Iterables.filter;
 import static java.lang.String.format;
 import static org.eclipse.pde.internal.build.IPDEBuildConstants.BUNDLE_SIMPLE_CONFIGURATOR;
 import static org.eclipse.pde.internal.core.TargetPlatformHelper.getDefaultBundleList;
@@ -21,17 +20,12 @@
 
 import java.io.File;
 import java.net.URL;
-import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.LinkedHashMap;
-import java.util.List;
 import java.util.Map;
 
 import org.eclipse.core.runtime.CoreException;
 import org.eclipse.pde.core.target.ITargetLocation;
 import org.eclipse.pde.core.target.TargetBundle;
-import org.eclipse.pde.internal.core.target.DirectoryBundleContainer;
-import org.eclipse.pde.internal.core.target.IUBundleContainer;
 import org.eclipse.pde.internal.core.target.ProfileBundleContainer;
 import org.eclipse.rcptt.launching.ext.BundleStart;
 import org.eclipse.rcptt.launching.ext.OriginalOrderProperties;
@@ -75,58 +69,6 @@
 	}
 
 	/**
-	 * Plugins directory, may be <code>null</code>
-	 */
-	private List<ITargetLocation> pluginsDirs = new ArrayList<ITargetLocation>();
-	
-	public List<ITargetLocation> getPluginsDirs() {
-		return pluginsDirs;
-	}
-
-	public void addPluginsDir(ITargetLocation container) {
-		if (pluginsDirs.contains(container)) {
-			return;
-		}
-		if (container instanceof DirectoryBundleContainer) {
-			pluginsDirs.add(container);
-		}		
-	}
-	/**
-	 * Q7 Runtime, Q7 runtime dependencies, other injections
-	 */
-	private List<ITargetLocation> extras = new ArrayList<ITargetLocation>();
-
-	public void addExtra(ITargetLocation container) {
-		if (!contains(container)) {
-			extras.add(container);
-		}
-	}
-
-	public Iterable<ITargetLocation> getExtras() {
-		return extras;
-	}
-
-	private boolean contains(ITargetLocation container) {
-		if (extras.contains(container)) {
-			return true;
-		}
-
-		if (!(container instanceof IUBundleContainer)) {
-			return false;
-		}
-
-		IUBundleContainer cont = (IUBundleContainer) container;
-		for (IUBundleContainer existing : filter(extras,
-				IUBundleContainer.class)) {
-			if (Arrays.equals(existing.getRepositories(),
-					cont.getRepositories())) {
-				return true;
-			}
-		}
-		return false;
-	}
-
-	/**
 	 * Describes
 	 * 
 	 * @author ivaninozemtsev
diff --git a/launching/org.eclipse.rcptt.launching.ext/src/org/eclipse/rcptt/launching/internal/target/TargetPlatformHelper.java b/launching/org.eclipse.rcptt.launching.ext/src/org/eclipse/rcptt/launching/internal/target/TargetPlatformHelper.java
index 2d292fe..3cf4ec2 100644
--- a/launching/org.eclipse.rcptt.launching.ext/src/org/eclipse/rcptt/launching/internal/target/TargetPlatformHelper.java
+++ b/launching/org.eclipse.rcptt.launching.ext/src/org/eclipse/rcptt/launching/internal/target/TargetPlatformHelper.java
@@ -75,7 +75,6 @@
 import org.eclipse.pde.internal.core.PDECore;
 import org.eclipse.pde.internal.core.PDEExtensionRegistry;
 import org.eclipse.pde.internal.core.PDEState;
-import org.eclipse.pde.internal.core.target.DirectoryBundleContainer;
 import org.eclipse.pde.internal.core.target.IUBundleContainer;
 import org.eclipse.pde.internal.core.target.P2TargetUtils;
 import org.eclipse.pde.internal.core.target.ProfileBundleContainer;
@@ -302,16 +301,12 @@
 
 	private void initialize() {
 		extra.clear();
-		q7target = new Q7Target();
+        q7target = new Q7Target();
 		if (this.target != null && this.target.getTargetLocations() != null) {
 			ITargetLocation[] containers = this.target.getTargetLocations();
 			for (ITargetLocation iUBundleContainer : containers) {
 				if (iUBundleContainer instanceof ProfileBundleContainer) {
 					getQ7Target().setInstall(iUBundleContainer);
-				} else if (iUBundleContainer instanceof DirectoryBundleContainer) {
-					getQ7Target().addPluginsDir(iUBundleContainer);
-				} else {
-					getQ7Target().addExtra(iUBundleContainer);
 				}
 				extra.add(iUBundleContainer);
 			}
@@ -755,7 +750,6 @@
 		}
 		ITargetLocation container = PDEHelper.getTargetService()
 				.newDirectoryLocation(path);
-		q7target.addExtra(container);
 		extra.add(container);
 		return Status.OK_STATUS;
 	}
@@ -820,8 +814,6 @@
 								IUBundleContainer.INCLUDE_ALL_ENVIRONMENTS);
 
 				extra.add(container);
-				q7target.addExtra(container);
-
 			}
 
 			// Lets mirror all required artifacts into bundle pool, since we don't
@@ -1416,7 +1408,16 @@
 		// if the config or parent we are about to read is the same as the base config we read above,
 		// just reuse the base
 		OriginalOrderProperties configuration = baseConfiguration;
-		final URL configUrl = getConfigurationLocation(location, autInstall);
+		final URL configUrl = getConfigurationLocation(location, autInstall.getInstallLocation());
+
+		String configurationArea = configUrl.getFile();
+    	int index = configurationArea.lastIndexOf("/");
+    	if (index == configurationArea.length() - 1) {
+    		configurationArea = configurationArea.substring(0, index);
+			index = configurationArea.lastIndexOf("/");
+		}
+    	autInstall.userArea = configurationArea.substring(0, index + 1);
+
 		if (configuration == null || !configUrl.equals(baseConfigurationLocation))
 			configuration = loadConfiguration(configUrl);
 
@@ -1541,10 +1542,11 @@
 		return buf.toString();
 	}
 	
-	private static URL getConfigurationLocation(String configurationArea, AutInstall autInstall) {
-		URL configurationLocation = buildLocation(configurationArea, null, "", autInstall.getInstallLocation().getAbsolutePath()); //$NON-NLS-1$
+	private static URL getConfigurationLocation(String configurationArea, File installLocation) {
+		URL configurationLocation = buildLocation(configurationArea, null, "", installLocation.getAbsolutePath()); //$NON-NLS-1$
 		if (configurationLocation == null)
-			configurationLocation = buildURL(computeDefaultConfigurationLocation(autInstall), true, autInstall.getInstallLocation().getAbsolutePath());
+			configurationLocation = buildURL(computeDefaultConfigurationLocation(installLocation), true, installLocation.getAbsolutePath());
+
 		return configurationLocation;
 	}
 
@@ -1627,7 +1629,7 @@
 		return new URL(url.getProtocol(), url.getHost(), file);
 	}
 
-	private static String computeDefaultConfigurationLocation(AutInstall autInstall) {
+	private static String computeDefaultConfigurationLocation(File installLocation) {
 		// 1) We store the config state relative to the 'eclipse' directory if possible
 		// 2) If this directory is read-only 
 		//    we store the state in <user.home>/.eclipse/<application-id>_<version> where <user.home> 
@@ -1635,13 +1637,14 @@
 		//    defined in .eclipseproduct marker file. If .eclipseproduct does not
 		//    exist, use "eclipse" as the application-id.
 
-		if (canWrite(autInstall.getInstallLocation()))
-			autInstall.userArea = autInstall.getInstallLocation().getAbsolutePath();
+		String configurationLocation = null; 
+		if (canWrite(installLocation))
+			configurationLocation = installLocation.getAbsolutePath();
 		else 
 		// We can't write in the eclipse install dir so try for some place in the user's home dir
-			autInstall.userArea = computeDefaultUserAreaLocation(autInstall.getInstallLocation());
+			configurationLocation = computeDefaultUserAreaLocation(installLocation);
 		
-		return autInstall.userArea + File.separator + CONFIG_DIR;
+		return configurationLocation + File.separator + CONFIG_DIR;
 	}
 
 	private static boolean canWrite(File installDir) {
diff --git a/launching/org.eclipse.rcptt.launching.ext/src/org/eclipse/rcptt/launching/target/ITargetPlatformHelper.java b/launching/org.eclipse.rcptt.launching.ext/src/org/eclipse/rcptt/launching/target/ITargetPlatformHelper.java
index e295247..1e51012 100644
--- a/launching/org.eclipse.rcptt.launching.ext/src/org/eclipse/rcptt/launching/target/ITargetPlatformHelper.java
+++ b/launching/org.eclipse.rcptt.launching.ext/src/org/eclipse/rcptt/launching/target/ITargetPlatformHelper.java
@@ -17,11 +17,11 @@
 import org.eclipse.core.runtime.IStatus;
 import org.eclipse.equinox.p2.metadata.Version;
 import org.eclipse.pde.core.plugin.IPluginModelBase;
+import org.eclipse.pde.core.target.ITargetDefinition;
 import org.eclipse.rcptt.internal.launching.ext.OSArchitecture;
 import org.eclipse.rcptt.launching.ext.OriginalOrderProperties;
 import org.eclipse.rcptt.launching.injection.InjectionConfiguration;
 import org.eclipse.rcptt.launching.internal.target.Q7Target;
-import org.eclipse.rcptt.launching.internal.target.Q7Target.AutInstall;
 
 /**
  * Class designed to access target platform features to configure it via easy
@@ -144,6 +144,8 @@
 	public abstract IPluginModelBase getWeavingHook();
 
 	IStatus getStatus();
-	
+
+	public ITargetDefinition getTarget();
+
 	Map<String, Version> getVersions() throws CoreException;
 }
diff --git a/launching/org.eclipse.rcptt.launching.ext/src/org/eclipse/rcptt/launching/target/TargetPlatformManager.java b/launching/org.eclipse.rcptt.launching.ext/src/org/eclipse/rcptt/launching/target/TargetPlatformManager.java
index 4cd91c9..11a4f46 100644
--- a/launching/org.eclipse.rcptt.launching.ext/src/org/eclipse/rcptt/launching/target/TargetPlatformManager.java
+++ b/launching/org.eclipse.rcptt.launching.ext/src/org/eclipse/rcptt/launching/target/TargetPlatformManager.java
@@ -63,26 +63,32 @@
 		final ITargetDefinition target = service.newTarget();
 		final TargetPlatformHelper info = new TargetPlatformHelper(target);
 		try {
+			final List<ITargetLocation> containers = new ArrayList<ITargetLocation>();
+
 			final File productDir = PDELocationUtils.getProductLocation(location);
-			List<ITargetLocation> containers = new ArrayList<ITargetLocation>();
-			ITargetLocation installationContainer = service
+			final ITargetLocation installationContainer = service
 					.newProfileLocation(productDir.getAbsolutePath(), null);
 			info.getQ7Target().setInstall(installationContainer);
 			containers.add(installationContainer);
 
 			final File pluginsDir = PDELocationUtils.getPluginFolder(location);
-			ITargetLocation pluginsContainer = service
+			final ITargetLocation pluginsContainer = service
 					.newDirectoryLocation(pluginsDir.getAbsolutePath());
 			containers.add(pluginsContainer);
-			info.getQ7Target().addPluginsDir(pluginsContainer);
 
 			final String localLocation = info.getUserArea();
 			if (localLocation != null) {
+				/*
+				final File localProductDir = PDELocationUtils.getProductLocation(location);
+				final ITargetLocation localInstallationContainer = service
+						.newProfileLocation(localProductDir.getAbsolutePath(), null);
+				containers.add(localInstallationContainer);
+				*/
+
 				final File localPluginsDir = PDELocationUtils.getPluginFolder(localLocation);
 				final ITargetLocation localPluginsContainer = service
 						.newDirectoryLocation(localPluginsDir.getAbsolutePath());
 				containers.add(localPluginsContainer);
-				info.getQ7Target().addPluginsDir(localPluginsContainer);
 			}
 
 			info.setBundleContainers(containers
diff --git a/modules/rap/bundles/launching/org.eclipse.rcptt.launching.rap/src/org/eclipse/rcptt/launching/rap/RcpttRapLaunchDelegate.java b/modules/rap/bundles/launching/org.eclipse.rcptt.launching.rap/src/org/eclipse/rcptt/launching/rap/RcpttRapLaunchDelegate.java
index e53fe91..3bbd850 100644
--- a/modules/rap/bundles/launching/org.eclipse.rcptt.launching.rap/src/org/eclipse/rcptt/launching/rap/RcpttRapLaunchDelegate.java
+++ b/modules/rap/bundles/launching/org.eclipse.rcptt.launching.rap/src/org/eclipse/rcptt/launching/rap/RcpttRapLaunchDelegate.java
@@ -220,7 +220,7 @@
 		ITargetPlatformHelper target = (ITargetPlatformHelper) info.target;
 
 		BundlesToLaunch bundlesToLaunch = Q7ExternalLaunchDelegate.collectBundlesCheck(target.getQ7Target(),
-				subm.newChild(50), configuration);
+				target.getTarget(), subm.newChild(50), configuration);
 
 		Q7ExternalLaunchDelegate.setBundlesToLaunch(info, bundlesToLaunch);
 
diff --git a/rcp/org.eclipse.rcptt.launching.configuration/src/org/eclipse/rcptt/launching/configuration/Q7LaunchConfigurationDelegate.java b/rcp/org.eclipse.rcptt.launching.configuration/src/org/eclipse/rcptt/launching/configuration/Q7LaunchConfigurationDelegate.java
index e0e20ce..e8cc427 100644
--- a/rcp/org.eclipse.rcptt.launching.configuration/src/org/eclipse/rcptt/launching/configuration/Q7LaunchConfigurationDelegate.java
+++ b/rcp/org.eclipse.rcptt.launching.configuration/src/org/eclipse/rcptt/launching/configuration/Q7LaunchConfigurationDelegate.java
@@ -253,7 +253,7 @@
 			collector.addInstallationBundle(entry.getKey(),
 					BundleStart.fromModelString(entry.getValue()));
 		}
-		for (ITargetLocation extra : target.getQ7Target().getExtras()) {
+		for (ITargetLocation extra : target.getTarget().getTargetLocations()) {
 			if (!Q7ExternalLaunchDelegate.isQ7BundleContainer(extra)) {
 				continue;
 			}