blob: f310d381b84464ee8de69990bb4c7362472d9efe [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2006, 2015 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.help.internal.dynamic;
import org.eclipse.help.internal.Anchor;
import org.eclipse.help.internal.UAElement;
import org.eclipse.help.internal.UAElementFactory;
import org.eclipse.help.internal.extension.ContentExtension;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
/*
* The handler responsible for processing content extensions (contributions
* into anchors and element replacements).
*/
public class ExtensionHandler extends ProcessorHandler {
private static final String ATTRIBUTE_ID = "id"; //$NON-NLS-1$
private ExtensionResolver resolver;
private DocumentReader reader;
private String locale;
/*
* This handler must know the locale since it's pulling content
* in from other documents.
*/
public ExtensionHandler(DocumentReader reader, String locale) {
this.reader = reader;
this.locale = locale;
}
@Override
public short handle(UAElement element, String path) {
if (element instanceof Anchor) {
return handleExtension(element, path, ContentExtension.CONTRIBUTION);
}
if (element.getAttribute(ATTRIBUTE_ID) != null) {
return handleExtension(element, path, ContentExtension.REPLACEMENT);
}
return UNHANDLED;
}
/*
* Handle the given extension-related node. It is either an anchor
* or an element with an id that could potentially be replaced.
*/
private short handleExtension(UAElement uaElement, String path, int type) {
String id = uaElement.getAttribute(ATTRIBUTE_ID);
if (id != null && id.length() > 0) {
if (resolver == null) {
resolver = new ExtensionResolver(getProcessor(), reader, locale);
}
// get the nodes to insert/replace with
Node[] nodes = resolver.resolveExtension(path + '#' + id, type);
if (nodes != null && nodes.length > 0) {
Element domElement = uaElement.getElement();
UAElement parent = uaElement.getParentElement();
for (int i=0;i<nodes.length;++i) {
if (nodes[i].getNodeType() == Node.ELEMENT_NODE) {
// ensure elements are typed
parent.insertBefore(UAElementFactory.newElement((Element)nodes[i]), uaElement);
}
else {
// text nodes are not typed
Node node = domElement.getOwnerDocument().importNode(nodes[i], true);
parent.getElement().insertBefore(node, domElement);
}
}
parent.removeChild(uaElement);
return HANDLED_SKIP;
}
}
// always remove anchors, even invalid ones
if (type == ContentExtension.CONTRIBUTION) {
uaElement.getParentElement().removeChild(uaElement);
return HANDLED_SKIP;
}
// it was an element with id, but no replacements
return UNHANDLED;
}
}