blob: c31ef45797598fdb7a9dd7e08b3ec797998e56e8 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2001, 2004 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.xml.ui.internal.validation;
import java.io.InputStream;
import java.util.Collection;
import java.util.Iterator;
import java.util.Locale;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IResource;
import org.eclipse.osgi.util.NLS;
import org.eclipse.wst.validation.internal.core.Message;
import org.eclipse.wst.validation.internal.core.ValidationException;
import org.eclipse.wst.validation.internal.operations.IRuleGroup;
import org.eclipse.wst.validation.internal.provisional.core.IMessage;
import org.eclipse.wst.validation.internal.provisional.core.IReporter;
import org.eclipse.wst.validation.internal.provisional.core.IValidationContext;
import org.eclipse.wst.validation.internal.provisional.core.IValidator;
import org.eclipse.wst.xml.ui.internal.XMLUIMessages;
/**
* A validator to plug the XML validator into the validation framework.
*
* @author Craig Salter, IBM
* @author Lawrence Mandel, IBM
*/
public class Validator implements IValidator
{
class LocalizedMessage extends Message {
private String _message = null;
public LocalizedMessage(int severity, String messageText) {
this(severity, messageText, null);
}
public LocalizedMessage(int severity, String messageText, IResource targetObject) {
this(severity, messageText, (Object) targetObject);
}
public LocalizedMessage(int severity, String messageText, Object targetObject) {
super(null, severity, null);
setLocalizedMessage(messageText);
setTargetObject(targetObject);
}
public void setLocalizedMessage(String message) {
_message = message;
}
public String getLocalizedMessage() {
return _message;
}
public String getText() {
return getLocalizedMessage();
}
public String getText(ClassLoader cl) {
return getLocalizedMessage();
}
public String getText(Locale l) {
return getLocalizedMessage();
}
public String getText(Locale l, ClassLoader cl) {
return getLocalizedMessage();
}
}
private final String GET_FILE = "getFile"; //$NON-NLS-1$
public final String GET_PROJECT_FILES = "getAllFiles"; //$NON-NLS-1$
static boolean shouldValidate(IFile file) {
IResource resource = file;
do {
if (resource.isDerived() || resource.isTeamPrivateMember() || !resource.isAccessible() || resource.getName().charAt(0) == '.') {
return false;
}
resource = resource.getParent();
}
while ((resource.getType() & IResource.PROJECT) == 0);
return true;
}
/**
* Validate the given file.
*
* @param file The file to validate.
*/
public void validate(IFile file)
{
ValidateAction validateAction = new ValidateAction(file, false);
validateAction.setValidator(this);
validateAction.run();
}
public void validate(IFile file, InputStream inputStream, IReporter reporter)
{
ValidateAction validateAction = new ValidateAction(file, false);
validateAction.setValidator(this);
if (inputStream != null)
{
validateAction.setInputStream(inputStream);
validateAction.setReporter(reporter);
}
validateAction.run();
}
/* (non-Javadoc)
* @see org.eclipse.wtp.validation.core.IValidator#validate(org.eclipse.wtp.validation.core.IHelper, org.eclipse.wtp.validation.core.IReporter, org.eclipse.wtp.validation.core.IFileDelta[])
*/
public void validate(IValidationContext helper, IReporter reporter) throws ValidationException {
String[] fileURIs = helper.getURIs();
if (fileURIs != null && fileURIs.length > 0)
{
for (int i = 0; i < fileURIs.length; i++)
{
String fileName = fileURIs[i];
if (fileName != null)
{
Object []parms = {fileName};
IFile file = (IFile) helper.loadModel(GET_FILE, parms);
if (file != null && shouldValidate(file))
{ //the helper might not have the file stored in it. could have an InputStream
if (helper.loadModel("inputStream") instanceof InputStream) //$NON-NLS-1$
{
validate(file, (InputStream)helper.loadModel("inputStream"), reporter); //do we need the fileName? what is int ruleGroup? //$NON-NLS-1$
}
else
{
//if (((Helper)helper).isInJavaBuildPath(file) &&
// !((WorkbenchContext)helper).isInJavaSourcePath(file))
//{
// continue;
//}
validateIfNeeded(file, helper, reporter);
}
}
}
}
}
else
{
Object []parms = {this.getClass().getName()};
Collection files = (Collection) helper.loadModel(GET_PROJECT_FILES, parms);
Iterator iter = files.iterator();
while (iter.hasNext())
{
IFile file = (IFile) iter.next();
validateIfNeeded(file, helper, reporter);
}
}
}
/**
* Validate the given file and use the reporter for the validation messages.
*
* @param file The file to validate.
* @param reporter The reporter to report the validation messages.
* @param ruleGroup
*/
public void validate(IFile file, IReporter reporter, int ruleGroup)
{
ValidateAction validateAction = new ValidateAction(file, false);
validateAction.setValidator(this);
validateAction.run();
}
/**
* Validate the given file if validation is required.
*
* @param file The file to validate.
* @param helper An aid for the validation.
* @param reporter The reporter to report the validation messages.
*/
protected void validateIfNeeded(IFile file, IValidationContext helper, IReporter reporter)
{
Message message = new LocalizedMessage(IMessage.LOW_SEVERITY, NLS.bind(XMLUIMessages.MESSAGE_XML_VALIDATION_MESSAGE_UI_, new String[]{file.getFullPath().toString()}));
reporter.displaySubtask(this, message);
Integer ruleGroupInt = (Integer)helper.loadModel(IRuleGroup.PASS_LEVEL, null); // pass in a "null" so that loadModel doesn't attempt to cast the result into a RefObject
int ruleGroup = (ruleGroupInt == null) ? IRuleGroup.PASS_FULL : ruleGroupInt.intValue();
validate(file, reporter, ruleGroup);
}
/* (non-Javadoc)
* @see org.eclipse.wtp.validation.core.IValidator#cleanup(org.eclipse.wtp.validation.core.IReporter)
*/
public void cleanup(IReporter reporter)
{
// Nothing to do.
}
}