jkesselm    01/11/15 12:49:31

  Modified:    java/src/org/apache/xml/dtm/ref DTMNodeProxy.java
  Log:
  Bugzilla4842: Expand the proxy layer to support more of the DOM API.
  
  Revision  Changes    Path
  1.10      +91 -53    xml-xalan/java/src/org/apache/xml/dtm/ref/DTMNodeProxy.java
  
  Index: DTMNodeProxy.java
  ===================================================================
  RCS file: /home/cvs/xml-xalan/java/src/org/apache/xml/dtm/ref/DTMNodeProxy.java,v
  retrieving revision 1.9
  retrieving revision 1.10
  diff -u -r1.9 -r1.10
  --- DTMNodeProxy.java 2001/10/11 15:58:18     1.9
  +++ DTMNodeProxy.java 2001/11/15 20:49:31     1.10
  @@ -75,7 +75,7 @@
    * @see org.w3c.dom
    */
   public class DTMNodeProxy
  -        implements Node, Document, Text, Element, Attr,
  +  implements Node, Document, Text, Element, Attr,
                      ProcessingInstruction, Comment, DocumentFragment
   {
   
  @@ -84,6 +84,9 @@
   
     /** The DTM node handle. */
     int node;
  +        
  +  /** The DOMImplementation object */
  +  static final DOMImplementation implementation=new DTMNodeProxyImplementation();
   
     /**
      * Create a DTMNodeProxy Node representing a specific Node in a DTM
  @@ -252,30 +255,42 @@
       return dtm.getNamespaceURI(node);
     }
   
  -  /**
  +  /** Ask whether we support a given DOM feature.
  +   * In fact, we do not _fully_ support any DOM feature -- we're a
  +   * read-only subset -- so arguably we should always return false.
  +   * Or we could say that we support DOM Core Level 2 but all nodes
  +   * are read-only. Unclear which answer is least misleading.
  +   * 
  +   * NON-DOM method. This was present in early drafts of DOM Level 2,
  +   * but was renamed isSupported. It's present here only because it's
  +   * cheap, harmless, and might help some poor fool who is still trying
  +   * to use an early Working Draft of the DOM.
      *
      * @param feature
      * @param version
      *
  -   * @return
  -   * @see org.w3c.dom.Node as of DOM Level 2
  +   * @return false
      */
     public final boolean supports(String feature, String version)
     {
  -    throw new DTMDOMException(DOMException.NOT_SUPPORTED_ERR);
  +    return implementation.hasFeature(feature,version);
  +    //throw new DTMDOMException(DOMException.NOT_SUPPORTED_ERR);
     }
   
  -  /**
  +  /** Ask whether we support a given DOM feature.
  +   * In fact, we do not _fully_ support any DOM feature -- we're a
  +   * read-only subset -- so arguably we should always return false.
      *
      * @param feature
      * @param version
      *
  -   * @return
  +   * @return false
      * @see org.w3c.dom.Node as of DOM Level 2
      */
     public final boolean isSupported(String feature, String version)
     {
  -    throw new DTMDOMException(DOMException.NOT_SUPPORTED_ERR);
  +    return implementation.hasFeature(feature,version);
  +    // throw new DTMDOMException(DOMException.NOT_SUPPORTED_ERR);
     }
   
     /**
  @@ -287,13 +302,6 @@
      */
     public final String getNodeValue() throws DOMException
     {
  -
  -//    // ***** ASSUMPTION: ATTRIBUTES HAVE SINGLE TEXT-NODE CHILD.
  -//    // (SIMILAR ASSUMPTION CURRENTLY MADE IN DTM; BE SURE TO
  -//    // REVISIT THIS IF THAT CHANGES!)
  -//    if (getNodeType() == Node.ATTRIBUTE_NODE)
  -//      return dtm.getNodeValue(node + 1);
  -
       return dtm.getNodeValue(node);
     }
   
  @@ -332,7 +340,7 @@
   
       int newnode = dtm.getParent(node);
   
  -    return (newnode == -1) ? null : dtm.getNode(newnode);
  +    return (newnode == DTM.NULL) ? null : dtm.getNode(newnode);
     }
   
     /**
  @@ -345,7 +353,7 @@
   
       int newnode = dtm.getParent(node);
   
  -    return (newnode == -1) ? null : dtm.getNode(newnode);
  +    return (newnode == DTM.NULL) ? null : dtm.getNode(newnode);
     }
   
     /**
  @@ -374,7 +382,7 @@
   
       int newnode = dtm.getFirstChild(node);
   
  -    return (newnode == -1) ? null : dtm.getNode(newnode);
  +    return (newnode == DTM.NULL) ? null : dtm.getNode(newnode);
     }
   
     /**
  @@ -387,7 +395,7 @@
   
       int newnode = dtm.getLastChild(node);
   
  -    return (newnode == -1) ? null : dtm.getNode(newnode);
  +    return (newnode == DTM.NULL) ? null : dtm.getNode(newnode);
     }
   
     /**
  @@ -400,7 +408,7 @@
   
       int newnode = dtm.getPreviousSibling(node);
   
  -    return (newnode == -1) ? null : dtm.getNode(newnode);
  +    return (newnode == DTM.NULL) ? null : dtm.getNode(newnode);
     }
   
     /**
  @@ -417,7 +425,7 @@
   
       int newnode = dtm.getNextSibling(node);
   
  -    return (newnode == -1) ? null : dtm.getNode(newnode);
  +    return (newnode == DTM.NULL) ? null : dtm.getNode(newnode);
     }
   
     // DTMNamedNodeMap m_attrs;
  @@ -443,10 +451,7 @@
      */
     public boolean hasAttribute(String name)
     {
  -
  -    throw new DTMDOMException(DOMException.NOT_SUPPORTED_ERR);
  -
  -    // return false;
  +    return DTM.NULL != dtm.getAttributeNode(node,null,name);
     }
   
     /**
  @@ -460,10 +465,7 @@
      */
     public boolean hasAttributeNS(String name, String x)
     {
  -
  -    throw new DTMDOMException(DOMException.NOT_SUPPORTED_ERR);
  -
  -    // return false;
  +    return DTM.NULL != dtm.getAttributeNode(node,x,name);
     }
   
     /**
  @@ -487,7 +489,7 @@
      * @see org.w3c.dom.Node -- DTMNodeProxy is read-only
      */
     public final Node insertBefore(Node newChild, Node refChild)
  -          throws DOMException
  +    throws DOMException
     {
       throw new DTMDOMException(DOMException.NO_MODIFICATION_ALLOWED_ERR);
     }
  @@ -503,7 +505,7 @@
      * @see org.w3c.dom.Node -- DTMNodeProxy is read-only
      */
     public final Node replaceChild(Node newChild, Node oldChild)
  -          throws DOMException
  +    throws DOMException
     {
       throw new DTMDOMException(DOMException.NO_MODIFICATION_ALLOWED_ERR);
     }
  @@ -543,7 +545,7 @@
      */
     public final boolean hasChildNodes()
     {
  -    return (-1 != dtm.getFirstChild(node));
  +    return (DTM.NULL != dtm.getFirstChild(node));
     }
   
     /**
  @@ -575,7 +577,7 @@
      */
     public final DOMImplementation getImplementation()
     {
  -    throw new DTMDOMException(DOMException.NOT_SUPPORTED_ERR);
  +    return implementation;
     }
   
     /**
  @@ -646,7 +648,7 @@
      * @see org.w3c.dom.Document
      */
     public final CDATASection createCDATASection(String data)
  -          throws DOMException
  +    throws DOMException
     {
       throw new DTMDOMException(DOMException.NOT_SUPPORTED_ERR);
     }
  @@ -662,7 +664,7 @@
      * @see org.w3c.dom.Document
      */
     public final ProcessingInstruction createProcessingInstruction(
  -          String target, String data) throws DOMException
  +                                                                 String target, 
