blob: 99c7239b1b6462a31eaf120b4cad97558e7e2a2b [file] [log] [blame]
package org.eclipse.jst.validation.test.setup;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Iterator;
import java.util.List;
import java.util.logging.Level;
import org.eclipse.core.resources.IWorkspaceRunnable;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPluginDescriptor;
import org.eclipse.core.runtime.IPluginRegistry;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.Platform;
import org.eclipse.jst.validation.sample.parser.PropertyLine;
import org.eclipse.jst.validation.sample.workbenchimpl.PluginPropertyFile;
import org.eclipse.jst.validation.test.BVTValidationPlugin;
import org.eclipse.jst.validation.test.ValidationTypeEnum;
import org.eclipse.jst.validation.test.internal.registry.MessageUtility;
import org.eclipse.jst.validation.test.internal.registry.ValidatorTestcase;
import org.eclipse.jst.validation.test.internal.util.BVTValidationUtility;
import org.eclipse.wst.validation.internal.ValidatorMetaData;
/**
* Generate a FVT test case for every EJB Validator validation marker on each
* selected project.
*/
public final class CheckForUntestedPropertiesOperation implements IWorkspaceRunnable {
private ValidatorMetaData _vmd = null;
private IBuffer _buffer = null;
private String _resourceBundleName = null;
public CheckForUntestedPropertiesOperation(IBuffer buffer, ValidatorMetaData vmd, String resourceBundleName) {
setValidatorMetaData(vmd);
setBuffer(buffer);
setResourceBundleName(resourceBundleName);
}
public IBuffer getBuffer() {
return _buffer;
}
void setBuffer(IBuffer b) {
_buffer = b;
}
public ValidatorMetaData getValidatorMetaData() {
return _vmd;
}
private String getPluginId(ValidatorMetaData vmd) {
try {
// TODO Remove this hack once a getter has been added to ValidatorMetaData for its pluginId.
if (vmd != null) {
ClassLoader cl = vmd.getValidator().getClass().getClassLoader();
IPluginRegistry registry = Platform.getPluginRegistry();
IPluginDescriptor[] descriptors = registry.getPluginDescriptors();
for (int i = 0; i < descriptors.length; i++) {
IPluginDescriptor desc = descriptors[i];
if (desc.getPluginClassLoader().equals(cl)) {
return desc.getUniqueIdentifier();
}
}
}
} catch (InstantiationException exc) {
BVTValidationPlugin.getPlugin().handleException(exc);
}
return null;
}
void setValidatorMetaData(ValidatorMetaData vmd) {
_vmd = vmd;
}
public String getResourceBundleName() {
return _resourceBundleName;
}
void setResourceBundleName(String name) {
_resourceBundleName = name;
}
/**
* @see org.eclipse.core.resources.IWorkspaceRunnable#run(IProgressMonitor)
*/
public void run(IProgressMonitor monitor) throws CoreException {
List pLines = null;
List untestedLines = new ArrayList();
List testedLines = new ArrayList();
Comparator comparator = MessageUtility.getMessagePrefixComparator();
// Assume that the BVT tests were run on the projects before this menu
// action was clicked.
// Load and parse the .properties file to know what message ids to look
// for.
String propFileName = getResourceBundleName();
ValidatorMetaData vmd = getValidatorMetaData();
monitor.subTask("Attempting to load file: " + propFileName); //$NON-NLS-1$
String pluginId = getPluginId(vmd);
if (pluginId == null) {
String msg = "Cannot load plugin id for validator " + vmd.getValidatorDisplayName();//$NON-NLS-1$
monitor.subTask(msg);
BVTValidationPlugin.getPlugin().log(Level.SEVERE, msg);
return;
}
PluginPropertyFile pFile = new PluginPropertyFile(pluginId, propFileName);
monitor.worked(1);
monitor.subTask("Parsing."); //$NON-NLS-1$
pLines = pFile.getPropertyLines();
Collections.sort(pLines, comparator); // false = no verbose output
monitor.worked(1);
monitor.subTask("Loading test messages."); //$NON-NLS-1$
ValidatorTestcase[] tmds = BVTValidationUtility.getValidatorTests(monitor, vmd);
for (int k = 0; k < tmds.length; k++) {
ValidatorTestcase tmd = tmds[k];
List mssg = tmd.getMessages(ValidationTypeEnum.RUN_VALIDATION);
testedLines.addAll(mssg);
}
Collections.sort(testedLines, comparator);
monitor.subTask("Comparing."); //$NON-NLS-1$
Iterator iterator = pLines.iterator();
while (iterator.hasNext()) {
if (monitor.isCanceled()) {
return;
}
PropertyLine line = (PropertyLine)iterator.next();
int index = Collections.binarySearch(testedLines, line, comparator);
if (index < 0) {
// not found.
untestedLines.add(line);
}
}
monitor.worked(1);
// now see if the list of untested lines has entries.
Collections.sort(untestedLines, comparator);
Iterator untestediterator = untestedLines.iterator();
if (untestediterator.hasNext()) {
getBuffer().write("List of messages which are not tested (" + untestedLines.size() + " of " + pLines.size() + ")"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
} else {
getBuffer().write("All messages are tested."); //$NON-NLS-1$
}
while (untestediterator.hasNext()) {
if (monitor.isCanceled()) {
return;
}
PropertyLine line = (PropertyLine)untestediterator.next();
getBuffer().write(line.toString());
}
untestedLines.clear(); // clear the list for the next project
testedLines.clear();
monitor.worked(1);
}
}