blob: e5e1161bc543bc7d95467f0f2461e418f2fffb9c [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2006 Sybase, Inc. 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:
* Sybase, Inc. - initial API and implementation
*******************************************************************************/
package org.eclipse.jst.pagedesigner.editors.palette.impl;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.jst.pagedesigner.IJMTConstants;
import org.eclipse.jst.pagedesigner.PDPlugin;
import org.eclipse.jst.pagedesigner.common.logging.Logger;
import org.eclipse.jst.pagedesigner.dom.EditModelQuery;
import org.eclipse.jst.pagedesigner.editors.palette.IPaletteItemDescriptor;
import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
import org.eclipse.wst.xml.core.internal.provisional.document.IDOMText;
import org.w3c.dom.Attr;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.w3c.dom.Text;
/**
* @author mengbo
*/
public class PaletteElementTemplateHelper {
private static final String TEMPLATE_ITEM_NAME = "template";
private static final String PREFIX_ATTRIBUTE = "uri";
private static Logger _log = PDPlugin
.getLogger(PaletteElementTemplateHelper.class);
public static NodeList readTemplate(Element item) {
if (item != null) {
Node node = EditModelQuery.getChildDeferredNode(item,
new String[] { TEMPLATE_ITEM_NAME }, 1, true);
return node != null ? node.cloneNode(true).getChildNodes() : null;
}
return null;
}
/**
* This method is used to process template element which is read from .xmi
* file and generate default element.
*
* @param model
* @param element
* @param itemDes
*/
public static void applyTemplate(IDOMModel model, Element element,
IPaletteItemDescriptor itemDes) {
if (element == null || element.getLocalName() == null) {
return;
}
Node[] nl = itemDes.getTemplateSubNodes(model);
if (nl != null) {
for (int i = 0, n = nl.length; i < n; i++) {
element.appendChild(nl[i]);
}
}
}
/**
* Use the actrual prefixs of jsf html and jsf core to set the prefix of
* each node declared in template.
*
* @param prefixH
* @param prefixC
* @param nl
* @param document
* @return
*/
public static Node[] applyPrefixes(String prefixH, String prefixC,
NodeList nl, Document document) {
List result = new ArrayList();
for (int i = 0, n = nl.getLength(); i < n; i++) {
Node node = cloneNodeDeep(document, nl.item(i), prefixH, prefixC);
if (nl.item(i) instanceof Element) {
result.add(node);
}
}
return (Node[]) result.toArray(new Node[result.size()]);
}
/**
* TODO: Later we may add some logic to reference the tld file through tag
* name to resolve the prefixs directly.
*
* @param model
* @param prefixH
* @param prefixC
* @param node
* @return
*/
private static void internalApplyPrefixes(String prefixH, String prefixC,
Element refNode, Element node) {
if (node != null && refNode != null) {
String prefix = refNode.getAttribute(PREFIX_ATTRIBUTE); //$NON-NLS-1$
if (prefix != null) {
if (prefix.equalsIgnoreCase(IJMTConstants.URI_JSF_HTML)) //$NON-NLS-1$
{
node.setPrefix(prefixH);
} else if (prefix.equalsIgnoreCase(IJMTConstants.URI_JSF_CORE)) //$NON-NLS-1$
{
node.setPrefix(prefixC);
}
}
}
}
public static Node cloneNodeDeep(Document destDoc, Node sourceNode,
String prefixH, String prefixC) {
switch (sourceNode.getNodeType()) {
case Node.ELEMENT_NODE:
Element sourceEle = (Element) sourceNode;
Element resultEle = destDoc.createElement(sourceEle.getTagName());
internalApplyPrefixes(prefixH, prefixC, sourceEle, resultEle);
NamedNodeMap attrs = sourceEle.getAttributes();
for (int i = 0, size = attrs.getLength(); i < size; i++) {
Attr a = (Attr) attrs.item(i);
if (!PREFIX_ATTRIBUTE.equalsIgnoreCase(a.getNodeName())) {
resultEle.setAttribute(a.getName(), a.getValue());
}
}
NodeList children = sourceEle.getChildNodes();
for (int i = 0, size = children.getLength(); i < size; i++) {
Node n = children.item(i);
Node d = cloneNodeDeep(destDoc, n, prefixH, prefixC);
if (d != null) {
resultEle.appendChild(d);
}
}
return resultEle;
case Node.TEXT_NODE:
Text txt = destDoc.createTextNode(sourceNode.getNodeValue());
if (txt instanceof IDOMText && sourceNode instanceof IDOMText) {
try {
((IDOMText) txt).setSource(((IDOMText) sourceNode)
.getSource());
} catch (Exception ex) {
// ignore
}
}
return txt;
case Node.CDATA_SECTION_NODE:
return destDoc.createCDATASection(sourceNode.getNodeValue());
default:
return null; // not support.
}
}
}