blob: c06ec0ceb411ffc74afc99564f1eee8ced212dee [file] [log] [blame]
package org.eclipse.pde.ds.builder.internal.validation;
import java.util.StringTokenizer;
import org.eclipse.core.resources.*;
import org.eclipse.core.runtime.*;
import org.eclipse.emf.common.command.BasicCommandStack;
import org.eclipse.emf.common.notify.AdapterFactory;
import org.eclipse.emf.common.util.*;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.util.Diagnostician;
import org.eclipse.emf.edit.domain.AdapterFactoryEditingDomain;
import org.eclipse.emf.edit.provider.ComposedAdapterFactory;
import org.eclipse.emf.edit.provider.IItemLabelProvider;
import org.eclipse.emf.transaction.RunnableWithResult;
import org.eclipse.emf.transaction.TransactionalEditingDomain;
import org.eclipse.pde.core.plugin.IPluginModelBase;
import org.eclipse.pde.core.plugin.PluginRegistry;
import org.eclipse.pde.ds.builder.internal.Activator;
import org.eclipse.pde.emfforms.builder.IncrementalModelBuilder;
import org.eclipse.pde.emfforms.builder.MarkerHelper;
import org.eclipse.pde.internal.core.ibundle.IBundleModel;
import org.eclipse.pde.internal.core.ibundle.IBundlePluginModelBase;
import org.eclipse.pde.internal.core.natures.PDE;
import org.osgi.service.component.ComponentConstants;
public class ScrBuilder extends IncrementalModelBuilder {
public static final String ID = "org.eclipse.pde.ds.builder.scrBuilder";
public ScrBuilder() {
}
@SuppressWarnings("restriction")
@Override
protected void fullBuild(IProgressMonitor monitor) throws CoreException {
if (monitor == null) {
monitor = new NullProgressMonitor();
}
if (PDE.hasPluginNature(getProject())) {
IPluginModelBase bundle = PluginRegistry.findModel(getProject());
if (bundle instanceof IBundlePluginModelBase) {
IBundleModel bundleModel = ((IBundlePluginModelBase) bundle)
.getBundleModel();
// XXX for some reason, if we don't call load() by hand, some
// headers are missing (???)
bundleModel.load();
String serviceComponents = bundleModel.getBundle().getHeader(
ComponentConstants.SERVICE_COMPONENT);
if (serviceComponents != null) {
StringTokenizer tok = new StringTokenizer(
serviceComponents, ","); //$NON-NLS-1$
// process all definition file
while (tok.hasMoreElements()) {
String definitionFile = tok.nextToken().trim();
int ind = definitionFile.lastIndexOf('/');
String path = ind != -1 ? definitionFile.substring(0,
ind) : "/"; //$NON-NLS-1$
// TODO we need to support patterns (path may be equal
// to something like "/OSGI-INF/comp-*.xml"...)
IFile componentFile = getProject().getFile(
definitionFile);
URI res = URI.createPlatformResourceURI(componentFile
.getFullPath().toString(), true);
Resource modelResource = new AdapterFactoryEditingDomain(
new ComposedAdapterFactory(
ComposedAdapterFactory.Descriptor.Registry.INSTANCE),
new BasicCommandStack()).getResourceSet()
.getResource(res, true);
build(modelResource.getContents().get(0),
componentFile, true, new SubProgressMonitor(
monitor, 1));
}
} // end while
}
}
}
protected void build(EObject modelObject, IResource resource,
boolean force, IProgressMonitor monitor) throws CoreException {
if (monitor == null) {
monitor = new NullProgressMonitor();
}
monitor.beginTask("Model Validation", 4);
monitor.subTask("Validation");
Diagnostic diagnostic = validate(modelObject);
monitor.worked(3);
if (resource instanceof IContainer) {
MarkerHelper.cleanMarkers((IContainer) resource);
} else if (resource instanceof IFile) {
MarkerHelper.cleanMarkers((IFile) resource);
}
MarkerHelper.createMarkers(diagnostic, new SubProgressMonitor(monitor,
1));
monitor.done();
}
private Diagnostic validate(final EObject modelObject) {
TransactionalEditingDomain domain = TransactionalEditingDomain.Factory.INSTANCE
.createEditingDomain();
final AdapterFactory adapterFactory = domain instanceof AdapterFactoryEditingDomain ? ((AdapterFactoryEditingDomain) domain)
.getAdapterFactory()
: null;
try {
return (Diagnostic) domain
.runExclusive(new RunnableWithResult.Impl<Diagnostic>() {
public void run() {
Diagnostic diagnostic = new Diagnostician() {
@Override
public String getObjectLabel(EObject eObject) {
if (adapterFactory != null
&& !eObject.eIsProxy()) {
IItemLabelProvider itemLabelProvider = (IItemLabelProvider) adapterFactory
.adapt(
eObject,
IItemLabelProvider.class);
if (itemLabelProvider != null) {
return itemLabelProvider
.getText(eObject);
}
}
return super.getObjectLabel(eObject);
}
}.validate(modelObject);
setResult(diagnostic);
}
});
} catch (InterruptedException ie) {
// Log and return the exception in a diagnostic
Activator.log(ie);
return new BasicDiagnostic(Diagnostic.ERROR, "ModelChecker", 0, ie
.getMessage(), new Object[] { modelObject });
}
}
@Override
protected String getContentType() {
return "org.eclipse.pde.ds.content-type";
}
}