### Eclipse Workspace Patch 1.0 #P org.eclipse.jdt.ui Index: core extension/org/eclipse/jdt/internal/corext/util/TypeInfo.java =================================================================== RCS file: /home/eclipse/org.eclipse.jdt.ui/core extension/org/eclipse/jdt/internal/corext/util/TypeInfo.java,v retrieving revision 1.18 diff -u -r1.18 TypeInfo.java --- core extension/org/eclipse/jdt/internal/corext/util/TypeInfo.java 24 Nov 2005 16:00:52 -0000 1.18 +++ core extension/org/eclipse/jdt/internal/corext/util/TypeInfo.java 26 Apr 2006 08:22:04 -0000 @@ -278,5 +278,9 @@ buf.append("; name= "); //$NON-NLS-1$ buf.append(fName); return buf.toString(); - } -} + } + + public abstract long getContainerTimestamp(); + + public abstract boolean isContainerDirty(); +} \ No newline at end of file Index: core extension/org/eclipse/jdt/internal/corext/util/IFileTypeInfo.java =================================================================== RCS file: /home/eclipse/org.eclipse.jdt.ui/core extension/org/eclipse/jdt/internal/corext/util/IFileTypeInfo.java,v retrieving revision 1.16 diff -u -r1.16 IFileTypeInfo.java --- core extension/org/eclipse/jdt/internal/corext/util/IFileTypeInfo.java 29 Nov 2005 10:01:46 -0000 1.16 +++ core extension/org/eclipse/jdt/internal/corext/util/IFileTypeInfo.java 26 Apr 2006 08:22:04 -0000 @@ -10,11 +10,22 @@ *******************************************************************************/ package org.eclipse.jdt.internal.corext.util; +import java.net.URI; + +import org.eclipse.core.filesystem.EFS; +import org.eclipse.core.filesystem.IFileInfo; + +import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IPath; +import org.eclipse.core.runtime.Path; + +import org.eclipse.core.filebuffers.FileBuffers; +import org.eclipse.core.filebuffers.ITextFileBuffer; +import org.eclipse.core.filebuffers.ITextFileBufferManager; + import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.IWorkspaceRoot; import org.eclipse.core.resources.ResourcesPlugin; -import org.eclipse.core.runtime.IPath; -import org.eclipse.core.runtime.Path; import org.eclipse.jdt.core.IJavaElement; import org.eclipse.jdt.core.JavaCore; @@ -120,4 +131,36 @@ public String getExtension() { return fExtension; } -} + + public long getContainerTimestamp() { + IWorkspaceRoot root= ResourcesPlugin.getWorkspace().getRoot(); + IPath path= new Path(getPath()); + IResource resource= root.findMember(path); + if (resource != null) { + URI location= resource.getLocationURI(); + if (location != null) { + try { + IFileInfo info= EFS.getStore(location).fetchInfo(); + if (info.exists()) { + return info.getLastModified(); + } + } catch (CoreException e) { + // Fall through + } + } + } + return IResource.NULL_STAMP; + } + + public boolean isContainerDirty() { + IWorkspaceRoot root= ResourcesPlugin.getWorkspace().getRoot(); + IPath path= new Path(getPath()); + IResource resource= root.findMember(path); + ITextFileBufferManager manager= FileBuffers.getTextFileBufferManager(); + ITextFileBuffer textFileBuffer= manager.getTextFileBuffer(resource.getFullPath()); + if (textFileBuffer != null) { + return textFileBuffer.isDirty(); + } + return false; + } +} \ No newline at end of file Index: core extension/org/eclipse/jdt/internal/corext/util/JarFileEntryTypeInfo.java =================================================================== RCS file: /home/eclipse/org.eclipse.jdt.ui/core extension/org/eclipse/jdt/internal/corext/util/JarFileEntryTypeInfo.java,v retrieving revision 1.14 diff -u -r1.14 JarFileEntryTypeInfo.java --- core extension/org/eclipse/jdt/internal/corext/util/JarFileEntryTypeInfo.java 18 Nov 2005 13:27:53 -0000 1.14 +++ core extension/org/eclipse/jdt/internal/corext/util/JarFileEntryTypeInfo.java 26 Apr 2006 08:22:04 -0000 @@ -10,12 +10,19 @@ *******************************************************************************/ package org.eclipse.jdt.internal.corext.util; +import java.net.URI; import java.util.Arrays; import java.util.List; +import org.eclipse.core.filesystem.EFS; +import org.eclipse.core.filesystem.IFileInfo; + +import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.Path; +import org.eclipse.core.resources.IResource; +import org.eclipse.core.resources.IWorkspaceRoot; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.jdt.core.IJavaElement; @@ -131,6 +138,34 @@ getElementPath(result); return result.toString(); } + + public long getContainerTimestamp() { + // First try internal Jar + IWorkspaceRoot root= ResourcesPlugin.getWorkspace().getRoot(); + IPath path= new Path(fJar); + IResource resource= root.findMember(path); + IFileInfo info= null; + if (resource != null && resource.exists()) { + URI location= resource.getLocationURI(); + if (location != null) { + try { + info= EFS.getStore(location).fetchInfo(); + } catch (CoreException e) { + // Fall through + } + } + } else { + info= EFS.getLocalFileSystem().getStore(Path.fromOSString(fJar)).fetchInfo(); + } + if (info != null && info.exists()) { + return info.getLastModified(); + } + return IResource.NULL_STAMP; + } + + public boolean isContainerDirty() { + return false; + } private void getElementPath(StringBuffer result) { String pack= getPackageName(); @@ -142,4 +177,4 @@ result.append('.'); result.append(getExtension()); } -} +} \ No newline at end of file Index: core extension/org/eclipse/jdt/internal/corext/util/UnresolvableTypeInfo.java =================================================================== RCS file: /home/eclipse/org.eclipse.jdt.ui/core extension/org/eclipse/jdt/internal/corext/util/UnresolvableTypeInfo.java,v retrieving revision 1.8 diff -u -r1.8 UnresolvableTypeInfo.java --- core extension/org/eclipse/jdt/internal/corext/util/UnresolvableTypeInfo.java 17 Jun 2005 15:51:52 -0000 1.8 +++ core extension/org/eclipse/jdt/internal/corext/util/UnresolvableTypeInfo.java 26 Apr 2006 08:22:04 -0000 @@ -13,6 +13,8 @@ import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.Path; +import org.eclipse.core.resources.IResource; + import org.eclipse.jdt.core.IJavaElement; import org.eclipse.jdt.core.search.IJavaSearchScope; @@ -55,4 +57,12 @@ protected IJavaElement getContainer(IJavaSearchScope scope) { return null; } -} + + public long getContainerTimestamp() { + return IResource.NULL_STAMP; + } + + public boolean isContainerDirty() { + return false; + } +} \ No newline at end of file Index: core extension/org/eclipse/jdt/internal/corext/util/OpenTypeHistory.java =================================================================== RCS file: /home/eclipse/org.eclipse.jdt.ui/core extension/org/eclipse/jdt/internal/corext/util/OpenTypeHistory.java,v retrieving revision 1.5 diff -u -r1.5 OpenTypeHistory.java --- core extension/org/eclipse/jdt/internal/corext/util/OpenTypeHistory.java 11 Apr 2006 18:03:34 -0000 1.5 +++ core extension/org/eclipse/jdt/internal/corext/util/OpenTypeHistory.java 26 Apr 2006 08:22:04 -0000 @@ -13,8 +13,10 @@ import java.util.ArrayList; import java.util.Collection; import java.util.Collections; +import java.util.HashMap; import java.util.Iterator; import java.util.List; +import java.util.Map; import java.util.StringTokenizer; import org.eclipse.core.runtime.IProgressMonitor; @@ -24,6 +26,8 @@ import org.eclipse.core.runtime.Status; import org.eclipse.core.runtime.jobs.Job; +import org.eclipse.core.resources.IResource; + import org.eclipse.jdt.core.ElementChangedEvent; import org.eclipse.jdt.core.ICompilationUnit; import org.eclipse.jdt.core.IElementChangedListener; @@ -149,6 +153,8 @@ // Needs to be volatile since accesses aren't synchronized. private volatile boolean fNeedsConsistencyCheck; + // Map of cached time stamps + private Map fTimestampMapping; private final IElementChangedListener fDeltaListener; private final UpdateJob fUpdateJob; @@ -162,6 +168,7 @@ private static final String NODE_ENCLOSING_NAMES= "enclosingTypes"; //$NON-NLS-1$ private static final String NODE_PATH= "path"; //$NON-NLS-1$ private static final String NODE_MODIFIERS= "modifiers"; //$NON-NLS-1$ + private static final String NODE_TIMESTAMP= "timestamp"; //$NON-NLS-1$ private static final char[][] EMPTY_ENCLOSING_NAMES= new char[0][0]; private static OpenTypeHistory fgInstance; @@ -181,8 +188,9 @@ private OpenTypeHistory() { super(FILENAME, NODE_ROOT, NODE_TYPE_INFO); fTypeInfoFactory= new TypeInfoFactory(); - load(); + fTimestampMapping= new HashMap(); fNeedsConsistencyCheck= true; + load(); fDeltaListener= new TypeHistoryDeltaListener(); JavaCore.addElementChangedListener(fDeltaListener); fUpdateJob= new UpdateJob(); @@ -229,10 +237,12 @@ } public synchronized void accessed(TypeInfo info) { + fTimestampMapping.put(info, new Long(info.getContainerTimestamp())); super.accessed(info); } public synchronized TypeInfo remove(TypeInfo info) { + fTimestampMapping.remove(info); return (TypeInfo)super.remove(info); } @@ -270,11 +280,15 @@ // markAsInconsistent isn't synchronized. fNeedsConsistencyCheck= true; IJavaSearchScope scope= SearchEngine.createWorkspaceScope(); - List keys= new ArrayList(getKeys()); - monitor.beginTask(CorextMessages.TypeInfoHistory_consistency_check, keys.size()); + List typesToCheck= new ArrayList(getKeys()); + monitor.beginTask(CorextMessages.TypeInfoHistory_consistency_check, typesToCheck.size()); monitor.setTaskName(CorextMessages.TypeInfoHistory_consistency_check); - for (Iterator iter= keys.iterator(); iter.hasNext();) { + for (Iterator iter= typesToCheck.iterator(); iter.hasNext();) { TypeInfo type= (TypeInfo)iter.next(); + long currentTimestamp= type.getContainerTimestamp(); + Long lastTested= (Long)fTimestampMapping.get(type); + if (lastTested != null && currentTimestamp == lastTested.longValue() && !type.isContainerDirty()) + continue; try { IType jType= type.resolveType(scope); if (jType == null || !jType.exists()) { @@ -282,6 +296,7 @@ } else { // copy over the modifiers since they may have changed type.setModifiers(jType.getFlags()); + fTimestampMapping.put(type, new Long(currentTimestamp)); } } catch (JavaModelException e) { remove(type); @@ -296,6 +311,7 @@ private void doShutdown() { JavaCore.removeElementChangedListener(fDeltaListener); + save(); } protected Object createFromElement(Element type) { @@ -311,6 +327,19 @@ } TypeInfo info= fTypeInfoFactory.create( pack.toCharArray(), name.toCharArray(), enclosingNames, modifiers, path); + long timestamp= IResource.NULL_STAMP; + String timestampValue= type.getAttribute(NODE_TIMESTAMP); + if (timestampValue != null && timestampValue.length() > 0) { + try { + timestamp= Long.parseLong(timestampValue); + } catch (NumberFormatException e) { + // take null stamp + } + } + long currentTimestamp= info.getContainerTimestamp(); + if (timestamp != IResource.NULL_STAMP && currentTimestamp != IResource.NULL_STAMP && timestamp == currentTimestamp) { + fTimestampMapping.put(info, new Long(currentTimestamp)); + } return info; } @@ -321,6 +350,7 @@ typeElement.setAttribute(NODE_ENCLOSING_NAMES, type.getEnclosingName()); typeElement.setAttribute(NODE_PATH, type.getPath()); typeElement.setAttribute(NODE_MODIFIERS, Integer.toString(type.getModifiers())); + typeElement.setAttribute(NODE_TIMESTAMP, Long.toString(type.getContainerTimestamp())); } private char[][] getEnclosingNames(Element type) { Index: ui/org/eclipse/jdt/internal/ui/dialogs/TypeSelectionDialog2.java =================================================================== RCS file: /home/eclipse/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/dialogs/TypeSelectionDialog2.java,v retrieving revision 1.19 diff -u -r1.19 TypeSelectionDialog2.java --- ui/org/eclipse/jdt/internal/ui/dialogs/TypeSelectionDialog2.java 28 Mar 2006 16:53:25 -0000 1.19 +++ ui/org/eclipse/jdt/internal/ui/dialogs/TypeSelectionDialog2.java 26 Apr 2006 08:22:04 -0000 @@ -260,14 +260,15 @@ for (int i= 0; i < selected.length; i++) { try { TypeInfo typeInfo= selected[i]; - history.accessed(typeInfo); IType type= typeInfo.resolveType(fScope); if (type == null) { String title= JavaUIMessages.TypeSelectionDialog_errorTitle; String message= Messages.format(JavaUIMessages.TypeSelectionDialog_dialogMessage, typeInfo.getPath()); MessageDialog.openError(getShell(), title, message); + history.remove(typeInfo); setResult(null); } else { + history.accessed(typeInfo); result.add(type); } } catch (JavaModelException e) {