Example usage for org.eclipse.jdt.internal.core SetContainerOperation SetContainerOperation

List of usage examples for org.eclipse.jdt.internal.core SetContainerOperation SetContainerOperation

Introduction

In this page you can find the example usage for org.eclipse.jdt.internal.core SetContainerOperation SetContainerOperation.

Prototype

public SetContainerOperation(IPath containerPath, IJavaProject[] affectedProjects,
            IClasspathContainer[] respectiveContainers) 

Source Link

Usage

From source file:org.eclipse.jdt.internal.core.JavaModelManager.java

License:Open Source License

public IClasspathContainer getClasspathContainer(final IPath containerPath, final IJavaProject project)
        throws JavaModelException {

    IClasspathContainer container = containerGet(project, containerPath);

    if (container == null) {
        if (batchContainerInitializations()) {
            // avoid deep recursion while initializing container on workspace restart
            // (see https://bugs.eclipse.org/bugs/show_bug.cgi?id=60437)
            try {
                container = initializeAllContainers(project, containerPath);
            } finally {
                batchInitializationFinished();
            }/*  w w w. j  av a2 s . c  o m*/
        } else {
            container = initializeContainer(project, containerPath);
            containerBeingInitializedRemove(project, containerPath);
            SetContainerOperation operation = new SetContainerOperation(containerPath,
                    new IJavaProject[] { project }, new IClasspathContainer[] { container });
            operation.runOperation(null);
        }
    }
    return container;
}

From source file:org.eclipse.jdt.internal.core.JavaModelManager.java

License:Open Source License

private IClasspathContainer initializeAllContainers(IJavaProject javaProjectToInit, IPath containerToInit)
        throws JavaModelException {
    if (CP_RESOLVE_VERBOSE_ADVANCED)
        verbose_batching_containers_initialization(javaProjectToInit, containerToInit);

    // collect all container paths
    final HashMap allContainerPaths = new HashMap();
    IProject[] projects = ResourcesPlugin.getWorkspace().getRoot().getProjects();
    for (int i = 0, length = projects.length; i < length; i++) {
        IProject project = projects[i];/*from ww w  . j  a v  a 2 s.com*/
        if (!JavaProject.hasJavaNature(project))
            continue;
        IJavaProject javaProject = new JavaProject(project, getJavaModel());
        HashSet paths = (HashSet) allContainerPaths.get(javaProject);
        IClasspathEntry[] rawClasspath = javaProject.getRawClasspath();
        for (int j = 0, length2 = rawClasspath.length; j < length2; j++) {
            IClasspathEntry entry = rawClasspath[j];
            IPath path = entry.getPath();
            if (entry.getEntryKind() == IClasspathEntry.CPE_CONTAINER
                    && containerGet(javaProject, path) == null) {
                if (paths == null) {
                    paths = new HashSet();
                    allContainerPaths.put(javaProject, paths);
                }
                paths.add(path);
            }
        }
        /* TODO (frederic) put back when JDT/UI dummy project will be thrown away...
         * See https://bugs.eclipse.org/bugs/show_bug.cgi?id=97524
         *
        if (javaProject.equals(javaProjectToInit)) {
           if (paths == null) {
              paths = new HashSet();
              allContainerPaths.put(javaProject, paths);
           }
           paths.add(containerToInit);
        }
        */
    }
    // TODO (frederic) remove following block when JDT/UI dummy project will be thrown away...
    if (javaProjectToInit != null) {
        HashSet containerPaths = (HashSet) allContainerPaths.get(javaProjectToInit);
        if (containerPaths == null) {
            containerPaths = new HashSet();
            allContainerPaths.put(javaProjectToInit, containerPaths);
        }
        containerPaths.add(containerToInit);
    }
    // end block

    // initialize all containers
    boolean ok = false;
    try {
        // if possible run inside an IWokspaceRunnable with AVOID_UPATE to avoid unwanted builds
        // (see https://bugs.eclipse.org/bugs/show_bug.cgi?id=118507)
        IWorkspaceRunnable runnable = new IWorkspaceRunnable() {
            public void run(IProgressMonitor monitor) throws CoreException {
                try {
                    // Collect all containers
                    Set entrySet = allContainerPaths.entrySet();
                    int length = entrySet.size();
                    if (monitor != null)
                        monitor.beginTask("", length); //$NON-NLS-1$
                    Map.Entry[] entries = new Map.Entry[length]; // clone as the following will have a side effect
                    entrySet.toArray(entries);
                    for (int i = 0; i < length; i++) {
                        Map.Entry entry = entries[i];
                        IJavaProject javaProject = (IJavaProject) entry.getKey();
                        HashSet pathSet = (HashSet) entry.getValue();
                        if (pathSet == null)
                            continue;
                        int length2 = pathSet.size();
                        IPath[] paths = new IPath[length2];
                        pathSet.toArray(paths); // clone as the following will have a side effect
                        for (int j = 0; j < length2; j++) {
                            IPath path = paths[j];
                            initializeContainer(javaProject, path);
                            IClasspathContainer container = containerBeingInitializedGet(javaProject, path);
                            if (container != null) {
                                containerPut(javaProject, path, container);
                            }
                        }
                        if (monitor != null)
                            monitor.worked(1);
                    }

                    // Set all containers
                    Map perProjectContainers = (Map) JavaModelManager.this.containersBeingInitialized.get();
                    if (perProjectContainers != null) {
                        Iterator entriesIterator = perProjectContainers.entrySet().iterator();
                        while (entriesIterator.hasNext()) {
                            Map.Entry entry = (Map.Entry) entriesIterator.next();
                            IJavaProject project = (IJavaProject) entry.getKey();
                            HashMap perPathContainers = (HashMap) entry.getValue();
                            Iterator containersIterator = perPathContainers.entrySet().iterator();
                            while (containersIterator.hasNext()) {
                                Map.Entry containerEntry = (Map.Entry) containersIterator.next();
                                IPath containerPath = (IPath) containerEntry.getKey();
                                IClasspathContainer container = (IClasspathContainer) containerEntry.getValue();
                                SetContainerOperation operation = new SetContainerOperation(containerPath,
                                        new IJavaProject[] { project },
                                        new IClasspathContainer[] { container });
                                operation.runOperation(monitor);
                            }
                        }
                        JavaModelManager.this.containersBeingInitialized.set(null);
                    }
                } finally {
                    if (monitor != null)
                        monitor.done();
                }
            }
        };
        IProgressMonitor monitor = this.batchContainerInitializationsProgress;
        IWorkspace workspace = ResourcesPlugin.getWorkspace();
        if (workspace.isTreeLocked())
            runnable.run(monitor);
        else
            workspace.run(runnable, null/*don't take any lock*/, IWorkspace.AVOID_UPDATE, monitor);
        ok = true;
    } catch (CoreException e) {
        // ignore
        Util.log(e, "Exception while initializing all containers"); //$NON-NLS-1$
    } finally {
        if (!ok) {
            // if we're being traversed by an exception, ensure that that containers are
            // no longer marked as initialization in progress
            // (see https://bugs.eclipse.org/bugs/show_bug.cgi?id=66437)
            this.containerInitializationInProgress.set(null);
        }
    }

    return containerGet(javaProjectToInit, containerToInit);
}