debug tests
diff --git a/org.eclipse.ajdt.core/src/org/eclipse/ajdt/core/AspectJCorePreferences.java b/org.eclipse.ajdt.core/src/org/eclipse/ajdt/core/AspectJCorePreferences.java
index 3d5730a..992502f 100755
--- a/org.eclipse.ajdt.core/src/org/eclipse/ajdt/core/AspectJCorePreferences.java
+++ b/org.eclipse.ajdt.core/src/org/eclipse/ajdt/core/AspectJCorePreferences.java
@@ -43,38 +43,36 @@
  * names have been kept for compatibility.
  */
 public class AspectJCorePreferences {
-			
-    public static final String OPTION_IncrementalCompilationOptimizations = "org.eclipse.ajdt.core.builder.incrementalCompilationOptimizations"; //$NON-NLS-1$
 
-    
+	public static final String OPTION_IncrementalCompilationOptimizations = "org.eclipse.ajdt.core.builder.incrementalCompilationOptimizations"; //$NON-NLS-1$
+
 	public static final String ASPECTPATH_ATTRIBUTE_NAME = "org.eclipse.ajdt.aspectpath"; //$NON-NLS-1$
 	public static final String INPATH_ATTRIBUTE_NAME = "org.eclipse.ajdt.inpath"; //$NON-NLS-1$
-	
-	// see ajdt.ui's plugin.xml and the org.eclipse.jdt.ui.classpathAttributeConfiguration extension point
+
+	// see ajdt.ui's plugin.xml and the
+	// org.eclipse.jdt.ui.classpathAttributeConfiguration extension point
 	public static final String INPATH_RESTRICTION_ATTRIBUTE_NAME = "org.eclipse.ajdt.inpath.restriction"; //$NON-NLS-1$
 	public static final String ASPECTPATH_RESTRICTION_ATTRIBUTE_NAME = "org.eclipse.ajdt.aspectpath.restriction"; //$NON-NLS-1$
 
+	/**
+	 * The value may be filled in with the container that contains this
+	 * classpath entry So when checking to see if a classpath entry has this
+	 * attribute, use {@link #isOnAspectpath(IClasspathEntry)}
+	 */
+	public static final IClasspathAttribute ASPECTPATH_ATTRIBUTE = JavaCore
+			.newClasspathAttribute(ASPECTPATH_ATTRIBUTE_NAME, ASPECTPATH_ATTRIBUTE_NAME); // $NON-NLS-1$
 
 	/**
-	 *  The value may be filled in with the container that contains this classpath entry
-	 *  So when checking to see if a classpath entry has this attribute, use {@link #isOnAspectpath(IClasspathEntry)} 
+	 * The value may be filled in with the container that contains this
+	 * classpath entry So when checking to see if a classpath entry has this
+	 * attribute, use {@link #isOnInpath(IClasspathEntry)}
 	 */
-	public static final IClasspathAttribute ASPECTPATH_ATTRIBUTE = JavaCore.newClasspathAttribute(
-			ASPECTPATH_ATTRIBUTE_NAME, ASPECTPATH_ATTRIBUTE_NAME); //$NON-NLS-1$
+	public static final IClasspathAttribute INPATH_ATTRIBUTE = JavaCore.newClasspathAttribute(INPATH_ATTRIBUTE_NAME,
+			INPATH_ATTRIBUTE_NAME); // $NON-NLS-1$
 
-	/**
-	 *  The value may be filled in with the container that contains this classpath entry
-	 *  So when checking to see if a classpath entry has this attribute, use {@link #isOnInpath(IClasspathEntry)} 
-	 */
-	public static final IClasspathAttribute INPATH_ATTRIBUTE = JavaCore.newClasspathAttribute(
-			INPATH_ATTRIBUTE_NAME, INPATH_ATTRIBUTE_NAME); //$NON-NLS-1$
+	public static final String OUT_JAR = "org.eclipse.ajdt.ui.outJar"; //$NON-NLS-1$
 
-	
-	
-	
-    public static final String OUT_JAR = "org.eclipse.ajdt.ui.outJar"; //$NON-NLS-1$
-
-    public static final String INPATH_OUT_FOLDER = "org.eclipse.ajdt.ui.inpathOutFolder"; //$NON-NLS-1$
+	public static final String INPATH_OUT_FOLDER = "org.eclipse.ajdt.ui.inpathOutFolder"; //$NON-NLS-1$
 
 	public static final String ASPECTPATH = "org.eclipse.ajdt.ui.aspectPath"; //$NON-NLS-1$
 
@@ -89,141 +87,133 @@
 	public static final String INPATH_ENT_KINDS = "org.eclipse.ajdt.ui.inPath.entryKind"; //$NON-NLS-1$
 
 	public static String getProjectOutJar(IProject project) {
-        IScopeContext projectScope = new ProjectScope(project);
-        IEclipsePreferences projectNode = projectScope
-                .getNode(AspectJPlugin.UI_PLUGIN_ID);
-        return projectNode.get(OUT_JAR, ""); //$NON-NLS-1$
-    }
+		IScopeContext projectScope = new ProjectScope(project);
+		IEclipsePreferences projectNode = projectScope.getNode(AspectJPlugin.UI_PLUGIN_ID);
+		return projectNode.get(OUT_JAR, ""); //$NON-NLS-1$
+	}
 
-    public static String getProjectInpathOutFolder(IProject project) {
-        IScopeContext projectScope = new ProjectScope(project);
-        IEclipsePreferences projectNode = projectScope
-                .getNode(AspectJPlugin.UI_PLUGIN_ID);
-        return projectNode.get(INPATH_OUT_FOLDER, null);
-    }
+	public static String getProjectInpathOutFolder(IProject project) {
+		IScopeContext projectScope = new ProjectScope(project);
+		IEclipsePreferences projectNode = projectScope.getNode(AspectJPlugin.UI_PLUGIN_ID);
+		return projectNode.get(INPATH_OUT_FOLDER, null);
+	}
 
-    public static void setProjectOutJar(IProject project, String value) {
-        IScopeContext projectScope = new ProjectScope(project);
-        IEclipsePreferences projectNode = projectScope
-                .getNode(AspectJPlugin.UI_PLUGIN_ID);
-        projectNode.put(OUT_JAR, value);
-        if (value.length() == 0) {
-            projectNode.remove(OUT_JAR);
-        }
-        try {
-            projectNode.flush();
-        } catch (BackingStoreException e) {
-        }
-    }
+	public static void setProjectOutJar(IProject project, String value) {
+		IScopeContext projectScope = new ProjectScope(project);
+		IEclipsePreferences projectNode = projectScope.getNode(AspectJPlugin.UI_PLUGIN_ID);
+		projectNode.put(OUT_JAR, value);
+		if (value.length() == 0) {
+			projectNode.remove(OUT_JAR);
+		}
+		try {
+			projectNode.flush();
+		} catch (BackingStoreException e) {
+		}
+	}
 
-    public static void setProjectInpathOutFolder(IProject project, String value) {
-        IScopeContext projectScope = new ProjectScope(project);
-        IEclipsePreferences projectNode = projectScope
-                .getNode(AspectJPlugin.UI_PLUGIN_ID);
-        if (value == null || value.length() == 0) {
-            projectNode.remove(INPATH_OUT_FOLDER);
-        } else {
-            projectNode.put(INPATH_OUT_FOLDER, value);
-        }
-        try {
-            projectNode.flush();
-        } catch (BackingStoreException e) {
-        }
-    }
+	public static void setProjectInpathOutFolder(IProject project, String value) {
+		IScopeContext projectScope = new ProjectScope(project);
+		IEclipsePreferences projectNode = projectScope.getNode(AspectJPlugin.UI_PLUGIN_ID);
+		if (value == null || value.length() == 0) {
+			projectNode.remove(INPATH_OUT_FOLDER);
+		} else {
+			projectNode.put(INPATH_OUT_FOLDER, value);
+		}
+		try {
+			projectNode.flush();
+		} catch (BackingStoreException e) {
+		}
+	}
 
-    public static void setProjectAspectPath(IProject project, String path,
-            String cKinds, String eKinds) {
-        setProjectPath(project, path, cKinds, eKinds, ASPECTPATH_ATTRIBUTE);
-    }
-    public static String[] getRawProjectAspectPath(IProject project) {
-        return internalGetProjectPath(project, ASPECTPATH_ATTRIBUTE, false);
-    }
-    
-    public static String[] getResolvedProjectAspectPath(IProject project) {
-        return internalGetProjectPath(project, ASPECTPATH_ATTRIBUTE, true);
-    }
-    
+	public static void setProjectAspectPath(IProject project, String path, String cKinds, String eKinds) {
+		setProjectPath(project, path, cKinds, eKinds, ASPECTPATH_ATTRIBUTE);
+	}
+
+	public static String[] getRawProjectAspectPath(IProject project) {
+		return internalGetProjectPath(project, ASPECTPATH_ATTRIBUTE, false);
+	}
+
+	public static String[] getResolvedProjectAspectPath(IProject project) {
+		return internalGetProjectPath(project, ASPECTPATH_ATTRIBUTE, true);
+	}
 
 	public static void addToAspectPath(IProject project, IClasspathEntry entry) {
 		IJavaProject jp = JavaCore.create(project);
-		addAttribute(jp,entry,AspectJCorePreferences.ASPECTPATH_ATTRIBUTE);
+		addAttribute(jp, entry, AspectJCorePreferences.ASPECTPATH_ATTRIBUTE);
 	}
 
 	public static void removeFromAspectPath(IProject project, IClasspathEntry entry) {
 		IJavaProject jp = JavaCore.create(project);
-		removeAttribute(jp,entry,AspectJCorePreferences.ASPECTPATH_ATTRIBUTE);
+		removeAttribute(jp, entry, AspectJCorePreferences.ASPECTPATH_ATTRIBUTE);
 	}
-	
-   public static void addToAspectPath(IProject project, String jarPath, int eKind) {
-       addAttribute(project, jarPath, eKind, ASPECTPATH_ATTRIBUTE);
-   }
 
+	public static void addToAspectPath(IProject project, String jarPath, int eKind) {
+		addAttribute(project, jarPath, eKind, ASPECTPATH_ATTRIBUTE);
+	}
 
 	public static boolean isOnAspectpath(IClasspathEntry entry) {
 		IClasspathAttribute[] attributes = entry.getExtraAttributes();
 		for (int j = 0; j < attributes.length; j++) {
 			if (isAspectPathAttribute(attributes[j])) {
-				return true;								
+				return true;
 			}
 		}
 		return false;
 	}
-	
+
 	public static boolean isAspectPathAttribute(IClasspathAttribute attribute) {
 		return attribute.getName().equals(AspectJCorePreferences.ASPECTPATH_ATTRIBUTE.getName());
 	}
 
