Buggy code:
public IClasspathEntry [ ] getClasspathEntries ( ) { } public String getDescription ( ) { } public int getKind ( ) { } public IPath getPath ( ) { } public String toString ( ) { } } private final class VariablesAndContainersLoadHelper { private static final int ARRAY_INCREMENT = 200 ; private IClasspathEntry [ ] allClasspathEntries ; private int allClasspathEntryCount ; private final Map allPaths ; private String [ ] allStrings ; private int allStringsCount ; private final DataInputStream in ; VariablesAndContainersLoadHelper ( DataInputStream in ) { } void load ( ) throws IOException { } private IAccessRule loadAccessRule ( ) throws IOException { } private IAccessRule [ ] loadAccessRules ( ) throws IOException { } private IClasspathAttribute loadAttribute ( ) throws IOException { } private IClasspathAttribute [ ] loadAttributes ( ) throws IOException { } private boolean loadBoolean ( ) throws IOException { } private IClasspathEntry [ ] loadClasspathEntries ( ) throws IOException { } private IClasspathEntry loadClasspathEntry ( ) throws IOException { } private void loadContainers ( IJavaProject project ) throws IOException { } private int loadInt ( ) throws IOException { } private IPath loadPath ( ) throws IOException { } private IPath [ ] loadPaths ( ) throws IOException { } private void loadProjects ( IJavaModel model ) throws IOException { } private String loadString ( ) throws IOException { } private void loadVariables ( ) throws IOException { } } protected synchronized Object peekAtInfo ( IJavaElement element ) { } public void prepareToSave ( ISaveContext context ) { } protected synchronized void putInfos ( IJavaElement openedElement , Map newElements ) { } protected synchronized void putJarTypeInfo ( IJavaElement type , Object info ) { } protected Object readState ( IProject project ) throws CoreException { } public static void recreatePersistedContainer ( String propertyName , String containerString , boolean addToContainerValues ) { } private static void recreatePersistedContainer ( final IJavaProject project , final IPath containerPath , String containerString , boolean addToContainerValues ) { } public void rememberScope ( AbstractSearchScope scope ) { } public synchronized Object removeInfoAndChildren ( JavaElement element ) throws JavaModelException { } public void removePerProjectInfo ( JavaProject javaProject ) { } public void resetProjectOptions ( JavaProject javaProject ) { } public void resetProjectPreferences ( JavaProject javaProject ) { } public static final void doNotUse ( ) { } protected synchronized void resetJarTypeCache ( ) { } public void resetTemporaryCache ( ) { } public void rollback ( ISaveContext context ) { } private void saveState ( JavaModelManager . PerProjectInfo info , ISaveContext context ) throws CoreException { } private void saveBuiltState ( JavaModelManager . PerProjectInfo info ) throws CoreException { } private void saveVariablesAndContainers ( ) throws CoreException { } private final class VariablesAndContainersSaveHelper { private final HashtableOfObjectToInt classpathEntryIds ; private final DataOutputStream out ; private final HashtableOfObjectToInt stringIds ; VariablesAndContainersSaveHelper ( DataOutputStream out ) { } void save ( ) throws IOException , JavaModelException { } private void saveAccessRule ( ClasspathAccessRule rule ) throws IOException { } private void saveAccessRules ( IAccessRule [ ] rules ) throws IOException { } private void saveAttribute ( IClasspathAttribute attribute ) throws IOException { } private void saveAttributes ( IClasspathAttribute [ ] attributes ) throws IOException { } private void saveClasspathEntries ( IClasspathEntry [ ] entries ) throws IOException { } private void saveClasspathEntry ( IClasspathEntry entry ) throws IOException { } private void saveContainers ( IJavaProject project , Map containerMap ) throws IOException { } private void saveInt ( int value ) throws IOException { } private boolean saveNewId ( Object key , HashtableOfObjectToInt map ) throws IOException { } private void savePath ( IPath path ) throws IOException { } private void savePaths ( IPath [ ] paths ) throws IOException { } private void saveProjects ( IJavaProject [ ] projects ) throws IOException , JavaModelException { } private void saveString ( String string ) throws IOException { } private void saveVariables ( Map map ) throws IOException { } } private void traceVariableAndContainers ( String action , long start ) { } public void saving ( ISaveContext context ) throws CoreException { } public void secondaryTypeAdding ( String path , char [ ] key ) { } public Map secondaryTypes ( IJavaProject project , boolean waitForIndexes , IProgressMonitor monitor ) throws JavaModelException { } private Hashtable secondaryTypesMerging ( Hashtable secondaryTypes ) { } private Map secondaryTypesSearching ( IJavaProject project , boolean waitForIndexes , IProgressMonitor monitor , final JavaModelManager . PerProjectInfo projectInfo ) throws JavaModelException { } public void secondaryTypesRemoving ( IFile file , boolean cleanIndexCache ) { } private void secondaryTypesRemoving ( Hashtable secondaryTypesMap , IFile file ) { } protected void setBuildOrder ( String [ ] javaBuildOrder ) throws JavaModelException { } public void setLastBuiltState ( IProject project , Object state ) { } public void setOptions ( Hashtable newOptions ) { } public void startup ( ) throws CoreException { } private void startIndexing ( ) { } public void shutdown ( ) { JavaCore javaCore = JavaCore . getJavaCore ( ) ; javaCore . savePluginPreferences ( ) ; IWorkspace workspace = ResourcesPlugin . getWorkspace ( ) ; workspace . removeResourceChangeListener ( this . deltaState ) ; workspace . removeSaveParticipant ( javaCore ) ; Platform . getContentTypeManager ( ) . removeContentTypeChangeListener ( this ) ; if ( ( this . indexManager ) != null ) { this . indexManager . shutdown ( ) ; } try { <START_BUG> Platform . getJobManager ( ) . join ( JavaCore . PLUGIN_ID , null ) ; <END_BUG> } catch ( InterruptedException e ) { } } public synchronized IPath variableGet ( String variableName ) { } private HashSet variableInitializationInProgress ( ) { } public synchronized String [ ] variableNames ( ) { } public synchronized void variablePut ( String variableName , IPath variablePath ) { } public void variablePreferencesPut ( String variableName , IPath variablePath ) { } public void contentTypeChanged ( IContentTypeManager . ContentTypeChangeEvent event ) { } public synchronized String cacheToString ( String prefix ) { } }

Fix:
Job . getJobManager ( ) . join ( JavaCore . PLUGIN_ID , null ) ;