String data) throws DOMException
     {
       throw new DTMDOMException(DOMException.NOT_SUPPORTED_ERR);
     }
  @@ -691,7 +693,7 @@
      * @see org.w3c.dom.Document
      */
     public final EntityReference createEntityReference(String name)
  -          throws DOMException
  +    throws DOMException
     {
       throw new DTMDOMException(DOMException.NOT_SUPPORTED_ERR);
     }
  @@ -719,7 +721,7 @@
      * @see org.w3c.dom.Document as of DOM Level 2 -- DTMNodeProxy is read-only
      */
     public final Node importNode(Node importedNode, boolean deep)
  -          throws DOMException
  +    throws DOMException
     {
       throw new DTMDOMException(DOMException.NO_MODIFICATION_ALLOWED_ERR);
     }
  @@ -735,7 +737,7 @@
      * @see org.w3c.dom.Document as of DOM Level 2
      */
     public final Element createElementNS(
  -          String namespaceURI, String qualifiedName) throws DOMException
  +                                       String namespaceURI, String qualifiedName) 
throws DOMException
     {
       throw new DTMDOMException(DOMException.NOT_SUPPORTED_ERR);
     }
  @@ -751,7 +753,7 @@
      * @see org.w3c.dom.Document as of DOM Level 2
      */
     public final Attr createAttributeNS(
  -          String namespaceURI, String qualifiedName) throws DOMException
  +                                      String namespaceURI, String qualifiedName) 
