Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/model/util/ModelUtil.java')
-rw-r--r--org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/model/util/ModelUtil.java798
1 files changed, 399 insertions, 399 deletions
diff --git a/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/model/util/ModelUtil.java b/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/model/util/ModelUtil.java
index 97caea031..1a2383df2 100644
--- a/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/model/util/ModelUtil.java
+++ b/org.eclipse.ui.intro/src/org/eclipse/ui/internal/intro/impl/model/util/ModelUtil.java
@@ -40,407 +40,407 @@ import org.w3c.dom.NodeList;
*/
public class ModelUtil {
- private static String TAG_BODY = "body"; //$NON-NLS-1$
- private static String TAG_HEAD = "head"; //$NON-NLS-1$
- private static String TAG_BASE = "base"; //$NON-NLS-1$
- public static String TAG_DIV = "div"; //$NON-NLS-1$
- public static String TAG_HEAD_LINK = "link"; //$NON-NLS-1$
- private static String TAG_PARAM = "param"; //$NON-NLS-1$
- private static String ATT_SRC = "src"; //$NON-NLS-1$
- private static String ATT_HREF = "href"; //$NON-NLS-1$
- private static String ATT_CITE = "cite"; //$NON-NLS-1$
- private static String ATT_LONGDESC = "longdesc"; //$NON-NLS-1$
- private static String ATT_DATA = "data"; //$NON-NLS-1$
- private static String ATT_CODEBASE = "codebase"; //$NON-NLS-1$
- private static String ATT_VALUE = "value"; //$NON-NLS-1$
- private static String ATT_VALUE_TYPE = "valuetype"; //$NON-NLS-1$
- private static String ATT_REL = "rel"; //$NON-NLS-1$
- private static String ATT_TYPE = "type"; //$NON-NLS-1$
-
-
-
- /*
- * ********* Model util methods ************************************
- */
-
- /**
- * Checks to see if the passed string is a valid URL (has a protocol), if
- * yes, returns it as is. If no, treats it as a resource relative to the
- * declaring plugin. Return the plugin relative location, fully qualified.
- * Retruns null if the passed string itself is null.
- *
- * @param resource
- * @param pluginDesc
- * @return returns the URL as is if it had a protocol.
- */
- public static String resolveURL(String url, String pluginId) {
- Bundle bundle = null;
- if (pluginId != null)
- // if pluginId is not null, use it.
- bundle = Platform.getBundle(pluginId);
- return resolveURL("", url, bundle); //$NON-NLS-1$
- }
-
-
-
- /**
- * Checks to see if the passed string is a valid URL (has a protocol), if
- * yes, returns it as is. If no, treats it as a resource relative to the
- * declaring plugin. Return the plugin relative location, fully qualified.
- * Retruns null if the passed string itself is null.
- *
- * @param resource
- * @param pluginDesc
- * @return returns the URL as is if it had a protocol.
- */
- public static String resolveURL(String url, IConfigurationElement element) {
- Bundle bundle = BundleUtil.getBundleFromConfigurationElement(element);
- return resolveURL("", url, bundle); //$NON-NLS-1$
- }
-
-
-
- /**
- * @see resolveURL(String url, IConfigurationElement element)
- */
- public static String resolveURL(String base, String url, Bundle bundle) {
- // quick exit
- if (url == null)
- return null;
- IntroURLParser parser = new IntroURLParser(url);
- if (parser.hasProtocol())
- return url;
- // make plugin relative url. Only now we need the bundle.
- return BundleUtil.getResolvedResourceLocation(base, url, bundle);
- }
-
- /**
- * Ensures that a file:// URL exists for the bundle root. This will
- * cause jarred bundles to be extracted into a cache directory.
- */
- public static void ensureFileURLsExist(Bundle bundle, String contentFile) {
- try {
- FileLocator.toFileURL(bundle.getEntry("/")); //$NON-NLS-1$
- } catch (Exception e) {
- if (contentFile != null)
- Log.error("Failed to extract Intro content folder for: " //$NON-NLS-1$
- + contentFile, e);
- }
- }
-
-
- /**
- * Returns the path to the parent folder containing the passed content xml
- * file. It is assumed that the path is a local url representing a content
- * file.
- */
- public static String getParentFolderToString(String contentFilePath) {
- IPath path = getParentFolderPath(contentFilePath);
- return path.toString();
- }
-
-
- /*
- *
- * ******** XHTML DOM util methods *********************************
- */
-
- /**
- * Returns the path to the parent folder containing the passed content xml
- * file. It is assumed that the path is a local url representing a content
- * file.
- */
- public static String getParentFolderOSString(String contentFilePath) {
- IPath path = getParentFolderPath(contentFilePath);
- return path.toOSString();
- }
-
- /**
- * Returns the parent folder of the given path.
- */
- public static IPath getParentFolderPath(String contentFilePath) {
- IPath path = new Path(contentFilePath);
- path = path.removeLastSegments(1).addTrailingSeparator();
- return path;
- }
-
-
-
-
- public static void insertBase(Document dom, String baseURL) {
- // there should only be one head and one base element dom.
- NodeList headList = dom.getElementsByTagName(TAG_HEAD);
- Element head = (Element) headList.item(0);
- NodeList baseList = head.getElementsByTagName(TAG_BASE);
- if (baseList.getLength() == 0) {
- // insert a base element, since one is not defined already.
- Element base = dom.createElement(TAG_BASE);
- base.setAttribute(ATT_HREF, baseURL);
- head.insertBefore(base, head.getFirstChild());
- }
- }
-
-
- public static Element getBase(Document dom) {
- // there should only be one head and one base element dom.
- NodeList headList = dom.getElementsByTagName(TAG_HEAD);
- Element head = (Element) headList.item(0);
- NodeList baseList = head.getElementsByTagName(TAG_BASE);
- if (baseList.getLength() == 0)
- // no base defined, signal failure.
- return null;
-
- return (Element) baseList.item(baseList.getLength() - 1);
-
- }
-
-
- // <link rel="stylesheet" href="shared.css" type="text/css" />
- public static void insertStyle(Document dom, String cssUrl) {
- // there should only be one head and one base element dom.
- NodeList headList = dom.getElementsByTagName(TAG_HEAD);
- Element head = null;
- // Element base = getBase(dom);
- NodeList styleList = null;
- // there can be more than one style. DO not add style if it exists.
- if (headList.getLength() >= 1) {
- head = (Element) headList.item(0);
- styleList = head.getElementsByTagName(TAG_HEAD_LINK);
- for (int i = 0; i < styleList.getLength(); i++) {
- Element style = (Element) styleList.item(0);
- String styleString = style.getAttribute(ATT_HREF);
- if (styleString.equals(cssUrl))
- return;
- }
- }
-
- // insert the style, since it is not defined.
- Element styleToAdd = dom.createElement(TAG_HEAD_LINK);
- styleToAdd.setAttribute(ATT_HREF, cssUrl);
- styleToAdd.setAttribute(ATT_REL, "stylesheet"); //$NON-NLS-1$
- styleToAdd.setAttribute(ATT_TYPE, "text/css"); //$NON-NLS-1$
- if (styleList != null && styleList.getLength() >= 1)
- styleList.item(0).getParentNode().insertBefore(styleToAdd,
- styleList.item(0));
- else
- head.appendChild(styleToAdd);
-
- }
-
- /**
- * Returns a reference to the body of the DOM.
- *
- * @param dom
- * @return
- */
- public static Element getBodyElement(Document dom) {
- // there should only be one body element dom.
- NodeList bodyList = dom.getElementsByTagName(TAG_BODY);
- Element body = (Element) bodyList.item(0);
- return body;
- }
-
-
-
- public static Element createElement(Document dom, String elementName,
- Properties attributes) {
-
- // make sure to create element with any namespace uri to enable finding
- // it again using Dom.getElementsByTagNameNS()
- Element element = dom.createElementNS("", elementName); //$NON-NLS-1$
- if (attributes != null) {
- Enumeration e = attributes.keys();
- while (e.hasMoreElements()) {
- String key = (String) e.nextElement();
- element.setAttribute(key, attributes.getProperty(key));
- }
- }
- return element;
- }
-
- public static Element createAndAppendChild(Element parentElement,
- String elementName, Properties attributes) {
-
- Element element = createElement(parentElement.getOwnerDocument(),
- elementName, attributes);
- parentElement.appendChild(element);
- return element;
- }
-
-
-
- /**
- * Returns an Element array of all first level descendant Elements with a
- * given tag name, in the order in which they are encountered in the DOM.
- * Unlike the JAXP apis, which returns preorder traversal of this Element
- * tree, this method filters out children deeper than first level child
- * nodes.
- */
- public static Element[] getElementsByTagName(Element parent, String tagName) {
- NodeList allChildElements = parent.getElementsByTagName(tagName);
+ private static String TAG_BODY = "body"; //$NON-NLS-1$
+ private static String TAG_HEAD = "head"; //$NON-NLS-1$
+ private static String TAG_BASE = "base"; //$NON-NLS-1$
+ public static String TAG_DIV = "div"; //$NON-NLS-1$
+ public static String TAG_HEAD_LINK = "link"; //$NON-NLS-1$
+ private static String TAG_PARAM = "param"; //$NON-NLS-1$
+ private static String ATT_SRC = "src"; //$NON-NLS-1$
+ private static String ATT_HREF = "href"; //$NON-NLS-1$
+ private static String ATT_CITE = "cite"; //$NON-NLS-1$
+ private static String ATT_LONGDESC = "longdesc"; //$NON-NLS-1$
+ private static String ATT_DATA = "data"; //$NON-NLS-1$
+ private static String ATT_CODEBASE = "codebase"; //$NON-NLS-1$
+ private static String ATT_VALUE = "value"; //$NON-NLS-1$
+ private static String ATT_VALUE_TYPE = "valuetype"; //$NON-NLS-1$
+ private static String ATT_REL = "rel"; //$NON-NLS-1$
+ private static String ATT_TYPE = "type"; //$NON-NLS-1$
+
+
+
+ /*
+ * ********* Model util methods ************************************
+ */
+
+ /**
+ * Checks to see if the passed string is a valid URL (has a protocol), if
+ * yes, returns it as is. If no, treats it as a resource relative to the
+ * declaring plugin. Return the plugin relative location, fully qualified.
+ * Retruns null if the passed string itself is null.
+ *
+ * @param resource
+ * @param pluginDesc
+ * @return returns the URL as is if it had a protocol.
+ */
+ public static String resolveURL(String url, String pluginId) {
+ Bundle bundle = null;
+ if (pluginId != null)
+ // if pluginId is not null, use it.
+ bundle = Platform.getBundle(pluginId);
+ return resolveURL("", url, bundle); //$NON-NLS-1$
+ }
+
+
+
+ /**
+ * Checks to see if the passed string is a valid URL (has a protocol), if
+ * yes, returns it as is. If no, treats it as a resource relative to the
+ * declaring plugin. Return the plugin relative location, fully qualified.
+ * Retruns null if the passed string itself is null.
+ *
+ * @param resource
+ * @param pluginDesc
+ * @return returns the URL as is if it had a protocol.
+ */
+ public static String resolveURL(String url, IConfigurationElement element) {
+ Bundle bundle = BundleUtil.getBundleFromConfigurationElement(element);
+ return resolveURL("", url, bundle); //$NON-NLS-1$
+ }
+
+
+
+ /**
+ * @see resolveURL(String url, IConfigurationElement element)
+ */
+ public static String resolveURL(String base, String url, Bundle bundle) {
+ // quick exit
+ if (url == null)
+ return null;
+ IntroURLParser parser = new IntroURLParser(url);
+ if (parser.hasProtocol())
+ return url;
+ // make plugin relative url. Only now we need the bundle.
+ return BundleUtil.getResolvedResourceLocation(base, url, bundle);
+ }
+
+ /**
+ * Ensures that a file:// URL exists for the bundle root. This will
+ * cause jarred bundles to be extracted into a cache directory.
+ */
+ public static void ensureFileURLsExist(Bundle bundle, String contentFile) {
+ try {
+ FileLocator.toFileURL(bundle.getEntry("/")); //$NON-NLS-1$
+ } catch (Exception e) {
+ if (contentFile != null)
+ Log.error("Failed to extract Intro content folder for: " //$NON-NLS-1$
+ + contentFile, e);
+ }
+ }
+
+
+ /**
+ * Returns the path to the parent folder containing the passed content xml
+ * file. It is assumed that the path is a local url representing a content
+ * file.
+ */
+ public static String getParentFolderToString(String contentFilePath) {
+ IPath path = getParentFolderPath(contentFilePath);
+ return path.toString();
+ }
+
+
+ /*
+ *
+ * ******** XHTML DOM util methods *********************************
+ */
+
+ /**
+ * Returns the path to the parent folder containing the passed content xml
+ * file. It is assumed that the path is a local url representing a content
+ * file.
+ */
+ public static String getParentFolderOSString(String contentFilePath) {
+ IPath path = getParentFolderPath(contentFilePath);
+ return path.toOSString();
+ }
+
+ /**
+ * Returns the parent folder of the given path.
+ */
+ public static IPath getParentFolderPath(String contentFilePath) {
+ IPath path = new Path(contentFilePath);
+ path = path.removeLastSegments(1).addTrailingSeparator();
+ return path;
+ }
+
+
+
+
+ public static void insertBase(Document dom, String baseURL) {
+ // there should only be one head and one base element dom.
+ NodeList headList = dom.getElementsByTagName(TAG_HEAD);
+ Element head = (Element) headList.item(0);
+ NodeList baseList = head.getElementsByTagName(TAG_BASE);
+ if (baseList.getLength() == 0) {
+ // insert a base element, since one is not defined already.
+ Element base = dom.createElement(TAG_BASE);
+ base.setAttribute(ATT_HREF, baseURL);
+ head.insertBefore(base, head.getFirstChild());
+ }
+ }
+
+
+ public static Element getBase(Document dom) {
+ // there should only be one head and one base element dom.
+ NodeList headList = dom.getElementsByTagName(TAG_HEAD);
+ Element head = (Element) headList.item(0);
+ NodeList baseList = head.getElementsByTagName(TAG_BASE);
+ if (baseList.getLength() == 0)
+ // no base defined, signal failure.
+ return null;
+
+ return (Element) baseList.item(baseList.getLength() - 1);
+
+ }
+
+
+ // <link rel="stylesheet" href="shared.css" type="text/css" />
+ public static void insertStyle(Document dom, String cssUrl) {
+ // there should only be one head and one base element dom.
+ NodeList headList = dom.getElementsByTagName(TAG_HEAD);
+ Element head = null;
+ // Element base = getBase(dom);
+ NodeList styleList = null;
+ // there can be more than one style. DO not add style if it exists.
+ if (headList.getLength() >= 1) {
+ head = (Element) headList.item(0);
+ styleList = head.getElementsByTagName(TAG_HEAD_LINK);
+ for (int i = 0; i < styleList.getLength(); i++) {
+ Element style = (Element) styleList.item(0);
+ String styleString = style.getAttribute(ATT_HREF);
+ if (styleString.equals(cssUrl))
+ return;
+ }
+ }
+
+ // insert the style, since it is not defined.
+ Element styleToAdd = dom.createElement(TAG_HEAD_LINK);
+ styleToAdd.setAttribute(ATT_HREF, cssUrl);
+ styleToAdd.setAttribute(ATT_REL, "stylesheet"); //$NON-NLS-1$
+ styleToAdd.setAttribute(ATT_TYPE, "text/css"); //$NON-NLS-1$
+ if (styleList != null && styleList.getLength() >= 1)
+ styleList.item(0).getParentNode().insertBefore(styleToAdd,
+ styleList.item(0));
+ else
+ head.appendChild(styleToAdd);
+
+ }
+
+ /**
+ * Returns a reference to the body of the DOM.
+ *
+ * @param dom
+ * @return
+ */
+ public static Element getBodyElement(Document dom) {
+ // there should only be one body element dom.
+ NodeList bodyList = dom.getElementsByTagName(TAG_BODY);
+ Element body = (Element) bodyList.item(0);
+ return body;
+ }
+
+
+
+ public static Element createElement(Document dom, String elementName,
+ Properties attributes) {
+
+ // make sure to create element with any namespace uri to enable finding
+ // it again using Dom.getElementsByTagNameNS()
+ Element element = dom.createElementNS("", elementName); //$NON-NLS-1$
+ if (attributes != null) {
+ Enumeration e = attributes.keys();
+ while (e.hasMoreElements()) {
+ String key = (String) e.nextElement();
+ element.setAttribute(key, attributes.getProperty(key));
+ }
+ }
+ return element;
+ }
+
+ public static Element createAndAppendChild(Element parentElement,
+ String elementName, Properties attributes) {
+
+ Element element = createElement(parentElement.getOwnerDocument(),
+ elementName, attributes);
+ parentElement.appendChild(element);
+ return element;
+ }
+
+
+
+ /**
+ * Returns an Element array of all first level descendant Elements with a
+ * given tag name, in the order in which they are encountered in the DOM.
+ * Unlike the JAXP apis, which returns preorder traversal of this Element
+ * tree, this method filters out children deeper than first level child
+ * nodes.
+ */
+ public static Element[] getElementsByTagName(Element parent, String tagName) {
+ NodeList allChildElements = parent.getElementsByTagName(tagName);
Vector<Element> vector = new Vector<>();
- for (int i = 0; i < allChildElements.getLength(); i++) {
- // we know that the nodelist is of elements.
- Element aElement = (Element) allChildElements.item(i);
- if (aElement.getParentNode().equals(parent))
- // first level child element. add it.
- vector.add(aElement);
- }
- Element[] filteredElements = new Element[vector.size()];
- vector.copyInto(filteredElements);
- return filteredElements;
- }
-
- /**
- * Same as getElementsByTagName(Element parent, String tagName) but the
- * parent element is assumed to be the root of the document.
- *
- * @see getElementsByTagName(Element parent, String tagName)
- */
- public static Element[] getElementsByTagName(Document dom, String tagName) {
- NodeList allChildElements = dom.getElementsByTagName(tagName);
+ for (int i = 0; i < allChildElements.getLength(); i++) {
+ // we know that the nodelist is of elements.
+ Element aElement = (Element) allChildElements.item(i);
+ if (aElement.getParentNode().equals(parent))
+ // first level child element. add it.
+ vector.add(aElement);
+ }
+ Element[] filteredElements = new Element[vector.size()];
+ vector.copyInto(filteredElements);
+ return filteredElements;
+ }
+
+ /**
+ * Same as getElementsByTagName(Element parent, String tagName) but the
+ * parent element is assumed to be the root of the document.
+ *
+ * @see getElementsByTagName(Element parent, String tagName)
+ */
+ public static Element[] getElementsByTagName(Document dom, String tagName) {
+ NodeList allChildElements = dom.getElementsByTagName(tagName);
Vector<Element> vector = new Vector<>();
- for (int i = 0; i < allChildElements.getLength(); i++) {
- // we know that the nodelist is of elements.
- Element aElement = (Element) allChildElements.item(i);
- if (aElement.getParentNode().equals(dom.getDocumentElement()))
- // first level child element. add it. Cant use getParent
- // here.
- vector.add(aElement);
- }
- Element[] filteredElements = new Element[vector.size()];
- vector.copyInto(filteredElements);
- return filteredElements;
- }
-
-
- /*
- * Util method similar to DOM getElementById() method, but it works without
- * an id attribute being specified. Deep searches all children in this
- * container's DOM for the first child with the given id. The element
- * retrieved must have the passed local name. Note that in an XHTML file
- * (aka DOM) elements should have a unique id within the scope of a
- * document. We use local name because this allows for finding intro
- * anchors, includes and dynamic content element regardless of whether or
- * not an xmlns was used in the xml.
- */
- public static Element getElementById(Document dom, String id,
- String localElementName) {
-
- NodeList children = dom.getElementsByTagNameNS("*", localElementName); //$NON-NLS-1$
- for (int i = 0; i < children.getLength(); i++) {
- Element element = (Element) children.item(i);
- if (element.getAttribute("id").equals(id)) //$NON-NLS-1$
- return element;
- }
- // non found.
- return null;
-
- }
-
- public static Element getElementById(Document dom, String id) {
- return getElementById(dom, id, "*"); //$NON-NLS-1$
- }
-
- public static void updateResourceAttributes(Element element,
- AbstractIntroPage page) {
- updateResourceAttributes(element, page.getBase(), page.getBundle());
- }
-
-
- public static void updateResourceAttributes(Element element,
- IntroExtensionContent extensionContent) {
- updateResourceAttributes(element, extensionContent.getBase(),
- extensionContent.getBundle());
- }
-
- /**
- * Updates all the resource attributes of the passed element to point to a
- * local resolved url.
- *
- * @param element
- * @param extensionContent
- */
- private static void updateResourceAttributes(Element element, String base,
- Bundle bundle) {
- // doUpdateResourceAttributes(element, base, bundle);
- NodeList children = element.getElementsByTagName("*"); //$NON-NLS-1$
- for (int i = 0; i < children.getLength(); i++) {
- Element child = (Element) children.item(i);
- doUpdateResourceAttributes(child, base, bundle);
- }
- }
-
- private static void doUpdateResourceAttributes(Element element,
- String base, Bundle bundle) {
- qualifyAttribute(element, ATT_SRC, base, bundle);
- qualifyAttribute(element, ATT_HREF, base, bundle);
- qualifyAttribute(element, ATT_CITE, base, bundle);
- qualifyAttribute(element, ATT_LONGDESC, base, bundle);
- qualifyAttribute(element, ATT_CODEBASE, base, bundle);
- qualifyAttribute(element, ATT_DATA, base, bundle);
- qualifyValueAttribute(element, base, bundle);
- }
-
- private static void qualifyAttribute(Element element, String attributeName,
- String base, Bundle bundle) {
- if (element.hasAttribute(attributeName)) {
- String attributeValue = element.getAttribute(attributeName);
- if (new IntroURLParser(attributeValue).hasProtocol())
- return;
-
- // resolve the resource against the nl mechanism.
- String attributePath = BundleUtil.getResolvedResourceLocation(base,
- attributeValue, bundle);
- element.setAttribute(attributeName, attributePath);
- }
- }
-
- private static void qualifyValueAttribute(Element element, String base,
- Bundle bundle) {
- if (element.hasAttribute(ATT_VALUE)
- && element.hasAttribute(ATT_VALUE_TYPE)
- && element.getAttribute(ATT_VALUE_TYPE).equals("ref") //$NON-NLS-1$
- && element.getLocalName().equals(TAG_PARAM)) {
- String value = element.getAttribute(ATT_VALUE);
- if (new IntroURLParser(value).hasProtocol())
- return;
- // resolve the resource against the nl mechanism.
- String attributePath = BundleUtil.getResolvedResourceLocation(base,
- value, bundle);
- element.setAttribute(ATT_VALUE, attributePath);
- }
- }
-
-
- /**
- * Returns an array version of the passed NodeList. Used to work around DOM
- * design issues.
- */
- public static Node[] getArray(NodeList nodeList) {
- Node[] nodes = new Node[nodeList.getLength()];
- for (int i = 0; i < nodeList.getLength(); i++)
- nodes[i] = nodeList.item(i);
- return nodes;
- }
-
-
- /**
- * Remove all instances of the element from the DOM.
- *
- */
- public static void removeAllElements(Document dom, String elementLocalName) {
- // get all elements in DOM and remove them.
- NodeList elements = dom.getElementsByTagNameNS("*", //$NON-NLS-1$
- elementLocalName);
- // get the array version of the nodelist to work around DOM api design.
- Node[] elementsArray = ModelUtil.getArray(elements);
- for (int i = 0; i < elementsArray.length; i++) {
- Node element = elementsArray[i];
- element.getParentNode().removeChild(element);
- }
-
- }
+ for (int i = 0; i < allChildElements.getLength(); i++) {
+ // we know that the nodelist is of elements.
+ Element aElement = (Element) allChildElements.item(i);
+ if (aElement.getParentNode().equals(dom.getDocumentElement()))
+ // first level child element. add it. Cant use getParent
+ // here.
+ vector.add(aElement);
+ }
+ Element[] filteredElements = new Element[vector.size()];
+ vector.copyInto(filteredElements);
+ return filteredElements;
+ }
+
+
+ /*
+ * Util method similar to DOM getElementById() method, but it works without
+ * an id attribute being specified. Deep searches all children in this
+ * container's DOM for the first child with the given id. The element
+ * retrieved must have the passed local name. Note that in an XHTML file
+ * (aka DOM) elements should have a unique id within the scope of a
+ * document. We use local name because this allows for finding intro
+ * anchors, includes and dynamic content element regardless of whether or
+ * not an xmlns was used in the xml.
+ */
+ public static Element getElementById(Document dom, String id,
+ String localElementName) {
+
+ NodeList children = dom.getElementsByTagNameNS("*", localElementName); //$NON-NLS-1$
+ for (int i = 0; i < children.getLength(); i++) {
+ Element element = (Element) children.item(i);
+ if (element.getAttribute("id").equals(id)) //$NON-NLS-1$
+ return element;
+ }
+ // non found.
+ return null;
+
+ }
+
+ public static Element getElementById(Document dom, String id) {
+ return getElementById(dom, id, "*"); //$NON-NLS-1$
+ }
+
+ public static void updateResourceAttributes(Element element,
+ AbstractIntroPage page) {
+ updateResourceAttributes(element, page.getBase(), page.getBundle());
+ }
+
+
+ public static void updateResourceAttributes(Element element,
+ IntroExtensionContent extensionContent) {
+ updateResourceAttributes(element, extensionContent.getBase(),
+ extensionContent.getBundle());
+ }
+
+ /**
+ * Updates all the resource attributes of the passed element to point to a
+ * local resolved url.
+ *
+ * @param element
+ * @param extensionContent
+ */
+ private static void updateResourceAttributes(Element element, String base,
+ Bundle bundle) {
+ // doUpdateResourceAttributes(element, base, bundle);
+ NodeList children = element.getElementsByTagName("*"); //$NON-NLS-1$
+ for (int i = 0; i < children.getLength(); i++) {
+ Element child = (Element) children.item(i);
+ doUpdateResourceAttributes(child, base, bundle);
+ }
+ }
+
+ private static void doUpdateResourceAttributes(Element element,
+ String base, Bundle bundle) {
+ qualifyAttribute(element, ATT_SRC, base, bundle);
+ qualifyAttribute(element, ATT_HREF, base, bundle);
+ qualifyAttribute(element, ATT_CITE, base, bundle);
+ qualifyAttribute(element, ATT_LONGDESC, base, bundle);
+ qualifyAttribute(element, ATT_CODEBASE, base, bundle);
+ qualifyAttribute(element, ATT_DATA, base, bundle);
+ qualifyValueAttribute(element, base, bundle);
+ }
+
+ private static void qualifyAttribute(Element element, String attributeName,
+ String base, Bundle bundle) {
+ if (element.hasAttribute(attributeName)) {
+ String attributeValue = element.getAttribute(attributeName);
+ if (new IntroURLParser(attributeValue).hasProtocol())
+ return;
+
+ // resolve the resource against the nl mechanism.
+ String attributePath = BundleUtil.getResolvedResourceLocation(base,
+ attributeValue, bundle);
+ element.setAttribute(attributeName, attributePath);
+ }
+ }
+
+ private static void qualifyValueAttribute(Element element, String base,
+ Bundle bundle) {
+ if (element.hasAttribute(ATT_VALUE)
+ && element.hasAttribute(ATT_VALUE_TYPE)
+ && element.getAttribute(ATT_VALUE_TYPE).equals("ref") //$NON-NLS-1$
+ && element.getLocalName().equals(TAG_PARAM)) {
+ String value = element.getAttribute(ATT_VALUE);
+ if (new IntroURLParser(value).hasProtocol())
+ return;
+ // resolve the resource against the nl mechanism.
+ String attributePath = BundleUtil.getResolvedResourceLocation(base,
+ value, bundle);
+ element.setAttribute(ATT_VALUE, attributePath);
+ }
+ }
+
+
+ /**
+ * Returns an array version of the passed NodeList. Used to work around DOM
+ * design issues.
+ */
+ public static Node[] getArray(NodeList nodeList) {
+ Node[] nodes = new Node[nodeList.getLength()];
+ for (int i = 0; i < nodeList.getLength(); i++)
+ nodes[i] = nodeList.item(i);
+ return nodes;
+ }
+
+
+ /**
+ * Remove all instances of the element from the DOM.
+ *
+ */
+ public static void removeAllElements(Document dom, String elementLocalName) {
+ // get all elements in DOM and remove them.
+ NodeList elements = dom.getElementsByTagNameNS("*", //$NON-NLS-1$
+ elementLocalName);
+ // get the array version of the nodelist to work around DOM api design.
+ Node[] elementsArray = ModelUtil.getArray(elements);
+ for (int i = 0; i < elementsArray.length; i++) {
+ Node element = elementsArray[i];
+ element.getParentNode().removeChild(element);
+ }
+
+ }

Back to the top