blob: 8970d2e85addbf002350191fd25c68f57e807944 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2010, 2019 Mia-Software and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v2.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v20.html
*
* Contributors:
* Gregoire DUPE (Mia-Software) - initial API and implementation
*******************************************************************************/
package org.eclipse.modisco.infra.common.core.internal.builder;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IResourceDelta;
import org.eclipse.core.resources.IResourceDeltaVisitor;
import org.eclipse.core.resources.IResourceVisitor;
import org.eclipse.core.resources.IncrementalProjectBuilder;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.Plugin;
import org.eclipse.core.runtime.Status;
import org.eclipse.modisco.infra.common.core.internal.CommonModiscoActivator;
import org.eclipse.modisco.infra.common.core.internal.validation.ValidationUtils;
import org.eclipse.modisco.infra.common.core.logging.MoDiscoLogger;
public abstract class MoDiscoCatalogBuilder implements IModiscoBuilder {
private static final String DEBUG_ID = "org.eclipse.modisco.infra.common.core/debug/MoDiscoCatalogBuilder/debug"; //$NON-NLS-1$
static final boolean DEBUG = CommonModiscoActivator.getDefault().isDebugging()
&& Boolean.parseBoolean(Platform.getDebugOption(MoDiscoCatalogBuilder.DEBUG_ID));
public void clean(final IncrementalProjectBuilder builder, final IProgressMonitor monitor)
throws CoreException {
final IProject project = builder.getProject();
getCatalog().clean(project);
validateModelDeclared(project);
}
public IProject[] build(final IncrementalProjectBuilder builder, final int kind,
final Map<?, ?> args, final IProgressMonitor monitor) throws CoreException {
getCatalog(); // make sure catalog is initialized (for listening referenced resources changes)
if (kind == IncrementalProjectBuilder.FULL_BUILD) {
fullBuild(builder);
} else {
IProject project = builder.getProject();
IResourceDelta delta = builder.getDelta(project);
if (delta == null) {
fullBuild(builder);
} else {
incrementalBuild(builder, delta);
}
}
return null;
}
private void fullBuild(final IncrementalProjectBuilder builder) {
try {
builder.getProject().accept(new IResourceVisitor() {
public boolean visit(final IResource resource) throws CoreException {
String fileExtension = resource.getFileExtension();
if (fileExtension != null && fileExtension.equals(getFileExtension())) {
try {
getCatalog().scheduleAddWSFile((IFile) resource);
} catch (ClassCastException e) {
IStatus status = new Status(IStatus.ERROR, getActivator().getBundle()
.getSymbolicName(), "Failed to build: " //$NON-NLS-1$
+ resource.getProject().getName(), e);
getActivator().getLog().log(status);
}
}
return true;
}
});
} catch (CoreException e) {
IStatus status = new Status(IStatus.ERROR,
getActivator().getBundle().getSymbolicName(),
"Failed to build: " + builder.getProject(), e); //$NON-NLS-1$
getActivator().getLog().log(status);
}
validateModelDeclared(builder.getProject());
}
private void incrementalBuild(final IncrementalProjectBuilder builder,
final IResourceDelta resourceDelta) {
try {
final Set<IProject> projectsToValidate = new HashSet<IProject>();
final List<IFile> toBeAdded = new ArrayList<IFile>();
final List<IFile> toBeRemoved = new ArrayList<IFile>();
final List<IFile> toBeUpdated = new ArrayList<IFile>();
resourceDelta.accept(new IResourceDeltaVisitor() {
public boolean visit(final IResourceDelta delta) {
IResource resource = delta.getResource();
if ("plugin.xml".equals(resource.getName()) || "build.properties".equals(resource.getName())) { //$NON-NLS-1$ //$NON-NLS-2$
projectsToValidate.add(resource.getProject());
}
String fileExtension = resource.getFileExtension();
if (resource instanceof IFile && fileExtension != null
&& fileExtension.equals(getFileExtension())) {
final IFile file = (IFile) resource;
projectsToValidate.add(file.getProject());
switch (delta.getKind()) {
case IResourceDelta.ADDED:
if (MoDiscoCatalogBuilder.DEBUG) {
System.out.println(MoDiscoCatalogBuilder.this.getClass()
.getSimpleName()
+ ": ADDED: " + file); //$NON-NLS-1$
}
toBeAdded.add(file);
break;
case IResourceDelta.REMOVED:
if (MoDiscoCatalogBuilder.DEBUG) {
System.out.println(MoDiscoCatalogBuilder.this.getClass()
.getSimpleName()
+ ": REMOVED: " + file); //$NON-NLS-1$
}
toBeRemoved.add(file);
break;
case IResourceDelta.CHANGED:
if (MoDiscoCatalogBuilder.DEBUG) {
System.out.println(MoDiscoCatalogBuilder.this.getClass()
.getSimpleName()
+ ": CHANGED: " + file); //$NON-NLS-1$
}
toBeUpdated.add(file);
break;
case IResourceDelta.ADDED_PHANTOM:
if (MoDiscoCatalogBuilder.DEBUG) {
System.out.println(MoDiscoCatalogBuilder.this.getClass()
.getSimpleName()
+ ": ADDED_PHANTOM: " + file); //$NON-NLS-1$
}
toBeAdded.add(file);
break;
case IResourceDelta.REMOVED_PHANTOM:
if (MoDiscoCatalogBuilder.DEBUG) {
System.out.println(MoDiscoCatalogBuilder.this.getClass()
.getSimpleName()
+ ": REMOVED_PHANTOM: " + file); //$NON-NLS-1$
}
toBeRemoved.add(file);
break;
default:
MoDiscoLogger.logError("Unknown delta kind: " //$NON-NLS-1$
+ delta.getKind(), getActivator());
break;
}
}
return true;
}
});
for (IFile file : toBeRemoved) {
getCatalog().scheduleRemoveWSFile(file);
}
for (IFile file : toBeAdded) {
getCatalog().scheduleAddWSFile(file);
}
for (IFile file : toBeUpdated) {
getCatalog().scheduleUpdateWSFile(file);
}
for (IProject project : projectsToValidate) {
validateModelDeclared(project);
}
} catch (CoreException e) {
MoDiscoLogger.logError(e, "Failed to build: " + builder.getProject(), getActivator()); //$NON-NLS-1$
}
}
private void validateModelDeclared(final IProject project) {
if (getRegistrationExtensionPoint() != null) {
ValidationUtils.validateRegistered(project, getFileExtension(), getMarkerType(),
getElementType(), getRegistrationExtensionPoint());
}
}
protected abstract AbstractMoDiscoCatalog getCatalog();
protected abstract String getElementType();
protected abstract String getRegistrationExtensionPoint();
protected abstract String getMarkerType();
protected abstract String getFileExtension();
protected abstract Plugin getActivator();
}