blob: 5f9dba8871beae84da97c25bcdd9c1e383c3dd4a [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2001, 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;
import java.lang.reflect.InvocationTargetException;
import java.util.Collection;
import java.util.HashSet;
import java.util.Set;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;
import org.eclipse.wst.validation.internal.core.Message;
import org.eclipse.wst.validation.internal.operations.WorkbenchReporter;
import org.eclipse.wst.validation.internal.plugin.ValidationPlugin;
import org.eclipse.wst.validation.internal.provisional.core.IMessage;
public final class InternalValidatorManager {
private static InternalValidatorManager _inst = null;
private static final String OP_GROUP = "ValidationOperation"; //$NON-NLS-1$ // when the ValidationOperation
// adds a message to the task
// list; e.g. cancel, or internal
// error, this group name is used
// to distinguish between the
// messages that the validator
// itself put, and the ones which
// the validator owns, but the
// operation put. //$NON-NLS-1$
private InternalValidatorManager() {
//default
}
public static InternalValidatorManager getManager() {
if (_inst == null) {
_inst = new InternalValidatorManager();
}
return _inst;
}
/**
* Return a new Set that contains all of the elements from the array.
*/
public static Set<ValidatorMetaData> wrapInSet(ValidatorMetaData[] vmds) {
Set<ValidatorMetaData> result = new HashSet<ValidatorMetaData>();
if ((vmds == null) || (vmds.length == 0))return result;
for (ValidatorMetaData vmd : vmds)result.add(vmd);
return result;
}
/**
* If the current validator throws a Throwable, log the internal error to the task list.
*
* This method is for use by the validation framework only.
*/
public void addInternalErrorTask(IProject project, ValidatorMetaData vmd, Throwable exc) {
addOperationTask(project, vmd, ResourceConstants.VBF_EXC_INTERNAL, new String[]{project.getName(), vmd.getValidatorDisplayName(), ((exc.getMessage() == null) ? "" : exc.getMessage())}); //$NON-NLS-1$
}
/**
* If the user is cancelling validation on the current project/resource, Add an information task
* to the task list informing the user that validation has not been run on the current project.
*
* If the current validator throws a Throwable, log the internal error to the task list.
*/
public void addOperationTask(IProject project, ValidatorMetaData vmd, String messageId, String[] parms) {
Message message = ValidationPlugin.getMessage();
message.setSeverity(IMessage.LOW_SEVERITY);
message.setId(messageId);
message.setParams(parms);
message.setGroupName(OP_GROUP);
// Although the message is owned by the validator, the string of the message has to be
// loaded by this class' ClassLoader
WorkbenchReporter.addMessage(project, vmd.getValidatorUniqueName(), getClass().getClassLoader(), message);
}
/**
* If the user cancelled the previous validation with this validator, or if there was a
* Throwable caught during the last execution of this validator, and the validator is in the
* process of validating now, remove the former information task messages.
*/
public void removeOperationTasks(IProject project, ValidatorMetaData vmd) {
WorkbenchReporter.removeMessageSubset(project, vmd.getValidatorUniqueName(), OP_GROUP);
}
/**
* Return an array of the fully-qualified names of the validator classes.
*/
public String[] getValidatorNames(ValidatorMetaData[] vmds) {
Set<String> temp = new HashSet<String>();
for (ValidatorMetaData vmd : vmds) {
for (String name : vmd.getValidatorNames()) {
temp.add(name);
}
}
String[] vmdNames = new String[temp.size()];
temp.toArray(vmdNames);
return vmdNames;
}
/**
* Return an array of the fully-qualified names of the validator classes.
*/
public String[] getValidatorNames(Collection<ValidatorMetaData> vmds) {
Set<String> temp = new HashSet<String>();
for (ValidatorMetaData vmd : vmds) {
for (String name : vmd.getValidatorNames()) {
temp.add(name);
}
}
String[] vmdNames = new String[temp.size()];
temp.toArray(vmdNames);
return vmdNames;
}
/**
* Return a list of validators that validate files with the given extension.
*/
public ValidatorMetaData[] getValidatorsForExtension(IProject project, String fileExtension) {
try {
ProjectConfiguration prjp = ConfigurationManager.getManager().getProjectConfiguration(project);
// Get all of the validators configured on the project for the given file extension
ValidatorMetaData[] vmds = prjp.getValidators();
// Construct a fake IFile type to represent a file with this extension.
StringBuffer buffer = new StringBuffer(project.getName());
buffer.append(IPath.SEPARATOR);
buffer.append(fileExtension);
IPath path = new Path(buffer.toString());
IFile file = ResourcesPlugin.getWorkspace().getRoot().getFile(path);
ValidatorMetaData[] temp = new ValidatorMetaData[vmds.length];
int count = 0;
for (int i = 0; i < vmds.length; i++) {
ValidatorMetaData vmd = vmds[i];
if (vmd.isApplicableTo(file)) {
temp[count++] = vmd;
}
}
ValidatorMetaData[] result = new ValidatorMetaData[count];
System.arraycopy(temp, 0, result, 0, count);
return result;
} catch (InvocationTargetException e) {
ValidationPlugin.getPlugin().handleException(e);
if (e.getTargetException() != null)
ValidationPlugin.getPlugin().handleException(e.getTargetException());
return new ValidatorMetaData[0];
}
}
/**
* Return a list of validator names that validate files with the given extension.
*/
public String[] getValidatorNamesForExtension(IProject project, String fileExtension) {
ValidatorMetaData[] vmds = getValidatorsForExtension(project, fileExtension);
String[] names = new String[vmds.length];
for (int i = 0; i < names.length; i++) {
names[i] = vmds[i].getValidatorUniqueName();
}
return names;
}
}