private void doInitializeCache() throws CoreException {
   if (!isInitialized) {
     IWorkspaceRunnable runnable =
         new IWorkspaceRunnable() {
           @Override
           public void run(IProgressMonitor monitor) throws CoreException {
             if (!isInitialized) {
               for (IProject project : workspace.getRoot().getProjects()) {
                 if (project.isAccessible() && JavaProject.hasJavaNature(project)) {
                   IJavaProject javaProject = JavaCore.create(project);
                   updateCache(javaProject);
                 }
               }
               isInitialized = true;
             }
           }
         };
     // while the tree is locked, workspace.run may not be used but we are sure that we do already
     // hold the workspace lock - save to just run the action code
     if (workspace.isTreeLocked()) {
       runnable.run(null);
     } else {
       workspace.run(runnable, null, IWorkspace.AVOID_UPDATE, null);
     }
   }
 }