blob: a40a464f74c6e0f47317fb45abbd0f305f74f448 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2005, 2007 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
*
*******************************************************************************/
package org.eclipse.dltk.validators.internal.core;
import java.io.IOException;
import java.io.StringReader;
import java.io.StringWriter;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Plugin;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.Preferences.IPropertyChangeListener;
import org.eclipse.core.runtime.Preferences.PropertyChangeEvent;
import org.eclipse.dltk.validators.core.IValidator;
import org.eclipse.dltk.validators.core.ValidatorRuntime;
import org.osgi.framework.BundleContext;
import org.w3c.dom.Document;
/**
* The activator class controls the plug-in life cycle
*/
public class ValidatorsCore extends Plugin implements IPropertyChangeListener {
// The plug-in ID
public static final String PLUGIN_ID = "org.eclipse.dltk.validators.core"; //$NON-NLS-1$
// The shared instance
private static ValidatorsCore plugin;
private boolean fIgnoreValidatorDefPropertyChangeEvents = false;
/**
* The constructor
*/
public ValidatorsCore() {
}
/*
* (non-Javadoc)
*
* @see
* org.eclipse.core.runtime.Plugins#start(org.osgi.framework.BundleContext)
*/
public void start(BundleContext context) throws Exception {
super.start(context);
plugin = this;
getPluginPreferences().addPropertyChangeListener(this);
}
/*
* (non-Javadoc)
*
* @see
* org.eclipse.core.runtime.Plugin#stop(org.osgi.framework.BundleContext)
*/
public void stop(BundleContext context) throws Exception {
getPluginPreferences().removePropertyChangeListener(this);
plugin = null;
super.stop(context);
}
/**
* Returns the shared instance
*
* @return the shared instance
*/
public static ValidatorsCore getDefault() {
return plugin;
}
/**
* Returns a Document that can be used to build a DOM tree
*
* @return the Document
* @throws ParserConfigurationException
* if an exception occurs creating the document builder
*/
public static Document getDocument() throws ParserConfigurationException {
DocumentBuilderFactory dfactory = DocumentBuilderFactory.newInstance();
DocumentBuilder docBuilder = dfactory.newDocumentBuilder();
Document doc = docBuilder.newDocument();
return doc;
}
public static String serializeDocument(Document doc) throws IOException,
TransformerException {
StringWriter s = new StringWriter();
TransformerFactory factory = TransformerFactory.newInstance();
Transformer transformer = factory.newTransformer();
transformer.setOutputProperty(OutputKeys.METHOD, "xml"); //$NON-NLS-1$
transformer.setOutputProperty(OutputKeys.INDENT, "yes"); //$NON-NLS-1$
DOMSource source = new DOMSource(doc);
StreamResult outputTarget = new StreamResult(s);
transformer.transform(source, outputTarget);
return s.toString();
}
public void setIgnoreValidatorDefPropertyChangeEvents(boolean ignore) {
fIgnoreValidatorDefPropertyChangeEvents = ignore;
}
public boolean isIgnoreValidatorDefPropertyChangeEvents() {
return fIgnoreValidatorDefPropertyChangeEvents;
}
public void propertyChange(PropertyChangeEvent event) {
String property = event.getProperty();
if (property.equals(ValidatorRuntime.PREF_VALIDATOR_XML)) {
if (!isIgnoreValidatorDefPropertyChangeEvents()) {
processValidatorPrefsChanged((String) event.getOldValue(),
(String) event.getNewValue());
}
}
}
private ValidatorDefinitionsContainer getValidatorDefinitions(String xml) {
if (xml != null && xml.length() > 0) {
try {
return ValidatorDefinitionsContainer
.createFromXML(new StringReader(xml));
} catch (IOException e) {
getLog().log(
new Status(IStatus.ERROR, PLUGIN_ID, 0,
ValidatorMessages.ValidatorsCore_exception, e));
}
}
return new ValidatorDefinitionsContainer();
}
protected void processValidatorPrefsChanged(String oldValue, String newValue) {
if (oldValue == null && newValue == null) {
return;
}
if (oldValue != null && oldValue.equals(newValue)) {
return;
}
// Generate the previous Validators
ValidatorDefinitionsContainer oldResults = getValidatorDefinitions(oldValue);
// Generate the current
ValidatorDefinitionsContainer newResults = getValidatorDefinitions(newValue);
// Determine the deleted validators
List deleted = new ArrayList(oldResults.getValidatorList());
deleted.removeAll(newResults.getValidatorList());
// Dispose ALL but built-in validators
for (Iterator i = deleted.iterator(); i.hasNext();) {
IValidator validator = (IValidator) i.next();
validator.getValidatorType().disposeValidator(validator.getID());
}
// fire event and reset initialized flag - during next call new
// validators would be loaded and added to the validatorType
ValidatorRuntime.fireValidatorChanged();
}
public static void log(IStatus status) {
getDefault().getLog().log(status);
}
public static void error(String message) {
log(new Status(IStatus.ERROR, PLUGIN_ID, IStatus.OK, message, null));
}
public static void error(String message, Throwable e) {
log(new Status(IStatus.ERROR, PLUGIN_ID, IStatus.OK, message, e));
}
public static void warn(String message) {
warn(message, null);
}
public static void warn(String message, Exception e) {
log(new Status(IStatus.WARNING, PLUGIN_ID, IStatus.OK, message, e));
}
}