blob: 048dd39c27ea1cd7976885c0febd6f0c538d72c6 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2005, 2008 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.wst.validation.internal.operations;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.OperationCanceledException;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.wst.common.frameworks.internal.plugin.WTPCommonPlugin;
import org.eclipse.wst.validation.IPerformanceMonitor;
import org.eclipse.wst.validation.PerformanceCounters;
import org.eclipse.wst.validation.ValidationFramework;
import org.eclipse.wst.validation.internal.Misc;
import org.eclipse.wst.validation.internal.ResourceConstants;
import org.eclipse.wst.validation.internal.ResourceHandler;
import org.eclipse.wst.validation.internal.ValidationRegistryReader;
import org.eclipse.wst.validation.internal.ValidatorMetaData;
import org.eclipse.wst.validation.internal.core.Message;
import org.eclipse.wst.validation.internal.core.ValidationException;
import org.eclipse.wst.validation.internal.plugin.ValidationPlugin;
import org.eclipse.wst.validation.internal.provisional.core.IMessage;
import org.eclipse.wst.validation.internal.provisional.core.IValidatorJob;
public class ValidatorJob extends Job {
private IProject project;
private IWorkbenchContext helper;
private IValidatorJob validator;
public ValidatorJob(String name) {
super(name);
}
public ValidatorJob( IValidatorJob validator, String displayName, String name, IProject project, IWorkbenchContext aHelper ){
super(displayName);
this.project = project;
this.helper = aHelper;
this.validator = validator;
}
//revisit reporter in the code below
//subtask information is displayed in the monitor created by the Job
//error information is reported by the IReporter
protected IStatus run(IProgressMonitor monitor) {
IPerformanceMonitor pm = ValidationFramework.getDefault().getPerformanceMonitor();
long elapsed = -1;
long cpuTime = -1;
if (pm.isCollecting()){
elapsed = System.currentTimeMillis();
cpuTime = Misc.getCPUTime();
}
monitor.beginTask("Validating", IProgressMonitor.UNKNOWN); //$NON-NLS-1$
IStatus status = IValidatorJob.OK_STATUS;
WorkbenchReporter reporter = new WorkbenchReporter( project, monitor );
ValidatorMetaData vmd = ValidationRegistryReader.getReader().getValidatorMetaData(validator);
try {
String message = ResourceHandler.getExternalizedMessage(
ResourceConstants.VBF_STATUS_STARTING_VALIDATION,
new String[]{helper.getProject().getName(), vmd.getValidatorDisplayName()});
monitor.subTask(message);
status = validator.validateInJob(helper, reporter);
message = ResourceHandler.getExternalizedMessage(ResourceConstants.VBF_STATUS_ENDING_VALIDATION,
new String[]{helper.getProject().getName(), vmd.getValidatorDisplayName()});
monitor.subTask(message);
} catch (OperationCanceledException exc) {
throw exc;
} catch (ValidationException exc) {
// First, see if a validator just caught all Throwables and
// accidentally wrapped a MessageLimitException instead of
// propagating it.
if (exc.getAssociatedException() != null) {
if (exc.getAssociatedException() instanceof ValidationException) {
ValidationException vexc = (ValidationException) exc.getAssociatedException();
vexc.setClassLoader(validator.getClass().getClassLoader());
}
}
// If there is a problem with this particular validator, log the
// error and continue with the next validator.
exc.setClassLoader(validator.getClass().getClassLoader());
ValidationPlugin.getPlugin().handleException(exc);
ValidationPlugin.getPlugin().handleException(exc.getAssociatedException());
String message = ResourceHandler.getExternalizedMessage(
ResourceConstants.VBF_STATUS_ENDING_VALIDATION_ABNORMALLY,
new String[]{helper.getProject().getName(), vmd.getValidatorDisplayName()});
monitor.subTask(message);
if (exc.getAssociatedMessage() != null) {
reporter.addMessage(validator, exc.getAssociatedMessage());
}
} catch (Exception e) {
ValidationPlugin.getPlugin().handleException(e);
String mssg = ResourceHandler.getExternalizedMessage(
ResourceConstants.VBF_STATUS_ENDING_VALIDATION_ABNORMALLY,
new String[]{helper.getProject().getName(), vmd.getValidatorDisplayName() });
monitor.subTask(mssg);
} finally {
try {
validator.cleanup(reporter);
} catch (OperationCanceledException e) {
throw e;
} catch (Exception exc) {
ValidationPlugin.getPlugin().handleException(exc);
String[] msgParm = {exc.getClass().getName(), vmd.getValidatorDisplayName(), (exc.getMessage() == null ? "" : exc.getMessage())}; //$NON-NLS-1$
Message message = ValidationPlugin.getMessage();
message.setSeverity(IMessage.NORMAL_SEVERITY);
message.setId(ResourceConstants.VBF_EXC_RUNTIME);
message.setParams(msgParm);
status = WTPCommonPlugin.createErrorStatus(message.getText());
return status;
} finally {
try {
helper.cleanup(reporter);
vmd.removeHelper( validator );
}catch (OperationCanceledException e) {
throw e;
} catch (Exception exc) {
ValidationPlugin.getPlugin().handleException(exc);
String[] msgParm = {exc.getClass().getName(), vmd.getValidatorDisplayName(), (exc.getMessage() == null ? "" : exc.getMessage())}; //$NON-NLS-1$
Message message = ValidationPlugin.getMessage();
message.setSeverity(IMessage.NORMAL_SEVERITY);
message.setId(ResourceConstants.VBF_EXC_RUNTIME);
message.setParams(msgParm);
reporter.addMessage(validator, message);
status = WTPCommonPlugin.createErrorStatus(message.getText());
return status;
} finally {
helper.setProject(null);
vmd.removeHelper( validator );
helper = null;
reporter = null;
}
}
//reporter.getProgressMonitor().worked(((delta == null) ? 1 : delta.length)); // One
//monitor.worked(((delta == null) ? 1 : delta.length)); // One
monitor.done();
}
if (pm.isCollecting()){
if (cpuTime != -1){
cpuTime = Misc.getCPUTime() - cpuTime;
}
String projectName = null;
if (project != null)projectName = project.getName();
pm.add(new PerformanceCounters(vmd.getValidatorUniqueName(),
vmd.getValidatorDisplayName(),projectName, -1,
System.currentTimeMillis()-elapsed, cpuTime));
}
return status;
}
public boolean belongsTo(Object family) {
return (project.getName() + ValidatorManager.VALIDATOR_JOB_FAMILY).equals(family);
}
}