blob: f52c0f98b0605fd7ba40dac28d72abfd180c326e [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2003 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.core.internal.registry;
import java.io.PrintWriter;
import org.eclipse.core.runtime.*;
/**
* The RegistryWriter is a helper/debugging class that dumps a loaded registry
* in a reasonably human readable form (i.e., XML).
*/
public class RegistryWriter {
public static final int INDENT = 2;
public static final String REGISTRY = "plugin-registry"; //$NON-NLS-1$
public RegistryWriter() {
super();
}
public void writeConfigurationElement(ConfigurationElement configElement, PrintWriter w, int indent) {
String element = configElement.getName();
if (element == null)
return;
String gap1 = ""; //$NON-NLS-1$
for (int i = 0; i < indent; i++)
gap1 += " "; //$NON-NLS-1$
String gap2 = gap1;
for (int i = 0; i < INDENT; i++)
gap2 += " "; //$NON-NLS-1$
w.print(gap1 + "<" + element); //$NON-NLS-1$
ConfigurationProperty[] propList = configElement.getProperties();
int propSize = (propList == null) ? 0 : propList.length;
for (int i = 0; i < propSize; i++)
writeConfigurationProperty(propList[i], w);
IConfigurationElement[] subElementList = configElement.getChildren();
int subElementSize = (subElementList == null) ? 0 : subElementList.length;
if (configElement.getValue() == null && subElementSize == 0) {
w.println("/>"); //$NON-NLS-1$
return;
}
w.println(">"); //$NON-NLS-1$
if (configElement.getValue() != null)
w.println(gap2 + xmlSafe(configElement.getValue()));
for (int i = 0; i < subElementSize; i++)
writeConfigurationElement((ConfigurationElement) subElementList[i], w, indent + INDENT);
w.println(gap1 + "</" + element + ">"); //$NON-NLS-1$ //$NON-NLS-2$
}
public void writeConfigurationProperty(ConfigurationProperty configProp, PrintWriter w) {
if (configProp.getName() == null)
return;
w.print(" " + xmlSafe(configProp.getName()) + "=\""); //$NON-NLS-1$ //$NON-NLS-2$
if (configProp.getValue() != null)
w.print(xmlSafe(configProp.getValue()));
w.print("\""); //$NON-NLS-1$
}
public void writeExtension(Extension extension, PrintWriter w, int indent) {
String gap1 = ""; //$NON-NLS-1$
for (int i = 0; i < indent; i++)
gap1 += " "; //$NON-NLS-1$
w.print(gap1 + "<" + ExtensionsParser.EXTENSION); //$NON-NLS-1$
if (extension.getExtensionPointIdentifier() != null)
w.print(" " + ExtensionsParser.EXTENSION_TARGET + "=\"" + xmlSafe(extension.getExtensionPointIdentifier()) + "\""); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
if (extension.getUniqueIdentifier() != null)
w.print(" " + ExtensionsParser.EXTENSION_ID + "=\"" + xmlSafe(extension.getUniqueIdentifier()) + "\""); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
if (extension.getName() != null)
w.print(" " + ExtensionsParser.EXTENSION_NAME + "=\"" + xmlSafe(extension.getName()) + "\""); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
IConfigurationElement[] subElements = extension.getConfigurationElements();
int size = (subElements == null) ? 0 : subElements.length;
if (size == 0) {
w.println("/>"); //$NON-NLS-1$
return;
}
w.println(">"); //$NON-NLS-1$
for (int i = 0; i < size; i++)
writeConfigurationElement((ConfigurationElement) subElements[i], w, indent + INDENT);
w.println(gap1 + "</" + ExtensionsParser.EXTENSION + ">"); //$NON-NLS-1$ //$NON-NLS-2$
}
public void writeExtensionPoint(ExtensionPoint extPt, PrintWriter w, int indent) {
String gap1 = ""; //$NON-NLS-1$
for (int i = 0; i < indent; i++)
gap1 += " "; //$NON-NLS-1$
w.print(gap1 + "<" + ExtensionsParser.EXTENSION_POINT); //$NON-NLS-1$
if (extPt.getUniqueIdentifier() != null)
w.print(" " + ExtensionsParser.EXTENSION_POINT_ID + "=\"" + xmlSafe(extPt.getUniqueIdentifier()) + "\""); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
if (extPt.getName() != null)
w.print(" " + ExtensionsParser.EXTENSION_POINT_NAME + "=\"" + xmlSafe(extPt.getName()) + "\""); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
w.println("/>"); //$NON-NLS-1$
}
public void writeBundleModel(Namespace plugin, PrintWriter w, int indent) {
String gap1 = ""; //$NON-NLS-1$
for (int i = 0; i < indent; i++)
gap1 += " "; //$NON-NLS-1$
String gap2 = gap1;
for (int i = 0; i < INDENT; i++)
gap2 += " "; //$NON-NLS-1$
w.println(""); //$NON-NLS-1$
w.print(gap1 + "<" + ExtensionsParser.PLUGIN); //$NON-NLS-1$
if (plugin.getUniqueIdentifier() != null)
w.print(" " + ExtensionsParser.PLUGIN_ID + "=\"" + xmlSafe(plugin.getUniqueIdentifier()) + "\""); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
if (plugin.getName() != null)
w.print(" " + ExtensionsParser.PLUGIN_NAME + "=\"" + xmlSafe(plugin.getName()) + "\""); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
w.println(">"); //$NON-NLS-1$
IExtensionPoint[] extensionPoints = plugin.getExtensionPoints();
int extPointsSize = (extensionPoints == null) ? 0 : extensionPoints.length;
if (extPointsSize != 0) {
w.println(""); //$NON-NLS-1$
for (int i = 0; i < extPointsSize; i++)
writeExtensionPoint((ExtensionPoint) extensionPoints[i], w, indent + INDENT);
}
IExtension[] extensions = plugin.getExtensions();
int extSize = (extensions == null) ? 0 : extensions.length;
if (extSize != 0) {
for (int i = 0; i < extSize; i++) {
w.println(""); //$NON-NLS-1$
writeExtension((Extension) extensions[i], w, indent + INDENT);
}
}
// Don't write fragments here. If we do, XML won't be
// able to parse what we write out. Fragments must be
// entities separate from plugins.
w.println(gap1 + "</" + ExtensionsParser.PLUGIN + ">"); //$NON-NLS-1$ //$NON-NLS-2$
}
public void writeRegistry(ExtensionRegistry registry, PrintWriter w, int indent) {
String gap1 = ""; //$NON-NLS-1$
for (int i = 0; i < indent; i++)
gap1 += " "; //$NON-NLS-1$
w.println(gap1 + "<" + REGISTRY + ">"); //$NON-NLS-1$ //$NON-NLS-2$
String[] list = registry.getNamespaces();
for (int i = 0; i < list.length; i++)
writeBundleModel(registry.getNamespace(list[i]), w, indent + INDENT);
w.println(gap1 + "</" + REGISTRY + ">"); //$NON-NLS-1$ //$NON-NLS-2$
w.flush();
}
private static void appendEscapedChar(StringBuffer buffer, char c) {
String replacement = getReplacement(c);
if (replacement != null) {
buffer.append('&');
buffer.append(replacement);
buffer.append(';');
} else {
if ((c >= ' ' && c <= 0x7E) || c == '\n' || c == '\r' || c == '\t') {
buffer.append(c);
} else {
buffer.append("&#"); //$NON-NLS-1$
buffer.append(Integer.toString(c));
buffer.append(';');
}
}
}
public static String xmlSafe(String s) {
StringBuffer result = new StringBuffer(s.length() + 10);
for (int i = 0; i < s.length(); ++i)
appendEscapedChar(result, s.charAt(i));
return result.toString();
}
private static String getReplacement(char c) {
// Encode special XML characters into the equivalent character references.
// These five are defined by default for all XML documents.
switch (c) {
case '<' :
return "lt"; //$NON-NLS-1$
case '>' :
return "gt"; //$NON-NLS-1$
case '"' :
return "quot"; //$NON-NLS-1$
case '\'' :
return "apos"; //$NON-NLS-1$
case '&' :
return "amp"; //$NON-NLS-1$
}
return null;
}
}