-    /**
-     * determines if an element is on the aspect path taking into account
-     * the restrictions of the classpath container entry
-     */
-    public static boolean isOnAspectpathWithRestrictions(IClasspathEntry entry, String item) {
-        if (!isOnAspectpath(entry)) {
-            return false;
-        }
-        
-        Set<String> restrictions = findContainerRestrictions(entry, true);
-        if (restrictions == null) {
-            // no restrictions, assume the jar entry is on the path
-            return true;
-        } else {
-            for (String restriction : restrictions) {
-                if (item.indexOf(restriction) != -1) {
-                    return true;
-                }
-            }
-            return false;
-        }
-    }
-    
-    /**
-     * determines if an element is on the aspect path taking into account
-     * the restrictions of the classpath container entry
-     */
-    public static boolean isOnInpathWithRestrictions(IClasspathEntry entry, String item) {
-        if (!isOnInpath(entry)) {
-            return false;
-        }
-        
-        Set<String> restrictions = findContainerRestrictions(entry, false);
-        if (restrictions == null || restrictions.isEmpty()) {
-            // no restrictions, assume the jar entry is on the path
-            return true;
-        } else {
-            for (String restriction : restrictions) {
-                if (item.indexOf(restriction) != -1) {
-                    return true;
-                }
-            }
-            return false;
-        }
-    }
-    
-	
-	
-    /**
-     * Checks to see if an entry is already on the aspect path
-     */
+	/**
+	 * determines if an element is on the aspect path taking into account the
+	 * restrictions of the classpath container entry
+	 */
+	public static boolean isOnAspectpathWithRestrictions(IClasspathEntry entry, String item) {
+		if (!isOnAspectpath(entry)) {
+			return false;
+		}
+
+		Set<String> restrictions = findContainerRestrictions(entry, true);
+		if (restrictions == null) {
+			// no restrictions, assume the jar entry is on the path
+			return true;
+		} else {
+			for (String restriction : restrictions) {
+				if (item.indexOf(restriction) != -1) {
+					return true;
+				}
+			}
+			return false;
+		}
+	}
+
+	/**
+	 * determines if an element is on the aspect path taking into account the
+	 * restrictions of the classpath container entry
+	 */
+	public static boolean isOnInpathWithRestrictions(IClasspathEntry entry, String item) {
+		if (!isOnInpath(entry)) {
+			return false;
+		}
+
+		Set<String> restrictions = findContainerRestrictions(entry, false);
+		if (restrictions == null || restrictions.isEmpty()) {
+			// no restrictions, assume the jar entry is on the path
+			return true;
+		} else {
+			for (String restriction : restrictions) {
+				if (item.indexOf(restriction) != -1) {
+					return true;
+				}
+			}
+			return false;
+		}
+	}
+
+	/**
+	 * Checks to see if an entry is already on the aspect path
+	 */
 	public static boolean isOnAspectpath(IProject project, String path) {
 		IJavaProject jp = JavaCore.create(project);
 		try {
@@ -235,13 +225,12 @@
 						|| (cp[i].getEntryKind() == IClasspathEntry.CPE_PROJECT)) {
 					IClasspathEntry resolvedClasspathEntry = JavaCore.getResolvedClasspathEntry(cp[i]);
 					if (resolvedClasspathEntry != null) {
-                        String entry = resolvedClasspathEntry
-    							.getPath().toPortableString();
-    					if (entry.equals(path)) {
-    						if (isOnAspectpath(cp[i])) {
-    							return true;
-    						}
-    					}
+						String entry = resolvedClasspathEntry.getPath().toPortableString();
+						if (entry.equals(path)) {
+							if (isOnAspectpath(cp[i])) {
+								return true;
+							}
+						}
 					}
 				}
 			}
@@ -251,215 +240,219 @@
 	}
 
 	public static String[] getRawProjectInpath(IProject project) {
-        return internalGetProjectPath(project, INPATH_ATTRIBUTE, false);
-    }
+		return internalGetProjectPath(project, INPATH_ATTRIBUTE, false);
+	}
 
-    public static String[] getResolvedProjectInpath(IProject project) {
-        return internalGetProjectPath(project, INPATH_ATTRIBUTE, true);
-    }
+	public static String[] getResolvedProjectInpath(IProject project) {
+		return internalGetProjectPath(project, INPATH_ATTRIBUTE, true);
+	}
 
-    public static List<IClasspathEntry> resolveDependentProjectClasspath(IClasspathEntry projEntry, IProject requiredProj) {
-        // add all output locations and exported classpath entities
-        // AspectJ compiler doesn't understand the concept of a java project
-        List<IClasspathEntry> actualEntries = new ArrayList<IClasspathEntry>();
-        
+	public static List<IClasspathEntry> resolveDependentProjectClasspath(IClasspathEntry projEntry,
+			IProject requiredProj) {
+		// add all output locations and exported classpath entities
+		// AspectJ compiler doesn't understand the concept of a java project
+		List<IClasspathEntry> actualEntries = new ArrayList<IClasspathEntry>();
 
-        try {
-            JavaProject requiredJavaProj = (JavaProject) JavaCore.create(requiredProj);
-            // bug 288395 Do not use the default mechanism for resolving classpath here
-            // this will look into jar files at the Classpath header in the jar's manifest
-            // and include jar files that are potentially missing, but have no effect on
-            // the build.
-            Object resolvedClasspath = requiredJavaProj.resolveClasspath(requiredJavaProj.getRawClasspath(), true, false);
-            IClasspathEntry[] requiredEntries = extractRequiredEntries(resolvedClasspath);
-            for (int i = 0; i < requiredEntries.length; i++) {
-                IClasspathEntry requiredEntry = requiredEntries[i];
-                if (requiredEntry.getEntryKind() == IClasspathEntry.CPE_SOURCE) {
+		try {
+			JavaProject requiredJavaProj = (JavaProject) JavaCore.create(requiredProj);
+			// bug 288395 Do not use the default mechanism for resolving
+			// classpath here
+			// this will look into jar files at the Classpath header in the
+			// jar's manifest
+			// and include jar files that are potentially missing, but have no
+			// effect on
+			// the build.
+			Object resolvedClasspath = requiredJavaProj.resolveClasspath(requiredJavaProj.getRawClasspath(), true,
+					false);
+			IClasspathEntry[] requiredEntries = extractRequiredEntries(resolvedClasspath);
+			for (int i = 0; i < requiredEntries.length; i++) {
+				IClasspathEntry requiredEntry = requiredEntries[i];
+				if (requiredEntry.getEntryKind() == IClasspathEntry.CPE_SOURCE) {
 
-                    // always add source entries even if not explicitly exported
-                    // don't add the source folder itself, but instead add the outfolder
-                    IPath outputLocation = requiredEntry.getOutputLocation();
-                    if (outputLocation != null) {
-            	        IAccessRule[] rules = projEntry.getAccessRules();
-                	    IClasspathAttribute[] attributes = projEntry.getExtraAttributes();
+					// always add source entries even if not explicitly exported
+					// don't add the source folder itself, but instead add the
+					// outfolder
+					IPath outputLocation = requiredEntry.getOutputLocation();
+					if (outputLocation != null) {
+						IAccessRule[] rules = projEntry.getAccessRules();
+						IClasspathAttribute[] attributes = projEntry.getExtraAttributes();
 
-                	    // only add the out folder if it already exists
-                	    if (requiredProj.getFolder(outputLocation.removeFirstSegments(1)).exists()) {
-                            IClasspathEntry outFolder = JavaCore.newLibraryEntry(outputLocation,
-                                    requiredEntry.getPath(),
-                                    requiredProj.getFullPath(), rules, attributes, projEntry.isExported());
-                            actualEntries.add(outFolder);
-                	    }
-                    }
-                } else if (requiredEntry.isExported()) {
-                    // must recur through this entry and add entries that it contains
-                    actualEntries.addAll(resolveClasspath(requiredEntry, requiredProj));
-                    
-                }
-            } // for (int i = 0; i < requiredEntries.length; i++)
-            
-            IPath outputLocation = requiredJavaProj.getOutputLocation();
-            // Output location may not exist.  Do not put output location of required project
-            // on path unless it exists
-            boolean exists = false;
-            // bug 244330 check to see if the project folder is also the output folder
-            if (outputLocation.segmentCount() == 1) {
-            	exists = true;
-            } else {
-            	if (requiredProj.getWorkspace().getRoot().getFolder(outputLocation).exists()) {
-            		exists = true;
-            	}
-            }
-            
-            if (exists) {
-                IClasspathEntry outFolder = JavaCore.newLibraryEntry(outputLocation,
-                                                                     null,
-                                                                     requiredProj.getFullPath());					                
-                actualEntries.add(outFolder);
-            }
-        } catch (JavaModelException e) {
-        }
-        return actualEntries;
-    }
+						// only add the out folder if it already exists
+						if (requiredProj.getFolder(outputLocation.removeFirstSegments(1)).exists()) {
+							IClasspathEntry outFolder = JavaCore.newLibraryEntry(outputLocation,
+									requiredEntry.getPath(), requiredProj.getFullPath(), rules, attributes,
+									projEntry.isExported());
+							actualEntries.add(outFolder);
+						}
+					}
+				} else if (requiredEntry.isExported()) {
+					// must recur through this entry and add entries that it
+					// contains
+					actualEntries.addAll(resolveClasspath(requiredEntry, requiredProj));
 
-    
-    /**
-     * resolvedClasspath is a package protected static class inside JavaProject
-     * must use reflection to access it 
-     */
-    @SuppressWarnings({ "unchecked" })
-    private static IClasspathEntry[] extractRequiredEntries(
-            Object resolvedClasspath) {
-        
-        try {
-            Class resolvedClasspathClass = Class.forName("org.eclipse.jdt.internal.core.JavaProject$ResolvedClasspath");
-            return (IClasspathEntry[]) ReflectionUtils.getPrivateField(resolvedClasspathClass, "resolvedClasspath", resolvedClasspath);
-        } catch (Exception e) {
-            return new IClasspathEntry[0];
-        }
-    }
+				}
+			} // for (int i = 0; i < requiredEntries.length; i++)
 
-    public static List<IClasspathEntry> resolveClasspathContainer(IClasspathEntry classpathContainerEntry, IProject thisProject) 
-            throws JavaModelException {
-        IJavaProject thisJavaProject = JavaCore.create(thisProject);
-        IClasspathContainer container = 
-            JavaCore.getClasspathContainer(classpathContainerEntry.getPath(), thisJavaProject);
-        if (container != null) {
-            List<IClasspathEntry> actualEntries = new ArrayList<IClasspathEntry>();
-            IClasspathEntry[] containerEntries = container.getClasspathEntries();
-            for (int i = 0; i < containerEntries.length; i++) {
-                // projects must be resolved specially since the AspectJ doesn't understand the 
-                // concept of project
-                switch (containerEntries[i].getEntryKind()) {
-                    case IClasspathEntry.CPE_PROJECT:
-                        IProject requiredProj = thisProject.getWorkspace().getRoot().getProject(
-                                containerEntries[i].getPath().makeRelative().toPortableString());
-                        if (! requiredProj.getName().equals(thisProject.getName())   
-                                && requiredProj.exists()) {
-                            actualEntries.addAll(resolveDependentProjectClasspath(containerEntries[i], requiredProj));
-                        }
-                        break;
+			IPath outputLocation = requiredJavaProj.getOutputLocation();
+			// Output location may not exist. Do not put output location of
+			// required project
+			// on path unless it exists
+			boolean exists = false;
+			// bug 244330 check to see if the project folder is also the output
+			// folder
+			if (outputLocation.segmentCount() == 1) {
+				exists = true;
+			} else {
+				if (requiredProj.getWorkspace().getRoot().getFolder(outputLocation).exists()) {
+					exists = true;
+				}
+			}
 
-                    case IClasspathEntry.CPE_VARIABLE:
-                        IClasspathEntry resolvedClasspathEntry = JavaCore.getResolvedClasspathEntry(
-                                containerEntries[i]);
-                        if (resolvedClasspathEntry != null) {
-                            actualEntries.add(
-                                    resolvedClasspathEntry);
-                        }
-                        break;
-                        
-                    case IClasspathEntry.CPE_CONTAINER:
-                        // not sure if we can have this, but try anyway
-                        actualEntries.addAll(resolveClasspathContainer(containerEntries[i], thisProject));
-                        break;
-                    case IClasspathEntry.CPE_LIBRARY:
-                        actualEntries.add(containerEntries[i]);
-                        break;
-                    default:
-                        // do nothing
-                }
-            }
-            return actualEntries;
-        } else {
-            return Collections.emptyList();
-        }
-    }
-    
-    /**
-     * Resolves a single classpath entry
-     * @param entry the classpath entry to resolve
-     * @param thisProject the java project that has this entry
-     * @return the resolved list of classpath entries
-     * @throws JavaModelException 
-     */
-    public static List<IClasspathEntry> resolveClasspath(IClasspathEntry entry, IProject thisProject) throws JavaModelException {
-        switch(entry.getEntryKind()) {
-            case IClasspathEntry.CPE_CONTAINER:
-                return resolveClasspathContainer(entry, thisProject);
-                
-            case IClasspathEntry.CPE_LIBRARY:
-                return Collections.singletonList(entry);
-                
-            case IClasspathEntry.CPE_PROJECT:
-                IProject containedProj = thisProject.getWorkspace().getRoot().getProject(
-                        entry.getPath().makeRelative().toPortableString());
-                if (! containedProj.getName().equals(thisProject.getName())   
-                        && containedProj.exists()) {
-                    return resolveDependentProjectClasspath(entry, containedProj);
-                } else {
-                    return Collections.emptyList();
-                }
-                    
-            case IClasspathEntry.CPE_VARIABLE:
-                IClasspathEntry resolvedClasspathEntry = JavaCore.getResolvedClasspathEntry(entry);
-                if (resolvedClasspathEntry != null) {
-                    return Collections.singletonList(resolvedClasspathEntry);
-                } else {
-                    return Collections.emptyList();
-                }
-            default:
-                return Collections.emptyList();
-        }
-    }
+			if (exists) {
+				IClasspathEntry outFolder = JavaCore.newLibraryEntry(outputLocation, null, requiredProj.getFullPath());
+				actualEntries.add(outFolder);
+			}
+		} catch (JavaModelException e) {
+		}
+		return actualEntries;
+	}
 
