Revert "Revert "Bug 475440 - Investigate p2 related target editor performance issues ""

This reverts commit 91a82080432da3c529759df9c6e85ff6d139ae8e.
diff --git a/ui/org.eclipse.pde.core/src/org/eclipse/pde/internal/core/target/IUBundleContainer.java b/ui/org.eclipse.pde.core/src/org/eclipse/pde/internal/core/target/IUBundleContainer.java
index 795806e..cefc82c 100644
--- a/ui/org.eclipse.pde.core/src/org/eclipse/pde/internal/core/target/IUBundleContainer.java
+++ b/ui/org.eclipse.pde.core/src/org/eclipse/pde/internal/core/target/IUBundleContainer.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 IBM Corporation and others.
+ * Copyright (c) 2009, 2016 IBM Corporation and others.
  * 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
@@ -290,7 +290,12 @@
 		// query for bundles
 		IFileArtifactRepository artifacts = null;
 		try {
-			artifacts = P2TargetUtils.getBundlePool();
+			if (P2TargetUtils.fgTargetArtifactRepo.containsKey(target)) {
+				artifacts = P2TargetUtils.fgTargetArtifactRepo.get(target);
+			} else {
+				artifacts = P2TargetUtils.getBundlePool();
+				P2TargetUtils.fgTargetArtifactRepo.put(target, artifacts);
+			}
 		} catch (CoreException e) {
 			if (PDECore.DEBUG_TARGET_PROFILE) {
 				System.out.println("Bundle pool repository could not be loaded"); //$NON-NLS-1$
@@ -417,7 +422,20 @@
 	private void generateBundle(IInstallableUnit unit, IFileArtifactRepository repo, Map<BundleInfo, TargetBundle> bundles) throws CoreException {
 		Collection<IArtifactKey> artifacts = unit.getArtifacts();
 		for (Iterator<IArtifactKey> iterator2 = artifacts.iterator(); iterator2.hasNext();) {
-			File file = repo.getArtifactFile(iterator2.next());
+			IArtifactKey artifactKey = iterator2.next();
+			File file = null;
+			if (P2TargetUtils.fgArtifactKeyRepoFile.containsKey(artifactKey)) {
+				if (P2TargetUtils.fgArtifactKeyRepoFile.get(artifactKey).containsKey(repo))
+					file = P2TargetUtils.fgArtifactKeyRepoFile.get(artifactKey).get(repo);
+			}
+			if( file == null){
+				file = repo.getArtifactFile(artifactKey);
+				if (file != null) {
+					HashMap<IFileArtifactRepository, File> repoFile = new HashMap<>();
+					repoFile.put(repo, file);
+					P2TargetUtils.fgArtifactKeyRepoFile.put(artifactKey, repoFile);
+				}
+			}
 			if (file != null) {
 				TargetBundle bundle = new TargetBundle(file);
 				bundles.put(bundle.getBundleInfo(), bundle);
diff --git a/ui/org.eclipse.pde.core/src/org/eclipse/pde/internal/core/target/P2TargetUtils.java b/ui/org.eclipse.pde.core/src/org/eclipse/pde/internal/core/target/P2TargetUtils.java
index 52acf86..e05ea64 100644
--- a/ui/org.eclipse.pde.core/src/org/eclipse/pde/internal/core/target/P2TargetUtils.java
+++ b/ui/org.eclipse.pde.core/src/org/eclipse/pde/internal/core/target/P2TargetUtils.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2010, 2015 EclipseSource Inc. and others.
+ * Copyright (c) 2010, 2016 EclipseSource Inc. and others.
  * 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
@@ -112,6 +112,16 @@
 	private static Map<ITargetDefinition, P2TargetUtils> synchronizers = new HashMap<>();
 
 	/**
+	 * Table mapping of  ITargetDefinition and IFileArtifactRepository
+	 */
+	public static HashMap<ITargetDefinition, IFileArtifactRepository> fgTargetArtifactRepo = new HashMap<>();
+
+	/**
+	 * Table mapping IArtifactKey to table map of IFileArtifactRepository and IFileArtifactRepository
+	 */
+	public static HashMap<IArtifactKey, HashMap<IFileArtifactRepository, File>> fgArtifactKeyRepoFile = new HashMap<>();
+
+	/**
 	 * The profile to be synchronized
 	 */
 	private IProfile fProfile;
diff --git a/ui/org.eclipse.pde.core/src/org/eclipse/pde/internal/core/target/TargetDefinition.java b/ui/org.eclipse.pde.core/src/org/eclipse/pde/internal/core/target/TargetDefinition.java
index 87ba9c9..22454dd 100644
--- a/ui/org.eclipse.pde.core/src/org/eclipse/pde/internal/core/target/TargetDefinition.java
+++ b/ui/org.eclipse.pde.core/src/org/eclipse/pde/internal/core/target/TargetDefinition.java
@@ -241,6 +241,9 @@
 			MultiStatus status = new MultiStatus(PDECore.PLUGIN_ID, 0, Messages.TargetDefinition_2, null);
 			Set<P2TargetUtils> seen = new HashSet<>();
 			if (containers != null) {
+				// clear all previous maps
+				P2TargetUtils.fgTargetArtifactRepo.clear();
+				P2TargetUtils.fgArtifactKeyRepoFile.clear();
 				// Process synchronizers first, then perform resolves against the individual
 				// containers. A synchronizer may be shared among several containers, do we
 				// keep track of the synchronizers processed.