blob: 62372e721b8888e8f034215faae1d25cf3cc73bc [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2009 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.jst.common.jdt.internal.javalite;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IResourceChangeEvent;
import org.eclipse.core.resources.IResourceChangeListener;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.IPath;
import org.eclipse.jdt.core.ClasspathContainerInitializer;
import org.eclipse.jdt.core.ElementChangedEvent;
import org.eclipse.jdt.core.IAccessRule;
import org.eclipse.jdt.core.IClasspathAttribute;
import org.eclipse.jdt.core.IClasspathEntry;
import org.eclipse.jdt.core.IElementChangedListener;
import org.eclipse.jdt.core.IJavaElement;
import org.eclipse.jdt.core.IJavaElementDelta;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jdt.internal.core.JavaModelManager;
public final class JavaCoreLite {
public static String NATURE_ID = JavaCore.NATURE_ID;
private static Object lock = new Object();
private static JavaCoreLite INSTANCE = null;
private class JavaCoreLiteListener implements IElementChangedListener, IResourceChangeListener {
public void elementChanged(ElementChangedEvent event) {
IJavaElementDelta delta = event.getDelta();
IJavaElementDelta[] children = delta.getAffectedChildren();
for (int i = 0; i < children.length; i++) {
processDelta(children[i]);
}
}
private void processDelta(IJavaElementDelta delta) {
int flags = delta.getFlags();
if ((flags & IJavaElementDelta.F_CLOSED) != 0) {
IJavaElement element = delta.getElement();
IJavaProject javaProject = (IJavaProject) element;
IProject project = javaProject.getProject();
synchronized (lock) {
initializedJavaProjects.remove(project);
javaProjectLiteCache.remove(project);
}
} else if ((flags & IJavaElementDelta.F_CLASSPATH_CHANGED) != 0) {
IJavaElement element = delta.getElement();
if (element.getElementType() == IJavaElement.JAVA_PROJECT) {
IJavaProject javaProject = (IJavaProject) element;
IProject project = javaProject.getProject();
synchronized (lock) {
if (!initializedJavaProjects.contains(project) && javaProjectLiteCache.containsKey(project)) {
JavaProjectLite javaProjectLite = javaProjectLiteCache.get(project);
javaProjectLite.flushClasspath();
}
}
}
} else if ((flags & IJavaElementDelta.F_RESOLVED_CLASSPATH_CHANGED) != 0) {
IJavaElement element = delta.getElement();
if (element.getElementType() == IJavaElement.JAVA_PROJECT) {
IJavaProject javaProject = (IJavaProject) element;
IProject project = javaProject.getProject();
synchronized (lock) {
if (!initializedJavaProjects.contains(project)) {
initializedJavaProjects.add(project);
if (javaProjectLiteCache.containsKey(project)) {
JavaProjectLite javaProjectLite = javaProjectLiteCache.get(project);
javaProjectLite.markJavaProjectInitialized();
}
}
}
}
}
}
public void resourceChanged(IResourceChangeEvent event) {
switch (event.getType()) {
case IResourceChangeEvent.PRE_CLOSE:
case IResourceChangeEvent.PRE_DELETE:
IResource resource = event.getResource();
if (resource.getType() == IResource.PROJECT) {
IProject project = (IProject) resource;
synchronized (lock) {
initializedJavaProjects.remove(project);
javaProjectLiteCache.remove(project);
}
}
}
}
}
private Set<IProject> initializedJavaProjects = new HashSet<IProject>();
private Map<IProject, JavaProjectLite> javaProjectLiteCache = new HashMap<IProject, JavaProjectLite>();
private JavaCoreLiteListener listener = null;
private static JavaCoreLite getInstance() {
synchronized (lock) {
if (INSTANCE == null) {
INSTANCE = new JavaCoreLite();
}
}
return INSTANCE;
}
private JavaCoreLite() {
listener = new JavaCoreLiteListener();
JavaCore.addElementChangedListener(listener);
ResourcesPlugin.getWorkspace().addResourceChangeListener(listener, IResourceChangeEvent.PRE_CLOSE | IResourceChangeEvent.PRE_DELETE);
}
private IJavaProjectLite createImpl(IProject project) {
synchronized (lock) {
if (javaProjectLiteCache.containsKey(project)) {
return javaProjectLiteCache.get(project);
}
}
IJavaProject javaProject = JavaCore.create(project);
if (javaProject != null) {
boolean javaProjectInitialized = false;
synchronized (lock) {
javaProjectInitialized = initializedJavaProjects.contains(project);
}
if (!javaProjectInitialized) {
if (isInitialized(javaProject)) {
synchronized (lock) {
initializedJavaProjects.add(project);
}
javaProjectInitialized = true;
}
}
JavaProjectLite javaProjectLite = new JavaProjectLite(javaProject, javaProjectInitialized);
synchronized (lock) {
javaProjectLiteCache.put(project, javaProjectLite);
}
return javaProjectLite;
}
return null;
}
static boolean isInitialized(IJavaProject javaProject) {
if (javaProject.isOpen()) {
JavaModelManager.PerProjectInfo projectInfo = JavaModelManager.getJavaModelManager().getPerProjectInfo(javaProject.getProject(), false);
if (projectInfo != null) {
if (projectInfo.getResolvedClasspath() != null) {
return true;
}
}
}
return false;
}
public static final IJavaProjectLite create(IProject project) {
if (project == null) {
throw new NullPointerException();
}
return getInstance().createImpl(project);
}
public static final IJavaProjectLite create(IJavaProject javaProject) {
if (javaProject == null) {
throw new NullPointerException();
}
return create(javaProject.getProject());
}
public static ClasspathContainerInitializer getClasspathContainerInitializer(String containerID) {
return JavaCore.getClasspathContainerInitializer(containerID);
}
public static IClasspathEntry newProjectEntry(IPath path) {
return JavaCore.newProjectEntry(path);
}
public static IClasspathEntry newProjectEntry(IPath path, boolean isExported) {
return JavaCore.newProjectEntry(path, isExported);
}
public static IClasspathEntry newProjectEntry(IPath path, IAccessRule[] accessRules, boolean combineAccessRules, IClasspathAttribute[] extraAttributes, boolean isExported) {
return JavaCore.newProjectEntry(path, accessRules, combineAccessRules, extraAttributes, isExported);
}
public static IClasspathEntry newLibraryEntry(IPath path, IPath sourceAttachmentPath, IPath sourceAttachmentRootPath) {
return JavaCore.newLibraryEntry(path, sourceAttachmentPath, sourceAttachmentRootPath);
}
public static IClasspathEntry newLibraryEntry(IPath path, IPath sourceAttachmentPath, IPath sourceAttachmentRootPath, boolean isExported) {
return JavaCore.newLibraryEntry(path, sourceAttachmentPath, sourceAttachmentRootPath, isExported);
}
public static IClasspathEntry newLibraryEntry(IPath path, IPath sourceAttachmentPath, IPath sourceAttachmentRootPath, IAccessRule[] accessRules, IClasspathAttribute[] extraAttributes, boolean isExported) {
return JavaCore.newLibraryEntry(path, sourceAttachmentPath, sourceAttachmentRootPath, accessRules, extraAttributes, isExported);
}
}