blob: a13708538076a05cb69c52b92327e9354a5aad28 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 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
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.pde.internal.core.plugin;
import java.io.PrintWriter;
import java.util.ArrayList;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.core.runtime.IExtension;
import org.eclipse.pde.core.plugin.IPluginElement;
import org.eclipse.pde.core.plugin.IPluginExtension;
import org.eclipse.pde.core.plugin.IPluginObject;
import org.eclipse.pde.internal.core.PDECore;
import org.eclipse.pde.internal.core.ischema.ISchema;
import org.eclipse.pde.internal.core.schema.SchemaRegistry;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
public class PluginExtension extends PluginParent implements IPluginExtension {
private static final long serialVersionUID = 1L;
protected String fPoint;
private transient ISchema schema;
private IExtension fExtension = null;
public PluginExtension() {
}
public PluginExtension(IExtension extension) {
fExtension = extension;
}
public String getPoint() {
if (fPoint == null && fExtension != null)
fPoint = fExtension.getExtensionPointUniqueIdentifier();
return fPoint;
}
public boolean isValid() {
return getPoint() != null;
}
public Object getSchema() {
if (schema == null) {
SchemaRegistry registry = PDECore.getDefault().getSchemaRegistry();
schema = registry.getSchema(fPoint);
} else if (schema.isDisposed()) {
schema = null;
}
return schema;
}
/*
* If this function is used to load the model, the extension registry cache will not be used when querying model.
*/
void load(Node node) {
this.fID = getNodeAttribute(node, "id"); //$NON-NLS-1$
fName = getNodeAttribute(node, "name"); //$NON-NLS-1$
fPoint = getNodeAttribute(node, "point"); //$NON-NLS-1$
if (fChildren == null)
fChildren = new ArrayList();
NodeList children = node.getChildNodes();
for (int i = 0; i < children.getLength(); i++) {
Node child = children.item(i);
if (child.getNodeType() == Node.ELEMENT_NODE) {
PluginElement childElement = new PluginElement();
childElement.setModel(getModel());
childElement.setInTheModel(true);
childElement.setParent(this);
this.fChildren.add(childElement);
childElement.load(child);
}
}
fStartLine = Integer.parseInt(getNodeAttribute(node, "line")); //$NON-NLS-1$
}
public boolean equals(Object obj) {
if (obj == this)
return true;
if (obj == null)
return false;
if (obj instanceof IPluginExtension) {
IPluginExtension target = (IPluginExtension) obj;
// comparing the model is a little complicated since we need to allow text and non-text models representing the same file
if (target.getModel().getClass() == getModel().getClass()) {
if (!target.getModel().equals(getModel()))
return false;
} else {
// need to account for text model representing the same resource.
IResource res = getModel().getUnderlyingResource();
if (res == null) {
// model is external model
if (!(target.getModel().getInstallLocation().equals(getModel().getInstallLocation())))
return false;
// model is a workspace model. Need to compare underlyingResource because text and non-text model return differently formatted strings
} else if (!(res.equals(target.getModel().getUnderlyingResource())))
return false;
}
if (!stringEqualWithNull(target.getId(), getId()))
return false;
if (!stringEqualWithNull(target.getPoint(), getPoint()))
return false;
if (!nameEqual(target.getName()))
return false;
// Children
return super.equals(obj);
}
return false;
}
private boolean nameEqual(String targetName) {
// Since extension registry returns "" when an extension's name == null, we have to do the same when comparing the name of the target.
// Note, we only do this if the PluginExtension has an fExtension element which means it's name comes from the extension registry.
if (fExtension != null && targetName == null)
targetName = ""; //$NON-NLS-1$
return stringEqualWithNull(targetName, getName());
}
public void setPoint(String point) throws CoreException {
ensureModelEditable();
String oldValue = fPoint;
fPoint = point;
firePropertyChanged(P_POINT, oldValue, point);
}
public void restoreProperty(String name, Object oldValue, Object newValue) throws CoreException {
if (name.equals(P_POINT)) {
setPoint(newValue != null ? newValue.toString() : null);
return;
}
super.restoreProperty(name, oldValue, newValue);
}
public String toString() {
if (getName() != null)
return getName();
return getPoint();
}
public void write(String indent, PrintWriter writer) {
writer.print(indent);
writer.print("<extension"); //$NON-NLS-1$
String attIndent = indent + PluginElement.ATTRIBUTE_SHIFT;
if (getId() != null) {
writer.println();
writer.print(attIndent + "id=\"" + getId() + "\""); //$NON-NLS-1$ //$NON-NLS-2$
}
if (getName() != null) {
writer.println();
writer.print(attIndent + "name=\"" + getWritableString(getName()) + "\""); //$NON-NLS-1$ //$NON-NLS-2$
}
if (getPoint() != null) {
writer.println();
writer.print(attIndent + "point=\"" + getPoint() + "\""); //$NON-NLS-1$ //$NON-NLS-2$
}
writer.println(">"); //$NON-NLS-1$
IPluginObject[] children = getChildren();
for (int i = 0; i < children.length; i++) {
IPluginElement child = (IPluginElement) children[i];
child.write(indent + PluginElement.ELEMENT_SHIFT, writer);
}
writer.println(indent + "</extension>"); //$NON-NLS-1$
}
public String getName() {
if (fName == null && fExtension != null) {
fName = fExtension.getLabel();
}
return fName;
}
public String getId() {
if (fID == null && fExtension != null) {
fID = fExtension.getUniqueIdentifier();
if (fID != null) {
String pluginId = getPluginBase().getId();
if (fID.startsWith(pluginId)) {
String sub = fID.substring(pluginId.length());
if (sub.lastIndexOf('.') == 0)
fID = sub.substring(1);
}
}
}
return fID;
}
protected ArrayList getChildrenList() {
if (fChildren == null) {
fChildren = new ArrayList();
if (fExtension != null) {
if (fExtension != null) {
IConfigurationElement[] elements = fExtension.getConfigurationElements();
for (int i = 0; i < elements.length; i++) {
PluginElement element = new PluginElement(elements[i]);
element.setModel(getModel());
element.setParent(this);
fChildren.add(element);
}
}
}
}
return fChildren;
}
}