-	public static void setProjectInPath(IProject project, String path,
-			String cKinds, String eKinds) {
-        setProjectPath(project, path, cKinds, eKinds, INPATH_ATTRIBUTE);
+	/**
+	 * resolvedClasspath is a package protected static class inside JavaProject
+	 * must use reflection to access it
+	 */
+	@SuppressWarnings({ "unchecked" })
+	private static IClasspathEntry[] extractRequiredEntries(Object resolvedClasspath) {
+
+		try {
+			Class resolvedClasspathClass = Class.forName("org.eclipse.jdt.internal.core.JavaProject$ResolvedClasspath");
+			return (IClasspathEntry[]) ReflectionUtils.getPrivateField(resolvedClasspathClass, "resolvedClasspath",
+					resolvedClasspath);
+		} catch (Exception e) {
+			return new IClasspathEntry[0];
+		}
+	}
+
+	public static List<IClasspathEntry> resolveClasspathContainer(IClasspathEntry classpathContainerEntry,
+			IProject thisProject) throws JavaModelException {
+		IJavaProject thisJavaProject = JavaCore.create(thisProject);
+		IClasspathContainer container = JavaCore.getClasspathContainer(classpathContainerEntry.getPath(),
+				thisJavaProject);
+		if (container != null) {
+			List<IClasspathEntry> actualEntries = new ArrayList<IClasspathEntry>();
+			IClasspathEntry[] containerEntries = container.getClasspathEntries();
+			for (int i = 0; i < containerEntries.length; i++) {
+				// projects must be resolved specially since the AspectJ doesn't
+				// understand the
+				// concept of project
+				switch (containerEntries[i].getEntryKind()) {
+				case IClasspathEntry.CPE_PROJECT:
+					IProject requiredProj = thisProject.getWorkspace().getRoot()
+							.getProject(containerEntries[i].getPath().makeRelative().toPortableString());
+					if (!requiredProj.getName().equals(thisProject.getName()) && requiredProj.exists()) {
+						actualEntries.addAll(resolveDependentProjectClasspath(containerEntries[i], requiredProj));
+					}
+					break;
+
+				case IClasspathEntry.CPE_VARIABLE:
+					IClasspathEntry resolvedClasspathEntry = JavaCore.getResolvedClasspathEntry(containerEntries[i]);
+					if (resolvedClasspathEntry != null) {
+						actualEntries.add(resolvedClasspathEntry);
+					}
+					break;
+
+				case IClasspathEntry.CPE_CONTAINER:
+					// not sure if we can have this, but try anyway
+					actualEntries.addAll(resolveClasspathContainer(containerEntries[i], thisProject));
+					break;
+				case IClasspathEntry.CPE_LIBRARY:
+					actualEntries.add(containerEntries[i]);
+					break;
+				default:
+					// do nothing
+				}
+			}
+			return actualEntries;
+		} else {
+			return Collections.emptyList();
+		}
+	}
+
+	/**
+	 * Resolves a single classpath entry
+	 * 
+	 * @param entry
+	 *            the classpath entry to resolve
+	 * @param thisProject
+	 *            the java project that has this entry
+	 * @return the resolved list of classpath entries
+	 * @throws JavaModelException
+	 */
+	public static List<IClasspathEntry> resolveClasspath(IClasspathEntry entry, IProject thisProject)
+			throws JavaModelException {
+		switch (entry.getEntryKind()) {
+		case IClasspathEntry.CPE_CONTAINER:
+			return resolveClasspathContainer(entry, thisProject);
+
+		case IClasspathEntry.CPE_LIBRARY:
+			return Collections.singletonList(entry);
+
+		case IClasspathEntry.CPE_PROJECT:
+			IProject containedProj = thisProject.getWorkspace().getRoot()
+					.getProject(entry.getPath().makeRelative().toPortableString());
+			if (!containedProj.getName().equals(thisProject.getName()) && containedProj.exists()) {
+				return resolveDependentProjectClasspath(entry, containedProj);
+			} else {
+				return Collections.emptyList();
+			}
+
+		case IClasspathEntry.CPE_VARIABLE:
+			IClasspathEntry resolvedClasspathEntry = JavaCore.getResolvedClasspathEntry(entry);
+			if (resolvedClasspathEntry != null) {
+				return Collections.singletonList(resolvedClasspathEntry);
+			} else {
+				return Collections.emptyList();
+			}
+		default:
+			return Collections.emptyList();
+		}
+	}
+
+	public static void setProjectInPath(IProject project, String path, String cKinds, String eKinds) {
+		setProjectPath(project, path, cKinds, eKinds, INPATH_ATTRIBUTE);
 	}
 
 	public static void addToInPath(IProject project, IClasspathEntry entry) {
 		IJavaProject jp = JavaCore.create(project);
-		addAttribute(jp,entry,AspectJCorePreferences.INPATH_ATTRIBUTE);
-	}
-	
-	public static void removeFromInPath(IProject project, IClasspathEntry entry) {
-		IJavaProject jp = JavaCore.create(project);
-		removeAttribute(jp,entry,AspectJCorePreferences.INPATH_ATTRIBUTE);
-	}
-	
-	public static void addToInPath(IProject project, String jarPath, int eKind) {
-	    addAttribute(project, jarPath, eKind, INPATH_ATTRIBUTE);
+		addAttribute(jp, entry, AspectJCorePreferences.INPATH_ATTRIBUTE);
 	}
 
-	
-    public static boolean isOnInpath(IClasspathEntry entry) {
+	public static void removeFromInPath(IProject project, IClasspathEntry entry) {
+		IJavaProject jp = JavaCore.create(project);
+		removeAttribute(jp, entry, AspectJCorePreferences.INPATH_ATTRIBUTE);
+	}
+
+	public static void addToInPath(IProject project, String jarPath, int eKind) {
+		addAttribute(project, jarPath, eKind, INPATH_ATTRIBUTE);
+	}
+
+	public static boolean isOnInpath(IClasspathEntry entry) {
 		IClasspathAttribute[] attributes = entry.getExtraAttributes();
 		for (int j = 0; j < attributes.length; j++) {
 			if (isInPathAttribute(attributes[j])) {
-				return true;								
+				return true;
 			}
 		}
 		return false;
 	}
-    
-    public static boolean isOnPath(IClasspathEntry entry, boolean aspectpath) {
-        return aspectpath ? isOnAspectpath(entry) : isOnInpath(entry);
-    }
+
+	public static boolean isOnPath(IClasspathEntry entry, boolean aspectpath) {
+		return aspectpath ? isOnAspectpath(entry) : isOnInpath(entry);
+	}
 
 	/**
-     * Checks to see if an entry is already on the Inpath
-     */
+	 * Checks to see if an entry is already on the Inpath
+	 */
 	public static boolean isOnInpath(IProject project, String jarPath) {
 		IJavaProject jp = JavaCore.create(project);
 		try {
@@ -467,16 +460,16 @@
 			for (int i = 0; i < cp.length; i++) {
 				if ((cp[i].getEntryKind() == IClasspathEntry.CPE_LIBRARY)
 						|| (cp[i].getEntryKind() == IClasspathEntry.CPE_VARIABLE)
-				        || (cp[i].getEntryKind() == IClasspathEntry.CPE_CONTAINER)
-				        || (cp[i].getEntryKind() == IClasspathEntry.CPE_PROJECT)) {
+						|| (cp[i].getEntryKind() == IClasspathEntry.CPE_CONTAINER)
+						|| (cp[i].getEntryKind() == IClasspathEntry.CPE_PROJECT)) {
 					IClasspathEntry resolvedClasspathEntry = JavaCore.getResolvedClasspathEntry(cp[i]);
 					if (resolvedClasspathEntry != null) {
-					    String entry = resolvedClasspathEntry.getPath().toPortableString();
-    					if (entry.equals(jarPath)) {
-    						if (isOnInpath(cp[i])) {
-    							return true;
-    						}
-    					}
+						String entry = resolvedClasspathEntry.getPath().toPortableString();
+						if (entry.equals(jarPath)) {
+							if (isOnInpath(cp[i])) {
+								return true;
+							}
+						}
 					}
 				}
 			}
@@ -484,467 +477,460 @@
 		}
 		return false;
 	}
-	
 
 	public static boolean isInPathAttribute(IClasspathAttribute attribute) {
 		return attribute.getName().equals(AspectJCorePreferences.INPATH_ATTRIBUTE.getName());
 	}
 
+	public static void setIncrementalCompilationOptimizationsEnabled(boolean value) {
+		IEclipsePreferences store = AspectJPlugin.getDefault().getPreferences();
+		store.putBoolean(OPTION_IncrementalCompilationOptimizations, value);
+	}
 
-    public static void setIncrementalCompilationOptimizationsEnabled(boolean value) {
-        IEclipsePreferences store = AspectJPlugin.getDefault()
-                .getPreferences();
-        store.putBoolean(OPTION_IncrementalCompilationOptimizations, value);
-    }
-    
-    /**
-     * Searches the raw classpath for entries whose paths contain
-     * the strings in putOnPath.
-     * 
-     * Then ensures that these classpath entries are on the aspect path
-     */
-    public static void augmentAspectPath(IProject project, String[] putOnAspectPath) {
-        if (putOnAspectPath.length == 0) {
-            // nothing to do!
-            return;
-        }
-        IJavaProject jp = JavaCore.create(project);
-        List<IClasspathEntry> toPutOnAspectPath = new ArrayList<IClasspathEntry>();
-        try {
-            IClasspathEntry[] cp = jp.getRawClasspath();
-            for (int i = 0; i < cp.length; i++) {
-                String path = cp[i].getPath().toPortableString();
-                for (int j = 0; j < putOnAspectPath.length; j++) {
-                    if (path.indexOf(putOnAspectPath[j]) != -1) {
-                        toPutOnAspectPath.add(cp[i]);
-                    }
-                }
-            }
-            
-            for (IClasspathEntry entry : toPutOnAspectPath) {
-                if (! isOnAspectpath(entry)) {
-                    addToAspectPath(project, entry);
-                }
-            }
-        } catch (JavaModelException e) {
-        }
-    }
+	/**
+	 * Searches the raw classpath for entries whose paths contain the strings in
+	 * putOnPath.
+	 * 
+	 * Then ensures that these classpath entries are on the aspect path
+	 */
+	public static void augmentAspectPath(IProject project, String[] putOnAspectPath) {
+		if (putOnAspectPath.length == 0) {
+			// nothing to do!
+			return;
+		}
+		IJavaProject jp = JavaCore.create(project);
+		List<IClasspathEntry> toPutOnAspectPath = new ArrayList<IClasspathEntry>();
+		try {
+			IClasspathEntry[] cp = jp.getRawClasspath();
+			for (int i = 0; i < cp.length; i++) {
+				String path = cp[i].getPath().toPortableString();
+				for (int j = 0; j < putOnAspectPath.length; j++) {
+					if (path.indexOf(putOnAspectPath[j]) != -1) {
+						toPutOnAspectPath.add(cp[i]);
+					}
+				}
+			}
 
-    /**
-     * Checks to see if the compiler option for incremental build optimizations
-     * is on or off
-     * 
-     * On by default
-     * @return
-     */
-    public static boolean isIncrementalCompilationOptimizationsEnabled() {
-        IEclipsePreferences store = AspectJPlugin.getDefault()
-                .getPreferences();
-        return store.getBoolean(OPTION_IncrementalCompilationOptimizations, true);
-    }
+			for (IClasspathEntry entry : toPutOnAspectPath) {
+				if (!isOnAspectpath(entry)) {
+					addToAspectPath(project, entry);
+				}
+			}
+		} catch (JavaModelException e) {
+		}
+	}
 
-    private static void setProjectPath(IProject project, String path,
-            String cKinds, String eKinds, IClasspathAttribute attribute) {
-    	IJavaProject javaProject = JavaCore.create(project);		
-    	removeAttribute(javaProject, attribute);
-    	
-    	StringTokenizer pathTok = new StringTokenizer(path, File.pathSeparator);
-    	StringTokenizer eKindsTok = new StringTokenizer(eKinds, File.pathSeparator);
-    	int index = 1;
-    	while (pathTok.hasMoreTokens() && eKindsTok.hasMoreTokens()) {
-    		String entry = pathTok.nextToken();
-    		int eKind = Integer.parseInt(eKindsTok.nextToken());
-    		if (ASPECTPATH_ATTRIBUTE.equals(attribute)) {
-    		    addToAspectPath(project,entry, eKind);
-    		} else if (INPATH_ATTRIBUTE.equals(attribute)) {
-    		    addToInPath(project,entry, eKind);
-    		}
-    		index++;
-    	}
-    }
+	/**
+	 * Checks to see if the compiler option for incremental build optimizations
+	 * is on or off
+	 * 
+	 * On by default
+	 * 
+	 * @return
+	 */
+	public static boolean isIncrementalCompilationOptimizationsEnabled() {
+		IEclipsePreferences store = AspectJPlugin.getDefault().getPreferences();
+		return store.getBoolean(OPTION_IncrementalCompilationOptimizations, true);
+	}
 
-    
-    private static boolean shouldCheckOldStylePath(IProject project, String pathKind) {
-        IScopeContext projectScope = new ProjectScope(project);
-        IEclipsePreferences projectNode = projectScope
-                .getNode(AspectJPlugin.UI_PLUGIN_ID);
-        return projectNode.get(pathKind, "").length() == 0 && projectNode.get(pathKind + "1", "").length() > 0;
-    }
+	private static void setProjectPath(IProject project, String path, String cKinds, String eKinds,
+			IClasspathAttribute attribute) {
+		IJavaProject javaProject = JavaCore.create(project);
+		removeAttribute(javaProject, attribute);
 
-    private static void markOldStylePathAsRead(IProject project, String pathKind) {
-        IScopeContext projectScope = new ProjectScope(project);
-        IEclipsePreferences projectNode = projectScope
-                .getNode(AspectJPlugin.UI_PLUGIN_ID);
-        projectNode.put(pathKind, "visited");
-        try {
-            projectNode.flush();
-        } catch (BackingStoreException e) {
-        }
-    }
-    
-    private static String[] getOldProjectPath(IProject project, boolean aspectPath) {
-        String pathName;
-        String pathConKinds;
-        String pathEntKinds;
-        if (aspectPath) {
-            pathName = ASPECTPATH;
-            pathConKinds = ASPECTPATH_CON_KINDS;
-            pathEntKinds = ASPECTPATH_ENT_KINDS;
-        } else {
-            pathName = INPATH;
-            pathConKinds = INPATH_CON_KINDS;
-            pathEntKinds = INPATH_ENT_KINDS;
-        }
-        
-    	IScopeContext projectScope = new ProjectScope(project);
-    	IEclipsePreferences projectNode = projectScope
-    			.getNode(AspectJPlugin.UI_PLUGIN_ID);
-    	String pathString = ""; //$NON-NLS-1$
-    	int index = 1;
-    	String value = projectNode.get(pathName + index, ""); //$NON-NLS-1$
-    	if (value.length() == 0) {
-    		return null;
-    	}
-    	while (value.length() > 0) {
-    		pathString += value;
-    		pathString += File.pathSeparator;
-    		index++;
-    		value = projectNode.get(pathName + index, ""); //$NON-NLS-1$
-    	}
-    
-    	String contentString = ""; //$NON-NLS-1$
-    	index = 1;
-    	value = projectNode.get(pathConKinds + index, ""); //$NON-NLS-1$
-    	while (value.length() > 0) {
-    		contentString += toContentKind(value.toUpperCase());
-    		contentString += File.pathSeparator;
-    		index++;
-    		value = projectNode.get(pathConKinds + index, ""); //$NON-NLS-1$
-    	}
-    
-    	String entryString = ""; //$NON-NLS-1$
-    	index = 1;
-    	value = projectNode.get(pathEntKinds + index, ""); //$NON-NLS-1$
-    	while (value.length() > 0) {
-    		entryString += toEntryKind(value.toUpperCase());
-    		entryString += File.pathSeparator;
-    		index++;
-    		value = projectNode.get(pathEntKinds + index, ""); //$NON-NLS-1$
-    	}
-    	return new String[] { pathString, contentString, entryString };
-    }
+		StringTokenizer pathTok = new StringTokenizer(path, File.pathSeparator);
+		StringTokenizer eKindsTok = new StringTokenizer(eKinds, File.pathSeparator);
+		int index = 1;
+		while (pathTok.hasMoreTokens() && eKindsTok.hasMoreTokens()) {
+			String entry = pathTok.nextToken();
+			int eKind = Integer.parseInt(eKindsTok.nextToken());
+			if (ASPECTPATH_ATTRIBUTE.equals(attribute)) {
+				addToAspectPath(project, entry, eKind);
+			} else if (INPATH_ATTRIBUTE.equals(attribute)) {
+				addToInPath(project, entry, eKind);
+			}
+			index++;
+		}
+	}
 
-    /**
-     * Firstly, add library to the Java build path if it's not there already,
-     * then mark the entry as being on the aspect path
-     * @param project
-     * @param path
-     */
-    private static void addAttribute(IProject project, String jarPath, int eKind, IClasspathAttribute attribute) {
-    	IJavaProject jp = JavaCore.create(project);
-    	
-    	
-    	try {
-            IClasspathEntry[] cp = jp.getRawClasspath();
-            int cpIndex = getIndexInBuildPathEntry(cp, jarPath);
-            if (cpIndex >= 0) { // already on classpath
-                // add attribute to classpath entry
-                // if it doesn't already exist
-                IClasspathEntry pathAdd = cp[cpIndex];
-                // only add attribute if this element is not already on the path
-                if (isAspectPathAttribute(attribute) ? 
-                        !isOnAspectpath(pathAdd) :
-                        !isOnInpath(pathAdd)) {  
-                    IClasspathAttribute[] attributes = pathAdd.getExtraAttributes();
-                    IClasspathAttribute[] newattrib = new IClasspathAttribute[attributes.length + 1];
-                    System.arraycopy(attributes, 0, newattrib, 0, attributes.length);
-                    newattrib[attributes.length] = attribute;
-                    switch(pathAdd.getEntryKind()) {
-                        case IClasspathEntry.CPE_LIBRARY:
-                            pathAdd = JavaCore.newLibraryEntry(pathAdd.getPath(),
-                                    pathAdd.getSourceAttachmentPath(), 
-                                    pathAdd.getSourceAttachmentRootPath(),
-                                    pathAdd.getAccessRules(), newattrib, 
-                                    pathAdd.isExported());
-                            break;
-                            
-                        case IClasspathEntry.CPE_VARIABLE:
-                            pathAdd = JavaCore.newVariableEntry(pathAdd.getPath(),
-                                    pathAdd.getSourceAttachmentPath(), 
-                                    pathAdd.getSourceAttachmentRootPath(),
-                                    pathAdd.getAccessRules(), newattrib, 
-                                    pathAdd.isExported());
-                            break;
-    
-                        case IClasspathEntry.CPE_CONTAINER:
-                            pathAdd = JavaCore.newContainerEntry(pathAdd.getPath(),
-                                    pathAdd.getAccessRules(), newattrib, 
-                                    pathAdd.isExported());
-                            break;
-                            
-                        case IClasspathEntry.CPE_PROJECT:
-                            pathAdd = JavaCore.newProjectEntry(pathAdd.getPath(), 
-                                    pathAdd.getAccessRules(), 
-                                    true, newattrib, pathAdd.isExported());
-                            break;
-                    }
-                    
-                    cp[cpIndex] = pathAdd;
-                    jp.setRawClasspath(cp, null);
-                }
-    		} else {
-    			addEntryToJavaBuildPath(jp, attribute, jarPath, eKind);
-    		}
-    	} catch (JavaModelException e) {
-    	}
-    }
+	private static boolean shouldCheckOldStylePath(IProject project, String pathKind) {
+		IScopeContext projectScope = new ProjectScope(project);
+		IEclipsePreferences projectNode = projectScope.getNode(AspectJPlugin.UI_PLUGIN_ID);
+		return projectNode.get(pathKind, "").length() == 0 && projectNode.get(pathKind + "1", "").length() > 0;
+	}
 
-    private static String[] internalGetProjectPath(IProject project, IClasspathAttribute attribute, boolean useResolvedPath) {
-        if (isAspectPathAttribute(attribute)) {
-            if (shouldCheckOldStylePath(project, ASPECTPATH)) {
-        		String[] old = getOldProjectPath(project, true);
-        		if (old != null) {
-        			AJLog.log("Migrating aspect path settings for project "+project.getName()); //$NON-NLS-1$
-        			setProjectAspectPath(project,old[0],old[1],old[2]);
-        		}
-        		markOldStylePathAsRead(project, ASPECTPATH);
-            }
-        } else { // INPATH_ATTRIBUTE
-            if (shouldCheckOldStylePath(project, INPATH)) {
-                String[] old = getOldProjectPath(project, false);
-                if (old != null) {
-                    AJLog.log("Migrating aspect path settings for project "+project.getName()); //$NON-NLS-1$
-                    setProjectInPath(project,old[0],old[1],old[2]);
-                }
-                markOldStylePathAsRead(project, INPATH);
-            }
-        }
-    	String pathString = ""; //$NON-NLS-1$
-    	String contentString = ""; //$NON-NLS-1$
-    	String entryString = ""; //$NON-NLS-1$
-    
-    	IJavaProject javaProject = JavaCore.create(project);
-    	try {
-            IClasspathEntry[] cp = javaProject.getRawClasspath();
-    		for (int i = 0; i < cp.length; i++) {
-    			IClasspathAttribute[] attributes = cp[i].getExtraAttributes();
-    			boolean attributeFound = false;
-    			for (int j = 0; j < attributes.length; j++) {
-    				if (attributes[j].getName().equals(attribute.getName())) {
-    				    attributeFound = true;
-    				    List<IClasspathEntry> actualEntries = new ArrayList<IClasspathEntry>();
-    				    
-    				    if (useResolvedPath) {
-    				        // this entry is on the path.  must resolve it
-    				        if (cp[i].getEntryKind() == IClasspathEntry.CPE_CONTAINER) {
-    				            List<IClasspathEntry>containerEntries = resolveClasspathContainer(cp[i], project);
-    				            // Bug 273770 - look for the XXXPATH_RESTRICTION_ATTRIBUTE_NAME classpath attribute
-    				            Set<String> extraPathElements = findContainerRestrictions(cp[i], isAspectPathAttribute(attribute));
-    				            if (extraPathElements != null && extraPathElements.size() > 0) {
-    				                // must filter
-    				                for (Iterator<IClasspathEntry> cpIter = containerEntries.iterator(); cpIter.hasNext(); ) {
-    				                    IClasspathEntry containerEntry = cpIter.next();
-    				                    if (!containsAsPathFragment(extraPathElements, containerEntry)) {
-    				                        cpIter.remove();
-    				                    }
-    				                }
-    				            }
-    				            actualEntries.addAll(containerEntries);
-    				        } else if (cp[i].getEntryKind() == IClasspathEntry.CPE_PROJECT) {
-    				            IProject requiredProj = project.getWorkspace().getRoot().getProject(
-    				                    cp[i].getPath().makeRelative().toPortableString());
-    				            if (! requiredProj.getName().equals(project.getName())   
-    				                    && requiredProj.exists()) {
-    					            actualEntries.addAll(resolveDependentProjectClasspath(cp[i], requiredProj));
-    				            }
-    				        } else { // resolve the classpath variable
-    				        	IClasspathEntry resolved = JavaCore.getResolvedClasspathEntry(cp[i]);
-    				        	if (resolved != null) {
-        				        	if (resolved.getEntryKind() == IClasspathEntry.CPE_PROJECT) {
-        				        		// must resolve the project
-        				        		actualEntries.addAll(resolveDependentProjectClasspath(resolved, project.getWorkspace().getRoot().getProject(resolved.getPath().toString())));
-        				        	} else {
-        				        		actualEntries.add(resolved);
-        				        	}
-    				        	}
-    				        } // cp[i].getEntryKind()
-    				    } else {
-    				        actualEntries.add(cp[i]);
-    				    } // useResolvedEntry
-    				    
-    				    for (IClasspathEntry actualEntry : actualEntries) {
-    				        // we can get null for actualEntry if the raw entry corresponds to 
-    				        // an unbound classpath variable
-    				        if (actualEntry != null) {
-    	                        pathString += actualEntry.getPath().toPortableString() + File.pathSeparator;
-    	                        contentString += actualEntry.getContentKind() + File.pathSeparator;
-    	                        entryString += actualEntry.getEntryKind() + File.pathSeparator;
-    				        }
-    				    }
-    				}  // attributes[j].equals(attribute)
-    			}  // for (int j = 0; j < attributes.length; j++)
-    			
-    			// there is a special case that we must look inside the classpath container for entries with
-    			// attributes if we are returning the resolved path and the container itself isn't already
-    			// on the path.
-    			if (!attributeFound && useResolvedPath && cp[i].getEntryKind() == IClasspathEntry.CPE_CONTAINER) {
-    			    List<IClasspathEntry> containerEntries = resolveClasspathContainer(cp[i], project);
-    			    
-    			    for (IClasspathEntry containerEntry : containerEntries) {
-    			        if (isOnPath(containerEntry, isAspectPathAttribute(attribute))) {
-    			            pathString += containerEntry.getPath().toPortableString() + File.pathSeparator;
-    			            contentString += containerEntry.getContentKind() + File.pathSeparator;
-    			            entryString += containerEntry.getEntryKind() + File.pathSeparator;
-    			        }
-    			    }  // for (Iterator cpIter = containerEntries.iterator(); cpIter.hasNext(); ) 
-    			}  // !attributeFound && useResolvedPath && cp[i].getEntryKind() == IClasspathEntry.CPE_CONTAINER
-    		}  // for (int i = 0; i < cp.length; i++)
-    	} catch (JavaModelException e) {
-    	}
-    	return new String[] { pathString, contentString, entryString };
-    }
+	private static void markOldStylePathAsRead(IProject project, String pathKind) {
+		IScopeContext projectScope = new ProjectScope(project);
+		IEclipsePreferences projectNode = projectScope.getNode(AspectJPlugin.UI_PLUGIN_ID);
+		projectNode.put(pathKind, "visited");
+		try {
+			projectNode.flush();
+		} catch (BackingStoreException e) {
+		}
+	}
 
-    public static boolean containsAsPathFragment(Set<String> extraPathElements,
-            IClasspathEntry containerEntry) {
-        if (extraPathElements.size() == 0) {
-            return false;
-        }
-        String pathStr = containerEntry.getPath().toString();
-        for (String extraPathStr : extraPathElements) {
-            if (pathStr.indexOf(extraPathStr) != -1) {
-                return true;
-            }
-        }
-        return false;
-    }
+	private static String[] getOldProjectPath(IProject project, boolean aspectPath) {
+		String pathName;
+		String pathConKinds;
+		String pathEntKinds;
+		if (aspectPath) {
+			pathName = ASPECTPATH;
+			pathConKinds = ASPECTPATH_CON_KINDS;
+			pathEntKinds = ASPECTPATH_ENT_KINDS;
+		} else {
+			pathName = INPATH;
+			pathConKinds = INPATH_CON_KINDS;
+			pathEntKinds = INPATH_ENT_KINDS;
+		}
 
-    private static Set<String> findContainerRestrictions(IClasspathEntry containerEntry,
-            boolean isAspectPathAttribute) {
-        if (containerEntry.getEntryKind() != IClasspathEntry.CPE_CONTAINER) {
-            return Collections.emptySet();
-        }
-        Set<String> restrictionPaths = new HashSet<String>();
-        String restrictions = getRestriction(containerEntry, 
-                isAspectPathAttribute ? ASPECTPATH_RESTRICTION_ATTRIBUTE_NAME : INPATH_RESTRICTION_ATTRIBUTE_NAME);
-        if (restrictions != null) {
-            String[] restrictionsArr = restrictions.split(",");
-            for (int j = 0; j < restrictionsArr.length; j++) {
-                restrictionPaths.add(restrictionsArr[j].trim());
-            }
-            return restrictionPaths;
-        } else {
-            return null;
-        }
-    }
+		IScopeContext projectScope = new ProjectScope(project);
+		IEclipsePreferences projectNode = projectScope.getNode(AspectJPlugin.UI_PLUGIN_ID);
+		String pathString = ""; //$NON-NLS-1$
+		int index = 1;
+		String value = projectNode.get(pathName + index, ""); //$NON-NLS-1$
+		if (value.length() == 0) {
+			return null;
+		}
+		while (value.length() > 0) {
+			pathString += value;
+			pathString += File.pathSeparator;
+			index++;
+			value = projectNode.get(pathName + index, ""); //$NON-NLS-1$
+		}
 
-    private static void addAttribute(IJavaProject jp, IClasspathEntry entry, IClasspathAttribute attr) {
-    	try {
-    		IClasspathEntry[] cp = jp.getRawClasspath();
-    		for (int i = 0; i < cp.length; i++) {
-    			if (cp[i].equals(entry)) {
-    				IClasspathAttribute[] attributes = cp[i].getExtraAttributes();
-    				IClasspathAttribute[] newattrib = new IClasspathAttribute[attributes.length + 1];
-    				System.arraycopy(attributes, 0, newattrib, 0, attributes.length);
-    				newattrib[attributes.length] = attr;
-    				switch (cp[i].getEntryKind()) {
-                        case IClasspathEntry.CPE_LIBRARY:
-                            cp[i] = JavaCore.newLibraryEntry(cp[i].getPath(),
-                                    cp[i].getSourceAttachmentPath(), 
-                                    cp[i].getSourceAttachmentRootPath(),
-                                    cp[i].getAccessRules(), newattrib, 
-                                    cp[i].isExported());
-                            break;
-    
-                        case IClasspathEntry.CPE_VARIABLE:
-                            cp[i] = JavaCore.newVariableEntry(cp[i].getPath(),
-                                    cp[i].getSourceAttachmentPath(), 
-                                    cp[i].getSourceAttachmentRootPath(),
-                                    cp[i].getAccessRules(), newattrib, 
-                                    cp[i].isExported());
-                            break;
-    
-                        case IClasspathEntry.CPE_CONTAINER:
-                            cp[i] = JavaCore.newContainerEntry(cp[i].getPath(),
-                                    cp[i].getAccessRules(), newattrib, 
-                                    cp[i].isExported());
-                            break;
-    
-                        case IClasspathEntry.CPE_PROJECT:
-                            cp[i] = JavaCore.newProjectEntry(cp[i].getPath(), 
-                                    cp[i].getAccessRules(), true, newattrib,
-                                    cp[i].isExported());
-                            break;
-    
-                    }
-    			}
-    		}
-    		jp.setRawClasspath(cp, null);
-    	} catch (JavaModelException e) {
-    	}
-    }
+		String contentString = ""; //$NON-NLS-1$
+		index = 1;
+		value = projectNode.get(pathConKinds + index, ""); //$NON-NLS-1$
+		while (value.length() > 0) {
+			contentString += toContentKind(value.toUpperCase());
+			contentString += File.pathSeparator;
+			index++;
+			value = projectNode.get(pathConKinds + index, ""); //$NON-NLS-1$
+		}
 
-    public static void removeAttribute(IJavaProject jp, IClasspathEntry entry, IClasspathAttribute attr) {
-    	try {
-    		IClasspathEntry[] cp = jp.getRawClasspath();
-    		for (int i = 0; i < cp.length; i++) {
-    			if (cp[i].equals(entry)) {
-    				IClasspathAttribute[] attributes = cp[i].getExtraAttributes();
-    				IClasspathAttribute[] newattrib = new IClasspathAttribute[attributes.length - 1];
-    				int count = 0;
-    				for (int j = 0; j < attributes.length; j++) {
-    					if (!attributes[j].getName().equals(attr.getName())) {
-    						newattrib[count++] = attributes[j];
-    					}
-    				}
-                    switch(cp[i].getEntryKind()) {
-                        case IClasspathEntry.CPE_LIBRARY:
-                            cp[i] = JavaCore.newLibraryEntry(cp[i].getPath(),
-                                    cp[i].getSourceAttachmentPath(), cp[i]
-                                            .getSourceAttachmentRootPath(),
-                                    cp[i].getAccessRules(), newattrib, cp[i]
-                                            .isExported());
-                            break;
-                            
-                        case IClasspathEntry.CPE_VARIABLE:
-                            cp[i] = JavaCore.newVariableEntry(cp[i].getPath(),
-                                    cp[i].getSourceAttachmentPath(), cp[i]
-                                            .getSourceAttachmentRootPath(),
-                                    cp[i].getAccessRules(), newattrib, cp[i]
-                                            .isExported());                     
-                            break;
-    
-                        case IClasspathEntry.CPE_CONTAINER:
-                            cp[i] = JavaCore.newContainerEntry(cp[i].getPath(),
-                                    cp[i].getAccessRules(), newattrib, cp[i]
-                                            .isExported());                     
-                            break;
-                            
-                        case IClasspathEntry.CPE_PROJECT:
-                            cp[i] = JavaCore.newProjectEntry(cp[i].getPath(), 
-                                    cp[i].getAccessRules(), 
-                                    true, newattrib, cp[i].isExported());
-                            break;
-                    }
-    			}
-    		}
-    		jp.setRawClasspath(cp, null);
-    	} catch (JavaModelException e) {
-    	}
-    }
+		String entryString = ""; //$NON-NLS-1$
+		index = 1;
+		value = projectNode.get(pathEntKinds + index, ""); //$NON-NLS-1$
+		while (value.length() > 0) {
+			entryString += toEntryKind(value.toUpperCase());
+			entryString += File.pathSeparator;
+			index++;
+			value = projectNode.get(pathEntKinds + index, ""); //$NON-NLS-1$
+		}
+		return new String[] { pathString, contentString, entryString };
+	}
 
-    /**
+	/**
+	 * Firstly, add library to the Java build path if it's not there already,
+	 * then mark the entry as being on the aspect path
+	 * 
+	 * @param project
+	 * @param path
+	 */
+	private static void addAttribute(IProject project, String jarPath, int eKind, IClasspathAttribute attribute) {
+		IJavaProject jp = JavaCore.create(project);
+
+		try {
+			IClasspathEntry[] cp = jp.getRawClasspath();
+			int cpIndex = getIndexInBuildPathEntry(cp, jarPath);
+			if (cpIndex >= 0) { // already on classpath
+				// add attribute to classpath entry
+				// if it doesn't already exist
+				IClasspathEntry pathAdd = cp[cpIndex];
+				// only add attribute if this element is not already on the path
+				if (isAspectPathAttribute(attribute) ? !isOnAspectpath(pathAdd) : !isOnInpath(pathAdd)) {
+					IClasspathAttribute[] attributes = pathAdd.getExtraAttributes();
+					IClasspathAttribute[] newattrib = new IClasspathAttribute[attributes.length + 1];
+					System.arraycopy(attributes, 0, newattrib, 0, attributes.length);
+					newattrib[attributes.length] = attribute;
+					switch (pathAdd.getEntryKind()) {
+					case IClasspathEntry.CPE_LIBRARY:
+						pathAdd = JavaCore.newLibraryEntry(pathAdd.getPath(), pathAdd.getSourceAttachmentPath(),
+								pathAdd.getSourceAttachmentRootPath(), pathAdd.getAccessRules(), newattrib,
+								pathAdd.isExported());
+						break;
+
+					case IClasspathEntry.CPE_VARIABLE:
+						pathAdd = JavaCore.newVariableEntry(pathAdd.getPath(), pathAdd.getSourceAttachmentPath(),
+								pathAdd.getSourceAttachmentRootPath(), pathAdd.getAccessRules(), newattrib,
+								pathAdd.isExported());
+						break;
+
+					case IClasspathEntry.CPE_CONTAINER:
+						pathAdd = JavaCore.newContainerEntry(pathAdd.getPath(), pathAdd.getAccessRules(), newattrib,
+								pathAdd.isExported());
+						break;
+
+					case IClasspathEntry.CPE_PROJECT:
+						pathAdd = JavaCore.newProjectEntry(pathAdd.getPath(), pathAdd.getAccessRules(), true, newattrib,
+								pathAdd.isExported());
+						break;
+					}
+
+					cp[cpIndex] = pathAdd;
+					jp.setRawClasspath(cp, null);
+				}
+			} else {
+				addEntryToJavaBuildPath(jp, attribute, jarPath, eKind);
+			}
+		} catch (JavaModelException e) {
+		}
+	}
+
+	private static String[] internalGetProjectPath(IProject project, IClasspathAttribute attribute,
+			boolean useResolvedPath) {
+		if (isAspectPathAttribute(attribute)) {
+			if (shouldCheckOldStylePath(project, ASPECTPATH)) {
+				String[] old = getOldProjectPath(project, true);
+				if (old != null) {
+					AJLog.log("Migrating aspect path settings for project " + project.getName()); //$NON-NLS-1$
+					setProjectAspectPath(project, old[0], old[1], old[2]);
+				}
+				markOldStylePathAsRead(project, ASPECTPATH);
+			}
+		} else { // INPATH_ATTRIBUTE
+			if (shouldCheckOldStylePath(project, INPATH)) {
+				String[] old = getOldProjectPath(project, false);
+				if (old != null) {
+					AJLog.log("Migrating aspect path settings for project " + project.getName()); //$NON-NLS-1$
+					setProjectInPath(project, old[0], old[1], old[2]);
+				}
+				markOldStylePathAsRead(project, INPATH);
+			}
+		}
+		String pathString = ""; //$NON-NLS-1$
+		String contentString = ""; //$NON-NLS-1$
+		String entryString = ""; //$NON-NLS-1$
+
+		IJavaProject javaProject = JavaCore.create(project);
+		try {
+			IClasspathEntry[] cp = javaProject.getRawClasspath();
+			AJLog.log("internalGetProjectPath: iterating over classpath entries, size #"+(cp==null?0:cp.length));
+			for (int i = 0; i < cp.length; i++) {
+				IClasspathAttribute[] attributes = cp[i].getExtraAttributes();
+				AJLog.log("internalGetProjectPath: attributes on "+cp[i].getPath()+" are "+toString(attributes));
+				boolean attributeFound = false;
+				for (int j = 0; j < attributes.length; j++) {
+					if (attributes[j].getName().equals(attribute.getName())) {
+						attributeFound = true;
+						List<IClasspathEntry> actualEntries = new ArrayList<IClasspathEntry>();
+
+						if (useResolvedPath) {
+							// this entry is on the path. must resolve it
+							if (cp[i].getEntryKind() == IClasspathEntry.CPE_CONTAINER) {
+								List<IClasspathEntry> containerEntries = resolveClasspathContainer(cp[i], project);
+								// Bug 273770 - look for the
+								// XXXPATH_RESTRICTION_ATTRIBUTE_NAME classpath
+								// attribute
+								Set<String> extraPathElements = findContainerRestrictions(cp[i],
+										isAspectPathAttribute(attribute));
+								if (extraPathElements != null && extraPathElements.size() > 0) {
+									// must filter
+									for (Iterator<IClasspathEntry> cpIter = containerEntries.iterator(); cpIter
+											.hasNext();) {
+										IClasspathEntry containerEntry = cpIter.next();
+										if (!containsAsPathFragment(extraPathElements, containerEntry)) {
+											cpIter.remove();
+										}
+									}
+								}
+								actualEntries.addAll(containerEntries);
+							} else if (cp[i].getEntryKind() == IClasspathEntry.CPE_PROJECT) {
+								IProject requiredProj = project.getWorkspace().getRoot()
+										.getProject(cp[i].getPath().makeRelative().toPortableString());
+								if (!requiredProj.getName().equals(project.getName()) && requiredProj.exists()) {
+									actualEntries.addAll(resolveDependentProjectClasspath(cp[i], requiredProj));
+								}
+							} else { // resolve the classpath variable
+								IClasspathEntry resolved = JavaCore.getResolvedClasspathEntry(cp[i]);
+								if (resolved != null) {
+									if (resolved.getEntryKind() == IClasspathEntry.CPE_PROJECT) {
+										// must resolve the project
+										actualEntries.addAll(resolveDependentProjectClasspath(resolved, project
+												.getWorkspace().getRoot().getProject(resolved.getPath().toString())));
+									} else {
+										actualEntries.add(resolved);
+									}
+								}
+							} // cp[i].getEntryKind()
+						} else {
+							actualEntries.add(cp[i]);
+						} // useResolvedEntry
+
+						for (IClasspathEntry actualEntry : actualEntries) {
+							// we can get null for actualEntry if the raw entry
+							// corresponds to
+							// an unbound classpath variable
+							if (actualEntry != null) {
+								pathString += actualEntry.getPath().toPortableString() + File.pathSeparator;
+								contentString += actualEntry.getContentKind() + File.pathSeparator;
+								entryString += actualEntry.getEntryKind() + File.pathSeparator;
+							}
+						}
+					} // attributes[j].equals(attribute)
+				} // for (int j = 0; j < attributes.length; j++)
+
+				// there is a special case that we must look inside the
+				// classpath container for entries with
+				// attributes if we are returning the resolved path and the
+				// container itself isn't already
+				// on the path.
+				if (!attributeFound && useResolvedPath && cp[i].getEntryKind() == IClasspathEntry.CPE_CONTAINER) {
+					List<IClasspathEntry> containerEntries = resolveClasspathContainer(cp[i], project);
+
+					for (IClasspathEntry containerEntry : containerEntries) {
+						if (isOnPath(containerEntry, isAspectPathAttribute(attribute))) {
+							pathString += containerEntry.getPath().toPortableString() + File.pathSeparator;
+							contentString += containerEntry.getContentKind() + File.pathSeparator;
+							entryString += containerEntry.getEntryKind() + File.pathSeparator;
+						}
+					} // for (Iterator cpIter = containerEntries.iterator();
+						// cpIter.hasNext(); )
+				} // !attributeFound && useResolvedPath && cp[i].getEntryKind()
+					// == IClasspathEntry.CPE_CONTAINER
+			} // for (int i = 0; i < cp.length; i++)
+		} catch (JavaModelException e) {
+		}
+		return new String[] { pathString, contentString, entryString };
+	}
+
+	private static String toString(IClasspathAttribute[] attributes) {
+		StringBuilder s = new StringBuilder();
+		if (attributes != null) {
+			for (IClasspathAttribute ca: attributes) {
+				s.append(ca.getName()+"="+ca.getValue()+" ");
+			}
+		}
+		return s.toString().trim();
+	}
+
+	public static boolean containsAsPathFragment(Set<String> extraPathElements, IClasspathEntry containerEntry) {
+		if (extraPathElements.size() == 0) {
+			return false;
+		}
+		String pathStr = containerEntry.getPath().toString();
+		for (String extraPathStr : extraPathElements) {
+			if (pathStr.indexOf(extraPathStr) != -1) {
+				return true;
+			}
+		}
+		return false;
+	}
+
+	private static Set<String> findContainerRestrictions(IClasspathEntry containerEntry,
+			boolean isAspectPathAttribute) {
+		if (containerEntry.getEntryKind() != IClasspathEntry.CPE_CONTAINER) {
+			return Collections.emptySet();
+		}
+		Set<String> restrictionPaths = new HashSet<String>();
+		String restrictions = getRestriction(containerEntry,
+				isAspectPathAttribute ? ASPECTPATH_RESTRICTION_ATTRIBUTE_NAME : INPATH_RESTRICTION_ATTRIBUTE_NAME);
+		if (restrictions != null) {
+			String[] restrictionsArr = restrictions.split(",");
+			for (int j = 0; j < restrictionsArr.length; j++) {
+				restrictionPaths.add(restrictionsArr[j].trim());
+			}
+			return restrictionPaths;
+		} else {
+			return null;
+		}
+	}
+
+	private static void addAttribute(IJavaProject jp, IClasspathEntry entry, IClasspathAttribute attr) {
+		try {
+			IClasspathEntry[] cp = jp.getRawClasspath();
+			for (int i = 0; i < cp.length; i++) {
+				if (cp[i].equals(entry)) {
+					IClasspathAttribute[] attributes = cp[i].getExtraAttributes();
+					IClasspathAttribute[] newattrib = new IClasspathAttribute[attributes.length + 1];
+					System.arraycopy(attributes, 0, newattrib, 0, attributes.length);
+					newattrib[attributes.length] = attr;
+					switch (cp[i].getEntryKind()) {
+					case IClasspathEntry.CPE_LIBRARY:
+						cp[i] = JavaCore.newLibraryEntry(cp[i].getPath(), cp[i].getSourceAttachmentPath(),
+								cp[i].getSourceAttachmentRootPath(), cp[i].getAccessRules(), newattrib,
+								cp[i].isExported());
+						break;
+
+					case IClasspathEntry.CPE_VARIABLE:
+						cp[i] = JavaCore.newVariableEntry(cp[i].getPath(), cp[i].getSourceAttachmentPath(),
+								cp[i].getSourceAttachmentRootPath(), cp[i].getAccessRules(), newattrib,
+								cp[i].isExported());
+						break;
+
+					case IClasspathEntry.CPE_CONTAINER:
+						cp[i] = JavaCore.newContainerEntry(cp[i].getPath(), cp[i].getAccessRules(), newattrib,
+								cp[i].isExported());
+						break;
+
+					case IClasspathEntry.CPE_PROJECT:
+						cp[i] = JavaCore.newProjectEntry(cp[i].getPath(), cp[i].getAccessRules(), true, newattrib,
+								cp[i].isExported());
+						break;
+
+					}
+				}
+			}
+			jp.setRawClasspath(cp, null);
+		} catch (JavaModelException e) {
+		}
+	}
+
+	public static void removeAttribute(IJavaProject jp, IClasspathEntry entry, IClasspathAttribute attr) {
+		try {
+			IClasspathEntry[] cp = jp.getRawClasspath();
+			for (int i = 0; i < cp.length; i++) {
+				if (cp[i].equals(entry)) {
+					IClasspathAttribute[] attributes = cp[i].getExtraAttributes();
+					IClasspathAttribute[] newattrib = new IClasspathAttribute[attributes.length - 1];
+					int count = 0;
+					for (int j = 0; j < attributes.length; j++) {
+						if (!attributes[j].getName().equals(attr.getName())) {
+							newattrib[count++] = attributes[j];
+						}
+					}
+					switch (cp[i].getEntryKind()) {
+					case IClasspathEntry.CPE_LIBRARY:
+						cp[i] = JavaCore.newLibraryEntry(cp[i].getPath(), cp[i].getSourceAttachmentPath(),
+								cp[i].getSourceAttachmentRootPath(), cp[i].getAccessRules(), newattrib,
+								cp[i].isExported());
+						break;
+
+					case IClasspathEntry.CPE_VARIABLE:
+						cp[i] = JavaCore.newVariableEntry(cp[i].getPath(), cp[i].getSourceAttachmentPath(),
+								cp[i].getSourceAttachmentRootPath(), cp[i].getAccessRules(), newattrib,
+								cp[i].isExported());
+						break;
+
+					case IClasspathEntry.CPE_CONTAINER:
+						cp[i] = JavaCore.newContainerEntry(cp[i].getPath(), cp[i].getAccessRules(), newattrib,
+								cp[i].isExported());
+						break;
+
+					case IClasspathEntry.CPE_PROJECT:
+						cp[i] = JavaCore.newProjectEntry(cp[i].getPath(), cp[i].getAccessRules(), true, newattrib,
+								cp[i].isExported());
+						break;
+					}
+				}
+			}
+			jp.setRawClasspath(cp, null);
+		} catch (JavaModelException e) {
+		}
+	}
+
+	/**
 	 * Remove all occurrences of an attribute
+	 * 
 	 * @param javaProject
 	 * @param attribute
 	 */
-	private static void removeAttribute(IJavaProject javaProject,
-			IClasspathAttribute attribute) {
+	private static void removeAttribute(IJavaProject javaProject, IClasspathAttribute attribute) {
 		try {
 			IClasspathEntry[] cp = javaProject.getRawClasspath();
 			boolean changed = false;
 			for (int i = 0; i < cp.length; i++) {
-				IClasspathAttribute[] attributes = cp[i]
-						.getExtraAttributes();
+				IClasspathAttribute[] attributes = cp[i].getExtraAttributes();
 				boolean found = false;
 				for (int j = 0; !found && (j < attributes.length); j++) {
 					if (attributes[j].getName().equals(attribute.getName())) {
@@ -952,44 +938,37 @@
 					}
 				}
 				if (found) {
-				    changed = true;
+					changed = true;
 					IClasspathAttribute[] newattrib = new IClasspathAttribute[attributes.length - 1];
 					int count = 0;
 					for (int j = 0; j < attributes.length; j++) {
-						if (!attributes[j].getName()
-								.equals(attribute.getName())) {
+						if (!attributes[j].getName().equals(attribute.getName())) {
 							newattrib[count++] = attributes[j];
 						}
 					}
-                    switch(cp[i].getEntryKind()) {
-                        case IClasspathEntry.CPE_LIBRARY:
-                            cp[i] = JavaCore.newLibraryEntry(cp[i].getPath(),
-                                    cp[i].getSourceAttachmentPath(), 
-                                    cp[i].getSourceAttachmentRootPath(),
-                                    cp[i].getAccessRules(), newattrib, 
-                                    cp[i].isExported());
-                            break;
-                            
-                        case IClasspathEntry.CPE_VARIABLE:
-                            cp[i] = JavaCore.newVariableEntry(cp[i].getPath(),
-                                    cp[i].getSourceAttachmentPath(), 
-                                    cp[i].getSourceAttachmentRootPath(),
-                                    cp[i].getAccessRules(), newattrib, 
-                                    cp[i].isExported());
-                            break;
+					switch (cp[i].getEntryKind()) {
+					case IClasspathEntry.CPE_LIBRARY:
+						cp[i] = JavaCore.newLibraryEntry(cp[i].getPath(), cp[i].getSourceAttachmentPath(),
+								cp[i].getSourceAttachmentRootPath(), cp[i].getAccessRules(), newattrib,
+								cp[i].isExported());
+						break;
 
-                        case IClasspathEntry.CPE_CONTAINER:
-                            cp[i] = JavaCore.newContainerEntry(cp[i].getPath(),
-                                    cp[i].getAccessRules(), newattrib, 
-                                    cp[i].isExported());
-                            break;
-                            
-                        case IClasspathEntry.CPE_PROJECT:
-                            cp[i] = JavaCore.newProjectEntry(cp[i].getPath(), 
-                                    cp[i].getAccessRules(), 
-                                    true, newattrib, cp[i].isExported());
-                            break;
-                    }
+					case IClasspathEntry.CPE_VARIABLE:
+						cp[i] = JavaCore.newVariableEntry(cp[i].getPath(), cp[i].getSourceAttachmentPath(),
+								cp[i].getSourceAttachmentRootPath(), cp[i].getAccessRules(), newattrib,
+								cp[i].isExported());
+						break;
+
+					case IClasspathEntry.CPE_CONTAINER:
+						cp[i] = JavaCore.newContainerEntry(cp[i].getPath(), cp[i].getAccessRules(), newattrib,
+								cp[i].isExported());
+						break;
+
+					case IClasspathEntry.CPE_PROJECT:
+						cp[i] = JavaCore.newProjectEntry(cp[i].getPath(), cp[i].getAccessRules(), true, newattrib,
+								cp[i].isExported());
+						break;
+					}
 				}
 			}
 			if (changed) {
@@ -998,38 +977,34 @@
 		} catch (JavaModelException e) {
 		}
 	}
-	
-	
+
 	private static int getIndexInBuildPathEntry(IClasspathEntry[] cp, String jarPath) {
-        for (int i = 0; i < cp.length; i++) {
-            String entry = cp[i].getPath().toPortableString();
-            if (entry.equals(jarPath)) {
-                return i;
-            }
-        }
-        return -1;
+		for (int i = 0; i < cp.length; i++) {
+			String entry = cp[i].getPath().toPortableString();
+			if (entry.equals(jarPath)) {
+				return i;
+			}
+		}
+		return -1;
 	}
-	
-	
-	private static void addEntryToJavaBuildPath(IJavaProject jp,
-			IClasspathAttribute attribute, String path, int eKind) {
+
+	private static void addEntryToJavaBuildPath(IJavaProject jp, IClasspathAttribute attribute, String path,
+			int eKind) {
 		IClasspathAttribute[] attributes = new IClasspathAttribute[] { attribute };
 		try {
 			IClasspathEntry[] originalCP = jp.getRawClasspath();
 			IClasspathEntry[] newCP = new IClasspathEntry[originalCP.length + 1];
 			IClasspathEntry cp = null;
 			if (eKind == IClasspathEntry.CPE_LIBRARY) {
-				cp = JavaCore.newLibraryEntry(
-						new Path(path), null, null, new IAccessRule[0], attributes, false);
+				cp = JavaCore.newLibraryEntry(new Path(path), null, null, new IAccessRule[0], attributes, false);
 			} else if (eKind == IClasspathEntry.CPE_VARIABLE) {
-				cp = JavaCore.newVariableEntry(
-						new Path(path), null, null, new IAccessRule[0], attributes, false);
+				cp = JavaCore.newVariableEntry(new Path(path), null, null, new IAccessRule[0], attributes, false);
 			} else if (eKind == IClasspathEntry.CPE_CONTAINER) {
-			    cp = JavaCore.newContainerEntry(new Path(path), null, attributes, false);
+				cp = JavaCore.newContainerEntry(new Path(path), null, attributes, false);
 			} else if (eKind == IClasspathEntry.CPE_PROJECT) {
-			    cp = JavaCore.newProjectEntry(new Path(path), null, true, attributes, false);
+				cp = JavaCore.newProjectEntry(new Path(path), null, true, attributes, false);
 			}
-			
+
 			// Update the raw classpath with the new entry.
 			if (cp != null) {
 				System.arraycopy(originalCP, 0, newCP, 0, originalCP.length);
@@ -1067,137 +1042,131 @@
 		return new Integer(entry).toString();
 	}
 
-    public static String getRestriction(IClasspathEntry pathEntry, String attributeName) {
-        IClasspathAttribute[] attributes = pathEntry.getExtraAttributes();
-        for (int i = 0; i < attributes.length; i++) {
-            IClasspathAttribute attribute = attributes[i];
-            if (attribute.getName().equals(attributeName)) {
-                String extraStr = attribute.getValue();
-                if (extraStr != null) {
-                    return extraStr;
-                }
-            }
-        }
+	public static String getRestriction(IClasspathEntry pathEntry, String attributeName) {
+		IClasspathAttribute[] attributes = pathEntry.getExtraAttributes();
+		for (int i = 0; i < attributes.length; i++) {
+			IClasspathAttribute attribute = attributes[i];
+			if (attribute.getName().equals(attributeName)) {
+				String extraStr = attribute.getValue();
+				if (extraStr != null) {
+					return extraStr;
+				}
+			}
+		}
 
-        return null;
-    }
-    
-    /**
-     * adds the classpath attribute to the entry with the default value if it doesn't already exist
-     * else does nothing
-     */
-    public static IClasspathEntry ensureHasAttribute(IClasspathEntry curr, String attributeName, String defaultVal) {
-        int index = indexOfAttribute(curr.getExtraAttributes(), attributeName);
-        if (index < 0) {
-            IClasspathAttribute[] attrs = curr.getExtraAttributes();
-            // must create a new entry with more extra attributes
-            IClasspathAttribute newAttr = JavaCore.newClasspathAttribute(attributeName, defaultVal);
-            IClasspathAttribute[] newAttrs;
-            if (attrs == null || attrs.length == 0) {
-                newAttrs = new IClasspathAttribute[] { newAttr };
-            } else {
-                newAttrs = new IClasspathAttribute[attrs.length+1];
-                System.arraycopy(attrs, 0, newAttrs, 0, attrs.length);
-                newAttrs[attrs.length] = newAttr;
-            }
-            return copyContainerEntry(curr, newAttrs);
-        } else {
-            return curr;
-        }
-    }
-    
-    /**
-     * adds the classpath attribute to the entry with the default value if it doesn't already exist
-     * else does nothing
-     */
-    public static IClasspathEntry ensureHasNoAttribute(IClasspathEntry curr, String attributeName) {
-        int index = indexOfAttribute(curr.getExtraAttributes(), attributeName);
-        if (index < 0) {
-            return curr;
-        } else {
-            IClasspathAttribute[] attrs = curr.getExtraAttributes();
-            // must create a new entry with more extra attributes
-            IClasspathAttribute[] newAttrs = new IClasspathAttribute[attrs.length-1];
-            for (int i = 0, j = 0; i < newAttrs.length; i++) {
-                if (i != index) {
-                    newAttrs[j] = attrs[i];
-                    j++;
-                }
-            }
-            return copyContainerEntry(curr, newAttrs);
-        }
-    }
-    
+		return null;
+	}
 
+	/**
+	 * adds the classpath attribute to the entry with the default value if it
+	 * doesn't already exist else does nothing
+	 */
+	public static IClasspathEntry ensureHasAttribute(IClasspathEntry curr, String attributeName, String defaultVal) {
+		int index = indexOfAttribute(curr.getExtraAttributes(), attributeName);
+		if (index < 0) {
+			IClasspathAttribute[] attrs = curr.getExtraAttributes();
+			// must create a new entry with more extra attributes
+			IClasspathAttribute newAttr = JavaCore.newClasspathAttribute(attributeName, defaultVal);
+			IClasspathAttribute[] newAttrs;
+			if (attrs == null || attrs.length == 0) {
+				newAttrs = new IClasspathAttribute[] { newAttr };
+			} else {
+				newAttrs = new IClasspathAttribute[attrs.length + 1];
+				System.arraycopy(attrs, 0, newAttrs, 0, attrs.length);
+				newAttrs[attrs.length] = newAttr;
+			}
+			return copyContainerEntry(curr, newAttrs);
+		} else {
+			return curr;
+		}
+	}
 
-    public static IClasspathEntry copyContainerEntry(IClasspathEntry containerEntry, 
-            IClasspathAttribute[] extraAttrs) {
-        return JavaCore.newContainerEntry(containerEntry.getPath(), 
-                containerEntry.getAccessRules(), extraAttrs, containerEntry.isExported());
-    }
-    
-    private static int indexOfAttribute(IClasspathAttribute[] attrs,
-            String attrName) {
-        for (int i = 0; i < attrs.length; i++) {
-            if (attrs[i].getName().equals(attrName)) {
-                return i;
-            }
-        }
-        return -1;
-    }
+	/**
+	 * adds the classpath attribute to the entry with the default value if it
+	 * doesn't already exist else does nothing
+	 */
+	public static IClasspathEntry ensureHasNoAttribute(IClasspathEntry curr, String attributeName) {
+		int index = indexOfAttribute(curr.getExtraAttributes(), attributeName);
+		if (index < 0) {
+			return curr;
+		} else {
+			IClasspathAttribute[] attrs = curr.getExtraAttributes();
+			// must create a new entry with more extra attributes
+			IClasspathAttribute[] newAttrs = new IClasspathAttribute[attrs.length - 1];
+			for (int i = 0, j = 0; i < newAttrs.length; i++) {
+				if (i != index) {
+					newAttrs[j] = attrs[i];
+					j++;
+				}
+			}
+			return copyContainerEntry(curr, newAttrs);
+		}
+	}
 
+	public static IClasspathEntry copyContainerEntry(IClasspathEntry containerEntry, IClasspathAttribute[] extraAttrs) {
+		return JavaCore.newContainerEntry(containerEntry.getPath(), containerEntry.getAccessRules(), extraAttrs,
+				containerEntry.isExported());
+	}
 
-    
-    /**
-     * Adds the classpath restriction to the given classpath entry.
-     * Returns the new classpath entry
-     */
-    public static IClasspathEntry updatePathRestrictions(IClasspathEntry entry,
-            String restrictionStr, String restrictionKind) {
-        IClasspathAttribute[] attrs = entry.getExtraAttributes();
-        int index = indexOfAttribute(attrs, restrictionKind);
-        IClasspathAttribute newAttr = JavaCore.newClasspathAttribute(restrictionKind, restrictionStr);
-        if (index >= 0) {
-            // just replace
-            attrs[index] = newAttr;
-        } else {
-            // must create a new entry with more extra attributes
-            IClasspathAttribute[] newAttrs;
-            if (attrs == null || attrs.length == 0) {
-                newAttrs = new IClasspathAttribute[] { newAttr };
-            } else {
-                newAttrs = new IClasspathAttribute[attrs.length+1];
-                System.arraycopy(attrs, 0, newAttrs, 0, attrs.length);
-                newAttrs[attrs.length] = newAttr;
-            }
-            entry = copyContainerEntry(entry, newAttrs);
-        }
-        return entry;
-    }
+	private static int indexOfAttribute(IClasspathAttribute[] attrs, String attrName) {
+		for (int i = 0; i < attrs.length; i++) {
+			if (attrs[i].getName().equals(attrName)) {
+				return i;
+			}
+		}
+		return -1;
+	}
 
-    /**
-     * If this classpath entry's path already exists on the classpath, then it is replaced
-     * else it is added
-     */
-    public static void updateClasspathEntry(IProject project, IClasspathEntry newEntry) {
-        IJavaProject jProject = JavaCore.create(project);
-        try {
-            IClasspathEntry[] entries = jProject.getRawClasspath();
-            for (int i = 0; i < entries.length; i++) {
-                IClasspathEntry entry = entries[i];
-                if (newEntry.getPath().equals(entry.getPath())) {
-                    entries[i] = newEntry;
-                    jProject.setRawClasspath(entries, null);
-                    return;
-                }
-            }
-            
-            // entry not found on classpath...add it
-            IClasspathEntry[] newEntries = new IClasspathEntry[entries.length + 1];
-            System.arraycopy(entries, 0, newEntries, 0, entries.length);
-            newEntries[entries.length] = newEntry;
-            jProject.setRawClasspath(newEntries, null);
-        } catch (JavaModelException e) {
-        }
-    }
+	/**
+	 * Adds the classpath restriction to the given classpath entry. Returns the
+	 * new classpath entry
+	 */
+	public static IClasspathEntry updatePathRestrictions(IClasspathEntry entry, String restrictionStr,
+			String restrictionKind) {
+		IClasspathAttribute[] attrs = entry.getExtraAttributes();
+		int index = indexOfAttribute(attrs, restrictionKind);
+		IClasspathAttribute newAttr = JavaCore.newClasspathAttribute(restrictionKind, restrictionStr);
+		if (index >= 0) {
+			// just replace
+			attrs[index] = newAttr;
+		} else {
+			// must create a new entry with more extra attributes
+			IClasspathAttribute[] newAttrs;
+			if (attrs == null || attrs.length == 0) {
+				newAttrs = new IClasspathAttribute[] { newAttr };
+			} else {
+				newAttrs = new IClasspathAttribute[attrs.length + 1];
+				System.arraycopy(attrs, 0, newAttrs, 0, attrs.length);
+				newAttrs[attrs.length] = newAttr;
+			}
+			entry = copyContainerEntry(entry, newAttrs);
+		}
+		return entry;
+	}
+
+	/**
+	 * If this classpath entry's path already exists on the classpath, then it
+	 * is replaced else it is added
+	 */
+	public static void updateClasspathEntry(IProject project, IClasspathEntry newEntry) {
+		IJavaProject jProject = JavaCore.create(project);
+		try {
+			IClasspathEntry[] entries = jProject.getRawClasspath();
+			for (int i = 0; i < entries.length; i++) {
+				IClasspathEntry entry = entries[i];
+				if (newEntry.getPath().equals(entry.getPath())) {
+					entries[i] = newEntry;
+					jProject.setRawClasspath(entries, null);
+					return;
+				}
+			}
+
+			// entry not found on classpath...add it
+			IClasspathEntry[] newEntries = new IClasspathEntry[entries.length + 1];
+			System.arraycopy(entries, 0, newEntries, 0, entries.length);
+			newEntries[entries.length] = newEntry;
+			jProject.setRawClasspath(newEntries, null);
+		} catch (JavaModelException e) {
+		}
+	}
 }