optimization based on content-type
diff --git a/modeling/plugins/org.eclipse.pde.ds.builder/src/org/eclipse/pde/ds/builder/internal/validation/IncrementalModelBuilder.java b/modeling/plugins/org.eclipse.pde.ds.builder/src/org/eclipse/pde/ds/builder/internal/validation/IncrementalModelBuilder.java
index 6623aa0..cfaa31f 100644
--- a/modeling/plugins/org.eclipse.pde.ds.builder/src/org/eclipse/pde/ds/builder/internal/validation/IncrementalModelBuilder.java
+++ b/modeling/plugins/org.eclipse.pde.ds.builder/src/org/eclipse/pde/ds/builder/internal/validation/IncrementalModelBuilder.java
@@ -8,7 +8,7 @@
  * Contributors:
  *     Anyware Technologies - initial API and implementation
  *
- * $Id: IncrementalModelBuilder.java,v 1.3 2009/07/03 21:07:44 bcabe Exp $
+ * $Id: IncrementalModelBuilder.java,v 1.4 2009/07/05 17:12:48 bcabe Exp $
  */
 package org.eclipse.pde.ds.builder.internal.validation;
 
@@ -30,13 +30,15 @@
 
 /**
  * An abstract class to subclass to launch background jobs on the modified model
+ * TODO: Listen to modification on Java files
  */
 public abstract class IncrementalModelBuilder extends IncrementalProjectBuilder {
 	protected class ModelFileDeltaVisitor implements IResourceDeltaVisitor {
 		private Map<Resource, IResource> modifiedResources = new HashMap<Resource, IResource>();
+		private String _contentType;
 
-		public ModelFileDeltaVisitor() {
-			// Do nothing
+		public ModelFileDeltaVisitor(String contentType) {
+			_contentType = contentType;
 		}
 
 		public Map<Resource, IResource> getModifiedResources() {
@@ -57,9 +59,10 @@
 			case IResourceDelta.CHANGED:
 				if (resource instanceof IContainer)
 					return true;
-				if (!"org.eclipse.pde.ds.content-type"
-						.equals(((IFile) resource).getContentDescription()
-								.getContentType().getId()))
+				if (_contentType != null
+						&& !_contentType.equals(((IFile) resource)
+								.getContentDescription().getContentType()
+								.getId()))
 					return false;
 				// handle changed resource
 				URI resourceURI = URI.createPlatformResourceURI(resource
@@ -119,7 +122,8 @@
 			monitor = new NullProgressMonitor();
 		}
 		// the visitor does the work.
-		ModelFileDeltaVisitor visitor = new ModelFileDeltaVisitor();
+		ModelFileDeltaVisitor visitor = new ModelFileDeltaVisitor(
+				getContentType());
 		delta.accept(visitor);
 
 		Map<Resource, IResource> modifiedResources = visitor
@@ -137,6 +141,17 @@
 
 	}
 
+	/**
+	 * If the model files to build have a content-type, this method must return
+	 * it, in order to optimize the build process (fail-fast mode)
+	 * 
+	 * @return the content-type of model files, or null if no content-type
+	 *         exists
+	 */
+	protected String getContentType() {
+		return null;
+	}
+
 	@SuppressWarnings("restriction")
 	protected void fullBuild(IProgressMonitor monitor) throws CoreException {
 		if (monitor == null) {
@@ -148,7 +163,8 @@
 			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 (???)
+				// 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);
@@ -181,4 +197,10 @@
 
 	protected abstract void build(EObject modelObject, IResource resource,
 			boolean force, IProgressMonitor monitor) throws CoreException;
+
+	/*
+	 * private boolean isComponentReferencedInManifest() {
+	 * 
+	 * }
+	 */
 }
diff --git a/modeling/plugins/org.eclipse.pde.ds.builder/src/org/eclipse/pde/ds/builder/internal/validation/ScrBuilder.java b/modeling/plugins/org.eclipse.pde.ds.builder/src/org/eclipse/pde/ds/builder/internal/validation/ScrBuilder.java
index d8e333c..187e60b 100644
--- a/modeling/plugins/org.eclipse.pde.ds.builder/src/org/eclipse/pde/ds/builder/internal/validation/ScrBuilder.java
+++ b/modeling/plugins/org.eclipse.pde.ds.builder/src/org/eclipse/pde/ds/builder/internal/validation/ScrBuilder.java
@@ -1,13 +1,11 @@
 package org.eclipse.pde.ds.builder.internal.validation;
 
-import java.util.Map;
 import org.eclipse.core.resources.*;
 import org.eclipse.core.runtime.*;
 import org.eclipse.emf.common.notify.AdapterFactory;
 import org.eclipse.emf.common.util.BasicDiagnostic;
 import org.eclipse.emf.common.util.Diagnostic;
 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.IItemLabelProvider;
@@ -18,24 +16,7 @@
 public class ScrBuilder extends IncrementalModelBuilder {
 	public static final String ID = "org.eclipse.pde.ds.builder.scrBuilder";
 
-	protected void incrementalBuild(IResourceDelta delta,
-			IProgressMonitor monitor) throws CoreException {
-		if (monitor == null) {
-			monitor = new NullProgressMonitor();
-		}
-		// the visitor does the work.
-		ModelFileDeltaVisitor visitor = new ModelFileDeltaVisitor();
-		delta.accept(visitor);
-
-		Map<Resource, IResource> modifiedResources = visitor
-				.getModifiedResources();
-
-		// If one resource is changed in the project, all the project must be
-		// validated
-		if (modifiedResources.size() > 0) {
-			fullBuild(monitor);
-		}
-
+	public ScrBuilder() {
 	}
 
 	protected void build(EObject modelObject, IResource resource,
@@ -104,6 +85,10 @@
 			return new BasicDiagnostic(Diagnostic.ERROR, "ModelChecker", 0, ie
 					.getMessage(), new Object[] { modelObject });
 		}
+	}
 
+	@Override
+	protected String getContentType() {
+		return "org.eclipse.pde.ds.content-type";
 	}
 }