blob: d2b2e72c72eef827aabb9fda4d27005e279a7fdc [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2011 Oracle. All rights reserved.
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v1.0, which accompanies this distribution
* and is available at http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Oracle - initial API and implementation
*******************************************************************************/
package org.eclipse.jpt.jaxb.core.internal.resource.jaxbprops;
import java.util.HashMap;
import java.util.Map;
import org.eclipse.core.resources.IFile;
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.IResourceDelta;
import org.eclipse.core.resources.IResourceDeltaVisitor;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.content.IContentType;
import org.eclipse.jpt.common.core.JptResourceModel;
import org.eclipse.jpt.common.utility.internal.iterables.SnapshotCloneIterable;
import org.eclipse.jpt.jaxb.core.JaxbProject;
import org.eclipse.jpt.jaxb.core.JaxbResourceModelProvider;
import org.eclipse.jpt.jaxb.core.JptJaxbCorePlugin;
import org.eclipse.jpt.jaxb.core.resource.jaxbprops.JaxbPropertiesResource;
public class JaxbPropertiesResourceModelProvider
implements JaxbResourceModelProvider {
// singleton
private static final JaxbPropertiesResourceModelProvider INSTANCE = new JaxbPropertiesResourceModelProvider();
/**
* Return the singleton.
*/
public static JaxbPropertiesResourceModelProvider instance() {
return INSTANCE;
}
private final Map<IFile, JaxbPropertiesResourceImpl> models = new HashMap<IFile, JaxbPropertiesResourceImpl>();
private final IResourceChangeListener resourceChangeListener;
/**
* Enforce singleton usage
*/
private JaxbPropertiesResourceModelProvider() {
super();
this.resourceChangeListener = buildResourceChangeListener();
ResourcesPlugin.getWorkspace().addResourceChangeListener(this.resourceChangeListener);
}
protected IResourceChangeListener buildResourceChangeListener() {
return new IResourceChangeListener() {
public void resourceChanged(IResourceChangeEvent event) {
handleResourceChangeEvent(event);
}
};
}
public IContentType getContentType() {
return JptJaxbCorePlugin.JAXB_PROPERTIES_CONTENT_TYPE;
}
public JptResourceModel buildResourceModel(JaxbProject jaxbProject, IFile file) {
return buildResourceModel(file);
}
public JaxbPropertiesResource buildResourceModel(IFile file) {
JaxbPropertiesResourceImpl resource = this.models.get(file);
if (resource != null) {
return resource;
}
resource = new JaxbPropertiesResourceImpl(file);
this.models.put(file, resource);
return resource;
}
protected void handleResourceChangeEvent(IResourceChangeEvent event) {
switch (event.getType()) {
case IResourceChangeEvent.PRE_CLOSE :
case IResourceChangeEvent.PRE_DELETE :
removeProjectResources((IProject) event.getResource());
return;
case IResourceChangeEvent.POST_CHANGE :
updateResources(event.getDelta());
}
}
protected void removeProjectResources(IProject removedProject) {
for (IFile file : new SnapshotCloneIterable<IFile>(this.models.keySet())) {
if (file.getProject().equals(removedProject)) {
removeResource(file);
}
}
}
protected void updateResources(IResourceDelta delta) {
try {
delta.accept(new ResourceDeltaVisitor());
}
catch (CoreException ce) {
// shouldn't happen
JptJaxbCorePlugin.log(ce);
}
}
protected void removeResource(IFile file) {
this.models.remove(file);
}
protected void updateResource(IFile file) {
JaxbPropertiesResourceImpl resource = this.models.get(file);
if (resource != null) {
resource.update();
}
}
protected class ResourceDeltaVisitor
implements IResourceDeltaVisitor {
public boolean visit(IResourceDelta delta) {
IResource res = delta.getResource();
switch (res.getType()) {
case IResource.ROOT :
return true; // visit children
case IResource.PROJECT :
return true; // visit children
case IResource.FOLDER :
return true; // visit children
case IResource.FILE :
fileChanged((IFile) res, delta.getKind());
return false; // no children
default :
return false; // no children (probably shouldn't get here...)
}
}
protected void fileChanged(IFile file, int deltaKind) {
if (deltaKind == IResourceDelta.REMOVED) {
JaxbPropertiesResourceModelProvider.this.removeResource(file);
}
else if (deltaKind == IResourceDelta.CHANGED) {
JaxbPropertiesResourceModelProvider.this.updateResource(file);
}
}
}
}