blob: 0e3fff344d2a2ac46dfbebafc41f85ca3c5807fd [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2006 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.pde.tools.internal.versioning;
import java.io.*;
import java.net.URL;
import java.util.*;
import javax.xml.parsers.*;
import javax.xml.transform.*;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.eclipse.core.runtime.*;
import org.eclipse.jdt.core.util.IClassFileReader;
import org.eclipse.osgi.util.NLS;
import org.eclipse.pde.tools.versioning.ICompareResult;
import org.eclipse.pde.tools.versioning.IVersionCompare;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
public class VersionCompareDispatcher implements IVersionCompare {
private static final String NAME_STRING = "Name"; //$NON-NLS-1$
private static final String ERROR_STRING = "Error"; //$NON-NLS-1$
private static final String WARNING_STRING = "Warning"; //$NON-NLS-1$
private static final String INFO_STRING = "Information"; //$NON-NLS-1$
private static final String SEVERITY_CODE_STRING = "SeverityCode"; //$NON-NLS-1$
private static final String VERSION_STRING = "Version"; //$NON-NLS-1$
private static final String XML_VERSION = "1.0"; //$NON-NLS-1$
/* (non-Javadoc)
* @see org.eclipse.pde.tools.versioning.IVersionCompare#checkFeatureVersions(java.lang.String, java.lang.String, boolean, File, IProgressMonitor)
*/
public IStatus checkFeatureVersions(String path1, String path2, boolean needPluginCompare, File versionOptionFile, IProgressMonitor monitor) throws CoreException {
return new FeatureVersionCompare().checkFeatureVersions(path1, path2, needPluginCompare, versionOptionFile, monitor);
}
/* (non-Javadoc)
* @see org.eclipse.pde.tools.versioning.IVersionCompare#checkFeatureVersions(java.net.URL, java.net.URL, boolean, File, IProgressMonitor)
*/
public IStatus checkFeatureVersions(URL configURL1, URL configURL2, boolean needPluginCompare, File compareOptionFile, IProgressMonitor monitor) throws CoreException {
return new FeatureVersionCompare().checkFeatureVersions(configURL1, configURL2, needPluginCompare, compareOptionFile, monitor);
}
/* (non-Javadoc)
* @see org.eclipse.pde.tools.versioning.IVersionCompare#checkFeatureVersions(java.io.File, java.io.File, boolean, File, IProgressMonitor)
*/
public IStatus checkFeatureVersions(File file1, File file2, boolean needPluginCompare, File compareOptionFile, IProgressMonitor monitor) throws CoreException {
return new FeatureVersionCompare().checkFeatureVersions(file1, file2, needPluginCompare, compareOptionFile, monitor);
}
/* (non-Javadoc)
* @see org.eclipse.pde.tools.versioning.IVersionCompare#checkPluginVersions(String, String, IProgressMonitor)
*/
public ICompareResult checkPluginVersions(String plugin1, String plugin2, IProgressMonitor monitor) throws CoreException {
MultiStatus finalResult = new MultiStatus(VersionCompareConstants.PLUGIN_ID, IStatus.OK, Messages.FeatureVersionCompare_errorReasonMsg, null);
return new CompareResult(new PluginVersionCompare().checkPluginVersions(finalResult, plugin1, plugin2, monitor), finalResult);
}
/* (non-Javadoc)
* @see org.eclipse.pde.tools.versioning.IVersionCompare#checkPluginVersions(URL, URL, IProgressMonitor)
*/
public ICompareResult checkPluginVersions(URL pluginURL1, URL pluginURL2, IProgressMonitor monitor) throws CoreException {
MultiStatus finalResult = new MultiStatus(VersionCompareConstants.PLUGIN_ID, IStatus.OK, Messages.FeatureVersionCompare_errorReasonMsg, null);
return new CompareResult(new PluginVersionCompare().checkPluginVersions(finalResult, pluginURL1, pluginURL2, monitor), finalResult);
}
/* (non-Javadoc)
* @see org.eclipse.pde.tools.versioning.IVersionCompare#checkPluginVersions(File, File, IProgressMonitor)
*/
public ICompareResult checkPluginVersions(File pluginFile1, File pluginFile2, IProgressMonitor monitor) throws CoreException {
MultiStatus finalResult = new MultiStatus(VersionCompareConstants.PLUGIN_ID, IStatus.OK, Messages.FeatureVersionCompare_errorReasonMsg, null);
return new CompareResult(new PluginVersionCompare().checkPluginVersions(finalResult, pluginFile1, pluginFile2, monitor), finalResult);
}
/* (non-Javadoc)
* @see org.eclipse.pde.tools.versioning.IVersionCompare#checkJavaClassVersions(String, String, IProgressMonitor)
*/
public ICompareResult checkJavaClassVersions(String javaClass1, String javaClass2, IProgressMonitor monitor) throws CoreException {
MultiStatus finalResult = new MultiStatus(VersionCompareConstants.PLUGIN_ID, IStatus.OK, Messages.FeatureVersionCompare_errorReasonMsg, null);
return new CompareResult(new JavaClassVersionCompare().checkJavaClassVersions(finalResult, javaClass1, javaClass2, monitor), finalResult);
}
/* (non-Javadoc)
* @see org.eclipse.pde.tools.versioning.IVersionCompare#checkJavaClassVersions(URL, URL, IProgressMonitor)
*/
public ICompareResult checkJavaClassVersions(URL javaClassURL1, URL javaClassURL2, IProgressMonitor monitor) throws CoreException {
MultiStatus finalResult = new MultiStatus(VersionCompareConstants.PLUGIN_ID, IStatus.OK, Messages.FeatureVersionCompare_errorReasonMsg, null);
return new CompareResult(new JavaClassVersionCompare().checkJavaClassVersions(finalResult, javaClassURL1, javaClassURL2, monitor), finalResult);
}
/* (non-Javadoc)
* @see org.eclipse.pde.tools.versioning.IVersionCompare#checkJavaClassVersions(File, File, IProgressMonitor)
*/
public ICompareResult checkJavaClassVersions(File javaClassFile1, File javaClassFile2, IProgressMonitor monitor) throws CoreException {
MultiStatus finalResult = new MultiStatus(VersionCompareConstants.PLUGIN_ID, IStatus.OK, Messages.FeatureVersionCompare_errorReasonMsg, null);
return new CompareResult(new JavaClassVersionCompare().checkJavaClassVersions(finalResult, javaClassFile1, javaClassFile1, monitor), finalResult);
}
/* (non-Javadoc)
* @see org.eclipse.pde.tools.versioning.IVersionCompare#checkJavaClassVersions(InputStream, InputStream, IProgressMonitor)
*/
public ICompareResult checkJavaClassVersions(InputStream javaClassInputStream1, InputStream javaClassInputStream2, IProgressMonitor monitor) throws CoreException {
MultiStatus finalResult = new MultiStatus(VersionCompareConstants.PLUGIN_ID, IStatus.OK, Messages.FeatureVersionCompare_errorReasonMsg, null);
return new CompareResult(new JavaClassVersionCompare().checkJavaClassVersions(finalResult, javaClassInputStream1, javaClassInputStream2, monitor), finalResult);
}
/* (non-Javadoc)
* @see org.eclipse.pde.tools.versioning.IVersionCompare#checkJavaClassVersions(IClassFileReader, IClassFileReader, IProgressMonitor)
*/
public ICompareResult checkJavaClassVersions(IClassFileReader classFileReader1, IClassFileReader classFileReader2, IProgressMonitor monitor) throws CoreException {
MultiStatus finalResult = new MultiStatus(VersionCompareConstants.PLUGIN_ID, IStatus.OK, Messages.FeatureVersionCompare_errorReasonMsg, null);
return new CompareResult(new JavaClassVersionCompare().checkJavaClassVersions(finalResult, classFileReader1, classFileReader2, monitor), finalResult);
}
/* (non-Javadoc)
* @see org.eclipse.pde.tools.versioning.IVersionCompare#processCompareResult(IStatus status, int infoChoice)
*/
public IStatus processCompareResult(IStatus status, int infoChoice) {
if (!status.isMultiStatus())
return status;
// create a new multi-status
MultiStatus multiStatus = new MultiStatus(VersionCompareConstants.PLUGIN_ID, IStatus.OK, status.getMessage(), null);
// get children status from result status
IStatus[] childStatus = status.getChildren();
for (int i = 0; i < childStatus.length; i++) {
if ((childStatus[i].getCode() & infoChoice) != 0) {
multiStatus.merge(childStatus[i]);
}
}
return multiStatus;
}
/* (non-Javadoc)
* @see org.eclipse.pde.tools.versioning.IVersionCompare#processExclusionListFile(File file)
*/
public Map processInclusionListFile(File file) throws CoreException {
Map table = new Hashtable();
FileInputStream fileInputStream = null;
try {
//create a properties instance
Properties ppt = new Properties();
// get InputStream of exclusion-list-file
fileInputStream = new FileInputStream(file);
// load property file
ppt.load(fileInputStream);
for (Iterator iterator = ppt.keySet().iterator(); iterator.hasNext();) {
Object key = iterator.next();
String property = ppt.getProperty((String) key);
if (property == null || property.trim().equals(VersionCompareConstants.EMPTY_STRING))
continue;
List propertyValueList = generateList(property.split(VersionCompareConstants.COMMA_MARK));
table.put(key, propertyValueList);
}
} catch (FileNotFoundException fnfe) {
throw new CoreException(new Status(IStatus.ERROR, VersionCompareConstants.PLUGIN_ID, IStatus.ERROR, NLS.bind(Messages.VersionCompareDispatcher_fileNotFoundMsg, file.getAbsolutePath()), fnfe));
} catch (IOException ioe) {
throw new CoreException(new Status(IStatus.ERROR, VersionCompareConstants.PLUGIN_ID, IStatus.ERROR, NLS.bind(Messages.VersionCompareDispatcher_readPropertyFailedMsg, file.getAbsolutePath()), ioe));
} finally {
if (fileInputStream != null) {
// close FileInputStream
try {
fileInputStream.close();
} catch (IOException ioe) {
throw new CoreException(new Status(IStatus.ERROR, VersionCompareConstants.PLUGIN_ID, IStatus.ERROR, NLS.bind(Messages.VersionCompareDispatcher_closeFileFailedMsg, file.getAbsolutePath()), ioe));
}
fileInputStream = null;
}
}
return table;
}
/**
* generates a List which stores instances in array <code>objects</code>
*
* @param objects instance objects
* @return List
*/
private List generateList(Object[] objects) {
ArrayList list = new ArrayList(0);
if (objects == null || objects.length == 0)
return list;
for (int i = 0; i < objects.length; i++)
list.add(objects[i]);
return list;
}
/**
* writes out children statuses of <code>status</code> to XML file denoted by <code>fileName</code>
* @param status IStatus instance
* @param fileName String name of a XML file
* @throws CoreException <p>if any nested CoreException has been caught</p>
*/
public void writeToXML(IStatus status, String fileName) throws CoreException {
Document doc = createXMLDoc(status);
writeToXML(doc, fileName);
}
/**
* creates a Document instance containing elements each of which represent a child status
* of <code>status</code>
* @param status IStatus instance
* @throws CoreException <p>if any ParserConfigurationException, or FactoryConfigurationError has been caught</p>
*/
private Document createXMLDoc(IStatus status) throws CoreException {
DocumentBuilder docBuilder = null;
// create a DocumentBuilder instance
try {
docBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
} catch (ParserConfigurationException pce) {
throw new CoreException(new Status(IStatus.ERROR, VersionCompareConstants.PLUGIN_ID, IStatus.ERROR, Messages.VersionCompareDispatcher_failedCreateDocMsg, pce));
} catch (FactoryConfigurationError fce) {
throw new CoreException(new Status(IStatus.ERROR, VersionCompareConstants.PLUGIN_ID, IStatus.ERROR, Messages.VersionCompareDispatcher_failedCreateDocMsg, fce));
}
// create a Document instance
Document doc = docBuilder.newDocument();
// create the root element
Element rootElement = doc.createElement(VersionCompareConstants.ROOT_ELEMENT_NAME);
rootElement.setAttribute(VERSION_STRING, XML_VERSION);
doc.appendChild(rootElement);
// create sub elements to contain different type of status
Element errorElement = doc.createElement(VersionCompareConstants.SEVERITY_ELEMENT_NAME);
errorElement.setAttribute(NAME_STRING, ERROR_STRING);
errorElement.setAttribute(SEVERITY_CODE_STRING, String.valueOf(IStatus.ERROR));
rootElement.appendChild(errorElement);
Element warningElement = doc.createElement(VersionCompareConstants.SEVERITY_ELEMENT_NAME);
warningElement.setAttribute(NAME_STRING, WARNING_STRING);
warningElement.setAttribute(SEVERITY_CODE_STRING, String.valueOf(IStatus.WARNING));
rootElement.appendChild(warningElement);
Element infoElement = doc.createElement(VersionCompareConstants.SEVERITY_ELEMENT_NAME);
infoElement.setAttribute(NAME_STRING, INFO_STRING);
infoElement.setAttribute(SEVERITY_CODE_STRING, String.valueOf(IStatus.INFO));
rootElement.appendChild(infoElement);
// get children statuses
IStatus[] children = status.getChildren();
if (children.length == 0)
return doc;
// create element for each children status
for (int i = 0; i < children.length; i++) {
switch (children[i].getSeverity()) {
case IStatus.ERROR : {
Element childElement = doc.createElement(VersionCompareConstants.CHILDREN_ELEMENT_NAME);
childElement.setAttribute(VersionCompareConstants.CODE_ATTRIBUTE_NAME, String.valueOf(children[i].getCode()));
childElement.setAttribute(VersionCompareConstants.MESSAGE_ATTRIBUTE_NAME, String.valueOf(children[i].getMessage()));
errorElement.appendChild(childElement);
break;
}
case IStatus.WARNING : {
Element childElement = doc.createElement(VersionCompareConstants.CHILDREN_ELEMENT_NAME);
childElement.setAttribute(VersionCompareConstants.CODE_ATTRIBUTE_NAME, String.valueOf(children[i].getCode()));
childElement.setAttribute(VersionCompareConstants.MESSAGE_ATTRIBUTE_NAME, String.valueOf(children[i].getMessage()));
warningElement.appendChild(childElement);
break;
}
case IStatus.INFO : {
Element childElement = doc.createElement(VersionCompareConstants.CHILDREN_ELEMENT_NAME);
childElement.setAttribute(VersionCompareConstants.CODE_ATTRIBUTE_NAME, String.valueOf(children[i].getCode()));
childElement.setAttribute(VersionCompareConstants.MESSAGE_ATTRIBUTE_NAME, String.valueOf(children[i].getMessage()));
infoElement.appendChild(childElement);
break;
}
}
}
return doc;
}
/**
* writes out <code>doc</code> to the xml file denoted by <code>fileName</code>
* @param doc Document instance
* @param fileName String which denotes a xml file
* @throws CoreException <p>if any TransformerConfigurationException, or TransformerException has been caught</p>
*/
private void writeToXML(Document doc, String fileName) throws CoreException {
if (!isXMLfile(fileName))
throw new CoreException(new Status(IStatus.ERROR, VersionCompareConstants.PLUGIN_ID, IStatus.ERROR, NLS.bind(Messages.VersionCompareDispatcher_invalidXMLFileNameMsg, fileName), null));
// create a DOMSource instance
DOMSource doms = new DOMSource(doc);
// create a File instance
File file = new File(fileName);
// create a StreamResult instance of file
StreamResult streamResult = new StreamResult(file);
try {
// set output properties
TransformerFactory factory = TransformerFactory.newInstance();
Transformer transformer = factory.newTransformer();
Properties properties = transformer.getOutputProperties();
properties.setProperty(OutputKeys.ENCODING, VersionCompareConstants.ENCODING_TYPE);
transformer.setOutputProperties(properties);
// write out doc
transformer.transform(doms, streamResult);
} catch (TransformerConfigurationException tce) {
throw new CoreException(new Status(IStatus.ERROR, VersionCompareConstants.PLUGIN_ID, IStatus.ERROR, NLS.bind(Messages.VersionCompareDispatcher_failedWriteXMLFileMsg, fileName), tce));
} catch (TransformerException te) {
throw new CoreException(new Status(IStatus.ERROR, VersionCompareConstants.PLUGIN_ID, IStatus.ERROR, NLS.bind(Messages.VersionCompareDispatcher_failedWriteXMLFileMsg, fileName), te));
}
}
/**
* checks whether <code>file</code> represents a XML file
* @param fileName String name of a file
* @return <code>true</code> if <code>file</code> represents a XML file,
* <code>false</coc
*/
private boolean isXMLfile(String fileName) {
IPath path = new Path(fileName);
if (path.isValidPath(fileName)) {
String extension = path.getFileExtension();
if (extension == null)
return false;
if (!extension.equals(VersionCompareConstants.XML_FILE_EXTENSION))
return false;
return true;
}
return false;
}
}