Package org.eclipse.wst.xml.core.internal.contentmodel.util

Source Code of org.eclipse.wst.xml.core.internal.contentmodel.util.DOMNamespaceHelper

/*******************************************************************************
* Copyright (c) 2002, 2006 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
*     Jens Lukowski/Innoopract - initial renaming/restructuring
*    
*******************************************************************************/
package org.eclipse.wst.xml.core.internal.contentmodel.util;

import org.eclipse.wst.xml.core.internal.contentmodel.CMDocument;
import org.eclipse.wst.xml.core.internal.contentmodel.CMNode;
import org.w3c.dom.Attr;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;


public class DOMNamespaceHelper
{               
  protected static String getURIForPrefix(Element element, String prefix)
  {             
    String result = null;
    String nsAttrName = null;
    if (prefix != null && prefix.length() > 0)
    {
      nsAttrName = "xmlns:" + prefix; //$NON-NLS-1$
    }
    else
    {
      nsAttrName = "xmlns"; //$NON-NLS-1$
    }
           
    // assume the node is qualified... look up the URI base on the prefix
    //
    for (Node node = element; node != null; node = node.getParentNode())
    {
       if (node.getNodeType() == Node.ELEMENT_NODE)
      {
        Element theElement = (Element)node;
        Attr attr = theElement.getAttributeNode(nsAttrName);
        if (attr != null)
        {
          result = attr.getValue();
        }
      }
      else
      {
        break;
      }
    }
        
    // see if we can find some info from an 'implicit' namespace
    //
    if (result == null)
    {                               
      NamespaceTable table = new NamespaceTable(element.getOwnerDocument());
      result = table.getURIForPrefix(prefix);
    }
    return result;
  }

  public static String getNamespaceURI(Node node)
  {           
    String result = null;
    if (node.getNodeType() == Node.ELEMENT_NODE)
    {              
      Element element = (Element)node;
      String prefix = element.getPrefix();
      result = getURIForPrefix(element, prefix);
    }
    else if (node.getNodeType() == Node.ATTRIBUTE_NODE)
    {     
      Attr attr = (Attr)node;
      String prefix = attr.getPrefix();
      result = getURIForPrefix(attr.getOwnerElement(), prefix);
    }
    return result;
  }                

  // todo... this is an ugly hack... needs to be fixed
  //
  public static String computePrefix(CMNode cmNode, Node parentNode)
  {
    String result = null;
    for (Node node = parentNode; node != null; node = node.getParentNode())
    {
      if (node.getNodeType() == Node.ELEMENT_NODE)
      {
        result = getPrefix(node.getNodeName());
        if (result != null)
        {
          break;
        }
      }
    }
    return result;
  }       


  public static String getPrefix(String name)
  {
    String prefix = null;
    int index = name.indexOf(":"); //$NON-NLS-1$
    if (index != -1)
    {
      prefix = name.substring(0, index);
    }
    return prefix;
  }


  public static String getUnprefixedName(String name)
  {
    int index = name.indexOf(":"); //$NON-NLS-1$
    if (index != -1)
    {
      name = name.substring(index + 1);
    }
    return name;
  }


  public static String computeName(CMNode cmNode, Node parent, String prefix)
  {    
    return computeName(cmNode, parent, prefix, null);
  }  


  public static String computeName(CMNode cmNode, Node parent, String prefix, NamespaceTable namespaceTable)
  {
    String result = cmNode.getNodeName();

    // if the cmNode has a hard coded prefix then we don't need to do anything
    //
    if (getPrefix(result) == null)
    {             
      String qualification = (String)cmNode.getProperty("http://org.eclipse.wst/cm/properties/nsPrefixQualification"); //$NON-NLS-1$
      // see if we need a namespace prefix
      //
      if (qualification != null && qualification.equals("qualified")) //$NON-NLS-1$
      {           
        if (prefix == null)                
        {
          // todo... add getCMDocument() method to CMNode
          // for now use this getProperty() hack
          CMDocument cmDocument = (CMDocument)cmNode.getProperty("CMDocument"); //$NON-NLS-1$
          if (cmDocument != null)         
          {    
            String namespaceURI = (String)cmDocument.getProperty("http://org.eclipse.wst/cm/properties/targetNamespaceURI");    //$NON-NLS-1$
            if (namespaceURI != null)
            {  
              // use the NamespaceTable to figure out the correct prefix for this namespace uri
              //     
              if (namespaceTable == null)
              {                                           
                Document document = parent.getNodeType() == Node.DOCUMENT_NODE ? (Document)parent : parent.getOwnerDocument();
                namespaceTable = new NamespaceTable(document);
                if (parent instanceof Element)
                {
                  namespaceTable.addElementLineage((Element)parent);
                }
              }
              prefix = namespaceTable.getPrefixForURI(namespaceURI);
            }
          }
        }
        if (prefix != null && prefix.length() > 0)
        {
          result = prefix + ":" + result; //$NON-NLS-1$
        }
      }   
    }
    return result;
 
 

  public static String[] getURIQualifiedNameComponents(String uriQualifiedName)
  {
    String[] result = new String[2];
    int firstIndex = uriQualifiedName.indexOf("["); //$NON-NLS-1$
    int lastIndex = uriQualifiedName.indexOf("]"); //$NON-NLS-1$
    if (firstIndex != -1 && lastIndex > firstIndex)
    {
      result[0] = uriQualifiedName.substring(firstIndex + 1, lastIndex);
      result[1] = uriQualifiedName.substring(lastIndex + 1);
   
    else
    {
      result[1] = uriQualifiedName;
    }                             
    return result;
  }  
}
TOP

Related Classes of org.eclipse.wst.xml.core.internal.contentmodel.util.DOMNamespaceHelper

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.