throws DOMException
     {
       throw new DTMDOMException(DOMException.NOT_SUPPORTED_ERR);
     }
  @@ -765,7 +767,7 @@
      * @see org.w3c.dom.Document as of DOM Level 2
      */
     public final NodeList getElementsByTagNameNS(String namespaceURI,
  -          String localName)
  +                                               String localName)
     {
       throw new DTMDOMException(DOMException.NOT_SUPPORTED_ERR);
     }
  @@ -827,8 +829,7 @@
      */
     public final int getLength()
     {
  -
  -    // %%FIX: This should do something smarter?
  +    // %OPT% This should do something smarter?
       return dtm.getNodeValue(node).length();
     }
   
  @@ -844,7 +845,7 @@
      */
     public final String substringData(int offset, int count) throws DOMException
     {
  -    throw new DTMDOMException(DOMException.NOT_SUPPORTED_ERR);
  +    return getData().substring(offset,offset+count);
     }
   
     /**
  @@ -895,7 +896,7 @@
      * @see org.w3c.dom.CharacterData
      */
     public final void replaceData(int offset, int count, String arg)
  -          throws DOMException
  +    throws DOMException
     {
       throw new DTMDOMException(DOMException.NOT_SUPPORTED_ERR);
     }
  @@ -934,7 +935,7 @@
      * @see org.w3c.dom.Element
      */
     public final void setAttribute(String name, String value)
  -          throws DOMException
  +    throws DOMException
     {
       throw new DTMDOMException(DOMException.NOT_SUPPORTED_ERR);
     }
  @@ -1000,7 +1001,7 @@
      */
     public boolean hasAttributes()
     {
  -    throw new DTMDOMException(DOMException.NOT_SUPPORTED_ERR);
  +    return DTM.NULL != dtm.getFirstAttribute(node);
     }
   
     /** @see org.w3c.dom.Element */
  @@ -1019,7 +1020,9 @@
      */
     public final String getAttributeNS(String namespaceURI, String localName)
     {
  -    throw new DTMDOMException(DOMException.NOT_SUPPORTED_ERR);
  +    DTMNamedNodeMap  map = new DTMNamedNodeMap(dtm, node);
  +    Node node = map.getNamedItemNS(namespaceURI,localName);
  +    return (null == node) ? null : node.getNodeValue();
     }
   
     /**
  @@ -1032,8 +1035,8 @@
      * @see org.w3c.dom.Element
      */
     public final void setAttributeNS(
  -          String namespaceURI, String qualifiedName, String value)
  -            throws DOMException
  +                                   String namespaceURI, String qualifiedName, 
String value)
  +    throws DOMException
     {
       throw new DTMDOMException(DOMException.NOT_SUPPORTED_ERR);
     }
  @@ -1047,7 +1050,7 @@
      * @see org.w3c.dom.Element
      */
     public final void removeAttributeNS(String namespaceURI, String localName)
  -          throws DOMException
  +    throws DOMException
     {
       throw new DTMDOMException(DOMException.NOT_SUPPORTED_ERR);
     }
  @@ -1096,8 +1099,10 @@
      */
     public final boolean getSpecified()
     {
  -
  -    // %%FIX
  +    // We really don't know which attributes might have come from the
  +    // source document versus from the DTD. Treat them all as having
  +    // been provided by the user.
  +    // %REVIEW% if/when we become aware of DTDs/schemae.
       return true;
     }
   
  @@ -1134,7 +1139,7 @@
       // In XPath and DTM data models, unlike DOM, an Attr's parent is its
       // owner element.
       int newnode = dtm.getParent(node);
  -    return (newnode == -1) ? null : (Element)(dtm.getNode(newnode));
  +    return (newnode == DTM.NULL) ? null : (Element)(dtm.getNode(newnode));
     }
   
     /**
  @@ -1291,5 +1296,38 @@
     public void setVersion(String version)
     {
       throw new DTMDOMException(DOMException.NOT_SUPPORTED_ERR);
  +  }
  +        
  +        
  +  /** Inner class to support getDOMImplementation.
  +   */
  +  static class DTMNodeProxyImplementation implements DOMImplementation
  +  {
  +    public DocumentType createDocumentType(String qualifiedName,String publicId, 
String systemId)
  +    {
  +      throw new DTMDOMException(DOMException.NOT_SUPPORTED_ERR);
  +    }
  +    public Document createDocument(String namespaceURI,String 
qualfiedName,DocumentType doctype)                        
  +    {
  +      // Could create a DTM... but why, when it'd have to be permanantly empty?
  +      throw new DTMDOMException(DOMException.NOT_SUPPORTED_ERR);        
  +    }
  +    /** Ask whether we support a given DOM feature.
  +     * 
  +     * In fact, we do not _fully_ support any DOM feature -- we're a
  +     * read-only subset -- so arguably we should always return false.
  +     * On the other hand, it may be more practically useful to return
  +     * true and simply treat the whole DOM as read-only, failing on the
  +     * methods we can't support. I'm not sure which would be more useful
  +     * to the caller.
  +     */
  +    public boolean hasFeature(String feature,String version)
  +    {
  +      if( ("core".equals(feature) || "xml".equals(feature)) && 
  +          ("1.0".equals(version) || "2.0".equals(version))
  +          )
  +        return true;
  +      return false;
  +    }
     }
   }
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to