blob: b4f2c56f663e17a2e2a4035dc0e1208071783006 [file] [log] [blame]
package org.eclipse.jst.validation.test.internal.registry;
import java.io.File;
import java.net.URL;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.logging.Level;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.IPluginDescriptor;
import org.eclipse.core.runtime.IPluginRegistry;
import org.eclipse.core.runtime.Platform;
import org.eclipse.jem.util.logger.proxy.Logger;
import org.eclipse.jst.validation.test.BVTValidationPlugin;
import org.eclipse.wst.validation.internal.ValidatorMetaData;
public class TestcaseMetaData {
private String _pluginId = null; // The plugin id that has contributed this test case.
private ValidatorMetaData _vmd = null;
private MessageMetaData[] _messages = null;
private String _project = null; // the name of the project that this test case tests
private String[] _resourceNames = null; // the resources listed in the MessageMetaData of this test case.
private String _inputFileName = null;
private String _name = null; // the name of the test case
public TestcaseMetaData(String pluginName, String project, ValidatorMetaData vmd, String inputFileName) {
_pluginId = pluginName;
_project = project;
_vmd = vmd;
_inputFileName = inputFileName;
}
public String getDeclaringPluginId() {
return _pluginId;
}
public String getProject() {
return _project;
}
public IProject findProject() {
return ResourcesPlugin.getWorkspace().getRoot().getProject(_project);
}
public String getInputFileName() {
return _inputFileName;
}
public int getNumMessages() {
return getMessages().size();
}
// The messages need to be stored in a list instead of an array because
// the list is sorted before searching & displaying.
public List getMessages() {
List copy = new ArrayList();
for(int i=0; i<_messages.length; i++) {
copy.add(_messages[i]);
}
return copy;
}
// Return the resources in this project for which there is a message in this test case.
// No resource instance will be in the resource more than once.
public IResource[] getResources(IProject project) {
Set temp = new HashSet(); // use a set in case there is more than one message registered against a resource (don't want duplicates in the list).
String[] resourceNames = getResourceNames();
for(int i=0; i<resourceNames.length; i++) {
String resourceName = resourceNames[i];
IResource resource = project.findMember(resourceName);
if(resource != null) {
// resource exists
temp.add(resource);
}
}
IResource[] result = new IResource[temp.size()];
temp.toArray(result);
return result;
}
public String[] getResourceNames() {
if(_resourceNames == null) {
_resourceNames = new String[_messages.length];
for(int i=0; i<_messages.length; i++) {
_resourceNames[i] = _messages[i].getResource();
}
}
return _resourceNames;
}
/**
* When an empty TMD is used to test an operation, and the operation needs the IResource[]
* affected by the TMD to know whether or not the operation passes (i.e., one of the ValidatorSubsetOperation
* constructors takes an IResource[], and the IResource[] must not be empty or null), then
* this method is used to set the "resources" affected by the test case.
*/
public void setResourceNames(String[] resourceNames) {
_resourceNames = resourceNames;
}
public void setMessages(MessageMetaData[] messages) {
// If messages are null, that means that the test case expects no validation errors.
_messages = ((messages == null) ? new MessageMetaData[0] : messages);
}
public ValidatorMetaData getValidatorMetaData() {
return _vmd;
}
public String getValidatorClass() {
return getValidatorMetaData().getValidatorUniqueName();
}
public String getName() {
if(_name == null) {
_name = _vmd.getValidatorDisplayName() + "::" + getProject(); //$NON-NLS-1$
}
return _name;
}
public String getInputDir() {
// If the directory where the testcase input isn't specified,
// assume that the input is in a subdirectory, named "testInput",
// of the testcase's plugin.
IPluginRegistry registry = Platform.getPluginRegistry();
IPluginDescriptor descriptor = registry.getPluginDescriptor(getDeclaringPluginId());
if(descriptor != null) {
// Because Platform.asLocalURL throws an IOException if the URL resolves
// to a directory, find the plugin.xml file and then strip off the file name
// to find the testInput directory.
try {
String pluginXmlPath = Platform.asLocalURL(new URL(descriptor.getInstallURL(), "plugin.xml")).getPath(); //$NON-NLS-1$
File pluginXml = new File(pluginXmlPath);
if(pluginXml.exists()) {
File inputDir = new File(pluginXml.getParent(), "testInput"); //$NON-NLS-1$
if (inputDir.exists() && inputDir.isDirectory()) {
return inputDir.getPath();
}
}
}
catch(java.io.IOException exc) {
Logger logger = BVTValidationPlugin.getPlugin().getMsgLogger();
if(logger.getLevel() == Level.SEVERE) {
logger.write(Level.SEVERE, exc);
}
}
}
// Should never get here, but if we do, assume that the input
// directory is the current directory.
return System.getProperty("user.dir"); //$NON-NLS-1$
}
}