package org.jbehave.eclipse;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicBoolean;
import org.eclipse.core.resources.IProject;
import org.eclipse.jdt.core.ElementChangedEvent;
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;
public class JBehaveProjectRegistry {
static boolean AwareOfJDTChange = true;
private static JBehaveProjectRegistry singleton = new JBehaveProjectRegistry();
public static JBehaveProjectRegistry get() {
singleton.registerListenerIfRequired();
return singleton;
}
private ConcurrentHashMap<IProject, JBehaveProject> projectCache = new ConcurrentHashMap<IProject, JBehaveProject>();
private AtomicBoolean listening = new AtomicBoolean();
private void registerListenerIfRequired() {
if(!AwareOfJDTChange)
return;
if(listening.compareAndSet(false, true)) {
JavaCore.addElementChangedListener(new IElementChangedListener() {
public void elementChanged(ElementChangedEvent event) {
notifyChanges(event.getDelta());
}
});
}
}
private void notifyChanges(IJavaElementDelta delta) {
IProject project = extractProject(delta);
if(project!=null)
notifyProjectChanges(project, delta);
}
private static IProject extractProject(IJavaElementDelta delta) {
IJavaElement element = delta.getElement();
if(element==null)
return null;
IJavaProject javaProject = element.getJavaProject();
if(javaProject==null)
return null;
return javaProject.getProject();
}
protected void notifyProjectChanges(IProject project, IJavaElementDelta delta) {
// don't call getOrCreateProject
JBehaveProject jproject = projectCache.get(project);
if(jproject!=null) {
jproject.notifyChanges(delta);
}
}
/**
*
* @param project
* @return
* @see #getOrCreateProject(IProject)
*/
public JBehaveProject getProject(IProject project) {
JBehaveProject cache = projectCache.get(project);
return cache;
}
public JBehaveProject getOrCreateProject(IProject project) {
JBehaveProject cache = projectCache.get(project);
if(cache==null) {
JBehaveProject newCache = new JBehaveProject (project);
cache = projectCache.putIfAbsent(project, newCache);
if(cache==null)
cache = newCache;
}
return cache;
}
}