blob: b244cec32e508ea2c852d88e0fe1ef4d54288cf5 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2006 IBM Corporation and others.
* 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:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.team.examples.model.mapping;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.core.resources.*;
import org.eclipse.core.resources.mapping.*;
import org.eclipse.core.runtime.*;
import org.eclipse.osgi.util.NLS;
import org.eclipse.team.examples.filesystem.FileSystemPlugin;
import org.eclipse.team.examples.model.*;
/**
* The model provider for our example
*/
public class ExampleModelProvider extends
org.eclipse.core.resources.mapping.ModelProvider {
public static final String ID = "org.eclipse.team.examples.filesystem.modelProvider";
public ExampleModelProvider() {
super();
}
/* (non-Javadoc)
* @see org.eclipse.core.resources.mapping.ModelProvider#validateChange(org.eclipse.core.resources.IResourceDelta, org.eclipse.core.runtime.IProgressMonitor)
*/
public IStatus validateChange(IResourceDelta delta, IProgressMonitor monitor) {
// Visit the changes in the delta to look for changes we care about
final List problems = new ArrayList();
try {
delta.accept(new IResourceDeltaVisitor() {
public boolean visit(IResourceDelta delta) throws CoreException {
IResource resource = delta.getResource();
if (ModelObjectElementFile.isMoeFile(resource)) {
// Removal may leave a stale reference in a MOD file
if (delta.getKind() == IResourceDelta.REMOVED) {
IStatus status = new ModelStatus(IStatus.ERROR, FileSystemPlugin.ID, getDescriptor().getId(),
NLS.bind("Deleting file {0} may corrupt any model definition that references it.", resource.getFullPath()));
problems.add(status);
}
}
if (ModelObjectDefinitionFile.isModFile(resource)) {
// Removal may leave unreferenced MOE files around
if (delta.getKind() == IResourceDelta.REMOVED) {
IStatus status = new ModelStatus(IStatus.WARNING, FileSystemPlugin.ID, getDescriptor().getId(),
NLS.bind("Deleting file {0} may result in unreferenced element files.", resource.getFullPath()));
problems.add(status);
}
if (delta.getKind() == IResourceDelta.ADDED
&& ((delta.getFlags() & IResourceDelta.COPIED_FROM) > 0)) {
// Copying will result in two MOD files that reference the same elements
IStatus status = new ModelStatus(IStatus.ERROR, FileSystemPlugin.ID, getDescriptor().getId(),
NLS.bind("Copying file {0} may corrupt the model defintion.", delta.getMovedFromPath()));
problems.add(status);
}
}
return delta.getResource().getType() == IResource.ROOT
|| ModelProject.isModProject(delta.getResource().getProject());
}
});
} catch (CoreException e) {
FileSystemPlugin.log(e.getStatus());
}
if (problems.size() == 1)
return (IStatus)problems.get(0);
else if (problems.size() > 1) {
return new MultiStatus(FileSystemPlugin.ID, 0, (IStatus[]) problems.toArray(new IStatus[problems.size()]), "Multiple potential side effects have been found.", null);
}
return super.validateChange(delta, monitor);
}
public ResourceMapping[] getMappings(IResource resource, ResourceMappingContext context, IProgressMonitor monitor) throws CoreException {
if (ModelProject.isModProject(resource.getProject())) {
ModelObject object = ModelObject.create(resource);
if (object != null)
return new ResourceMapping[] { (ResourceMapping)object.getAdapter(ResourceMapping.class) };
}
return super.getMappings(resource, context, monitor);
}
}