blob: d9497af689ef5df78919f32c959ac97c6ca2d5ab [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2001, 2005 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.core.internal.validation.core;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IMarker;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IWorkspaceRunnable;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.wst.validation.internal.operations.ValidatorManager;
import org.eclipse.wst.validation.internal.operations.WorkbenchContext;
import org.eclipse.wst.validation.internal.provisional.core.IMessage;
/**
* A helper class for validation in the validation framework.
*
* @author Ernest Mah (ernest@ca.ibm.com)
* @author Lawrence Mandel, IBM
*/
public class Helper extends WorkbenchContext
{
public static final String GET_PROJECT_FILES = "getAllFiles"; //$NON-NLS-1$
public static final String GET_FILE = "getFile"; //$NON-NLS-1$
//dw private static final IContainer[] NO_CONTAINERS = new IContainer[0];
public static final String VALIDATION_MARKER = "org.eclipse.wst.validation.problemmarker"; //$NON-NLS-1$
public static final String VALIDATION_MARKER_OWNER = "owner"; //$NON-NLS-1$
/**
* Constructor.
*/
public Helper()
{
super();
// the following will register the helper's symbolic methods
Class [] args = new Class[1] ;
args[0] = String.class ; // a string argument denoting a specific JSP.
registerModel(GET_FILE, "getFile", args);//$NON-NLS-1$
registerModel(GET_PROJECT_FILES, "getFiles", args);//$NON-NLS-1$
}
/**
* Get the IFile for the given filename.
*
* @param filename The name of the file to retrieve.
* @return An IFile representing the file specified or null if it can't be resolved.
*/
public IFile getFile(String filename)
{
// System.out.println("file name = " + filename);
IResource res = getProject().findMember(filename, true); // true means include phantom resources
if (res instanceof IFile)
{
return (IFile) res;
}
return null;
}
/**
* Get the collection of files from the project that are relevant for the
* validator with the given class name.
*
* @param validatorClassName The name of the validator class.
* @return The collection of files relevant for the validator class specified.
*/
public Collection getFiles(String validatorClassName)
{
IProject project = getProject();
List files = new ArrayList();
getFiles(files, project, validatorClassName);
return files;
}
/**
* Get the collection of files from the project that are relevant for the
* validator with the given class name.
*
* @param files The files relevant for the class name.
* @param resource The resource to look for files in.
* @param validatorClassName The name of the validator class.
*/
protected void getFiles(Collection files, IContainer resource, String validatorClassName)
{
try
{
IResource [] resourceArray = resource.members(false);
for (int i=0; i<resourceArray.length; i++)
{
if (ValidatorManager.getManager().isApplicableTo(validatorClassName, resourceArray[i]))
{
if (resourceArray[i] instanceof IFile)
{
files.add(resourceArray[i]);
}
}
if (resourceArray[i].getType() == IResource.FOLDER)
getFiles(files,(IContainer)resourceArray[i], validatorClassName) ;
}
}
catch (Exception e) {}
}
/**
* Return the name of the resource, without the project-specific information
* in front.
*
* This method is used by ValidationOperation to calculate the non-environment
* specific names of the files. Only the IWorkbenchContext implementation knows how
* much information to strip off of the IResource name. For example, if there is
* an EJB Project named "MyEJBProject", and it uses the default names for the
* source and output folders, "source" and "ejbModule", respectively, then the
* current implementation of EJB Helper knows how much of that structure is
* eclipse-specific.
*
* Since the "source" folder contains Java source files, a portable name would
* be the fully-qualified name of the Java class, without the eclipse-specific
* project and folder names in front of the file name. The EJBHelper knows that
* everything up to the "source" folder, for example, can be removed, because,
* according to the definition of the EJB Project, everything contained
* in the source folder is java source code. So if there is an IResource in an
* EJB Project named "/MyEJBProject/source/com/ibm/myclasses/MyJavaFile.java",
* this method would make this name portable by stripping off the
* "/MyEJBProject/source", and returning "com/ibm/myclasses/MyJavaFile.java".
*
* The output of this method is used by the ValidationOperation, when it
* is calculating the list of added/changed/deleted file names for incremental
* validation. If getPortableName(IResource) returns null, that means
* that the IWorkbenchContext's implementation does not support that particular
* type of resource, and the resource should not be included in the array of
* IFileDelta objects in the IValidator's "validate" method.
*
* @param resource The resource to get the name from.
* @return The portable name of the resource.
*/
public String getPortableName(IResource resource)
{
// System.out.println("get portablename for " + resource);
return resource.getProjectRelativePath().toString();
}
/**
* When an IValidator associates a target object with an IMessage,
* the WorkbenchReporter eventually resolves that target object
* with an IResource. Sometimes more than one target object resolves
* to the same IResource (usually the IProject, which is the default
* IResource when an IFile cannot be found). This method is called,
* by the WorkbenchReporter, so that the WorkbenchReporter can
* distinguish between the IMessages which are on the same IResource,
* but refer to different target objects. This is needed for the
* removeAllMessages(IValidator, Object) method, so that when one
* target object removes all of its messages, that it doesn't remove
* another target object's messages.
*
* This method may return null only if object is null. Otherwise, an
* id which can uniquely identify a particular object must be returned.
* The id needs to be unique only within one particular IValidator.
*
* @param object The object from which to get the name.
* @return The name of the object or null if the object is null.
*/
public String getTargetObjectName(Object object)
{
if (object == null)
{
return null;
}
// System.out.println("get targetname for " + object);
return object.toString();
}
/**
* Delete the markers of the specified type from the specified resource.
*
* @param resource The resource to delete the markers from.
* @param markerType The type of markers to delete from the resource.
* @param attributeName The name of the attribute which the markers must have to be deleted.
* @param attributeValue The value of the attribute corresponding to attributeName which the markers must have to be deleted.
* @throws CoreException
*/
public static void deleteMarkers(IResource resource, String markerType, final String attributeName, final Object attributeValue) throws CoreException
{
final IMarker[] v400Markers = resource.findMarkers(IMarker.PROBLEM, false, IResource.DEPTH_INFINITE);
final IMarker[] markers = resource.findMarkers(markerType, true, IResource.DEPTH_INFINITE);
IWorkspaceRunnable op = new IWorkspaceRunnable()
{
public void run(IProgressMonitor progressMonitor) throws CoreException
{
// this fixes defect 193406
// here we remove markers that may have been added by the v400 code
// hopefully the '.markers' metadata files will be removed for the V5 install
// and this kludge will not be needed there
for (int i = 0; i < v400Markers.length; i++)
{
IMarker marker = markers[i];
marker.delete();
}
for (int i = 0; i < markers.length; i++)
{
IMarker marker = markers[i];
Object value = marker.getAttribute(attributeName);
if (value != null &&
value.equals(attributeValue))
{
marker.delete();
}
}
}
};
try
{
ResourcesPlugin.getWorkspace().run(op, null);
}
catch (Exception e) { }
}
/**
* Get the validation framework severity for the given severity.
*
* @param severity The severity to convert to validation framework severity.
* @return The validation framework severity for the given severity.
*/
static public int getValidationFrameworkSeverity(int severity)
{
switch (severity)
{
case IMarker.SEVERITY_ERROR:
return IMessage.HIGH_SEVERITY;
case IMarker.SEVERITY_WARNING:
return IMessage.NORMAL_SEVERITY;
case IMarker.SEVERITY_INFO:
return IMessage.LOW_SEVERITY;
}
return IMessage.LOW_SEVERITY;
}
}