You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@xerces.apache.org by nd...@apache.org on 2004/06/18 23:36:17 UTC

cvs commit: xml-xerces/java/src/org/apache/xerces/dom CoreDocumentImpl.java CoreDOMImplementationImpl.java

nddelima    2004/06/18 14:36:17

  Modified:    java/src/org/apache/xerces/dom CoreDocumentImpl.java
                        CoreDOMImplementationImpl.java
  Log:
  Fixes problems with DOMImplementation.getFeature and hasFeature, Node.getFeature and isSupported and support for Xalan's DOM XPath implementation.
  
  Revision  Changes    Path
  1.73      +37 -27    xml-xerces/java/src/org/apache/xerces/dom/CoreDocumentImpl.java
  
  Index: CoreDocumentImpl.java
  ===================================================================
  RCS file: /home/cvs/xml-xerces/java/src/org/apache/xerces/dom/CoreDocumentImpl.java,v
  retrieving revision 1.72
  retrieving revision 1.73
  diff -u -r1.72 -r1.73
  --- CoreDocumentImpl.java	15 Jun 2004 22:13:16 -0000	1.72
  +++ CoreDocumentImpl.java	18 Jun 2004 21:36:16 -0000	1.73
  @@ -17,6 +17,7 @@
   package org.apache.xerces.dom;
   
   import java.io.Serializable;
  +import java.lang.reflect.Constructor;
   import java.util.Enumeration;
   import java.util.Hashtable;
   
  @@ -130,9 +131,6 @@
       transient DOMNormalizer domNormalizer = null;
       transient DOMConfigurationImpl fConfiguration= null;
   
  -    // support of XPath API
  -    transient Object fXPathEvaluator = null;
  -
       /** Table for quick check of child insertion. */
       private final static int[] kidOK;
   
  @@ -482,20 +480,32 @@
           
           boolean anyVersion = version == null || version.length() == 0;
           
  -        if ((feature.equalsIgnoreCase("XPath")
  -            || feature.equalsIgnoreCase("+XPath")) && 
  -            (anyVersion || version.equals("3.0"))) {
  -
  +        // if a plus sign "+" is prepended to any feature name, implementations
  +        // are considered in which the specified feature may not be directly
  +        // castable DOMImplementation.getFeature(feature, version). Without a
  +        // plus, only features whose interfaces are directly castable are
  +        // considered.
  +        if ((feature.equalsIgnoreCase("+XPath"))
  +            && (anyVersion || version.equals("3.0"))) {
  +            
               try {
                   Class xpathClass = ObjectFactory.findProviderClass(
  -                "org.apache.xpath.domapi.XPathEvaluatorImpl",
  -                ObjectFactory.findClassLoader(), true);
  -                fXPathEvaluator = xpathClass.newInstance();
  -                java.lang.reflect.Method setDocument = xpathClass.getMethod("setDoc", new Class[]{Document.class});
  -                setDocument.invoke(fXPathEvaluator, new Object[]{this});
  -                return fXPathEvaluator;
  -            }
  -            catch (Exception e){
  +                    "org.apache.xpath.domapi.XPathEvaluatorImpl",
  +                    ObjectFactory.findClassLoader(), true);
  +                Constructor xpathClassConstr = 
  +                    xpathClass.getConstructor(new Class[] { Document.class });
  +                
  +                // Check if the DOM XPath implementation implements
  +                // the interface org.w3c.dom.XPathEvaluator
  +                Class interfaces[] = xpathClass.getInterfaces();
  +                for (int i = 0; i < interfaces.length; i++) {
  +                    if (interfaces[i].getName().equals(
  +                    "org.w3c.dom.xpath.XPathEvaluator")) {
  +                        return xpathClassConstr.newInstance(new Object[] { this });
  +                    }
  +                }
  +                return null;
  +            } catch (Exception e) {
                   return null;
               }
           }
  @@ -505,22 +515,22 @@
       //
       // Document methods
       //
  -
  +    
       // factory methods
  -
  +    
       /**
        * Factory method; creates an Attribute having this Document as its
        * OwnerDoc.
  -     *
  -     * @param name The name of the attribute. Note that the attribute's value
  -     * is _not_ established at the factory; remember to set it!
  -     *
  -     * @throws DOMException(INVALID_NAME_ERR) if the attribute name is not
  -     * acceptable.
  +     * 
  +     * @param name The name of the attribute. Note that the attribute's value is
  +     * _not_ established at the factory; remember to set it!
  +     * 
  +     * @throws DOMException(INVALID_NAME_ERR)
  +     * if the attribute name is not acceptable.
        */
       public Attr createAttribute(String name)
  -    throws DOMException {
  -
  +        throws DOMException {
  +        
           if (errorChecking && !isXMLName(name,xml11Version)) {
               String msg =
                   DOMMessageFormatter.formatMessage(
  @@ -530,7 +540,7 @@
               throw new DOMException(DOMException.INVALID_CHARACTER_ERR, msg);
           }
           return new AttrImpl(this, name);
  -
  +        
       } // createAttribute(String):Attr
   
       /**
  
  
  
  1.32      +79 -47    xml-xerces/java/src/org/apache/xerces/dom/CoreDOMImplementationImpl.java
  
  Index: CoreDOMImplementationImpl.java
  ===================================================================
  RCS file: /home/cvs/xml-xerces/java/src/org/apache/xerces/dom/CoreDOMImplementationImpl.java,v
  retrieving revision 1.31
  retrieving revision 1.32
  diff -u -r1.31 -r1.32
  --- CoreDOMImplementationImpl.java	24 Feb 2004 23:23:18 -0000	1.31
  +++ CoreDOMImplementationImpl.java	18 Jun 2004 21:36:16 -0000	1.32
  @@ -14,6 +14,7 @@
    * limitations under the License.
    */
   package org.apache.xerces.dom;
  +
   import org.apache.xerces.impl.RevalidationHandler;
   import org.apache.xerces.parsers.DOMParserImpl;
   import org.apache.xerces.util.XMLChar;
  @@ -59,7 +60,7 @@
       // doctypes without owners, on an demand basis.   Used for
       // compareDocumentPosition
       private int docAndDoctypeCounter = 0;
  -
  +    
   	// static
   	/** Dom implementation singleton. */
   	static CoreDOMImplementationImpl singleton =
  @@ -78,53 +79,65 @@
   	 * Test if the DOM implementation supports a specific "feature" --
   	 * currently meaning language and level thereof.
   	 *
  -	 * @param feature      The package name of the feature to test.
  +	 * @param feature The package name of the feature to test.
   	 * In Level 1, supported values are "HTML" and "XML" (case-insensitive).
   	 * At this writing, org.apache.xerces.dom supports only XML.
   	 *
  -	 * @param version      The version number of the feature being tested.
  +	 * @param version The version number of the feature being tested.
   	 * This is interpreted as "Version of the DOM API supported for the
   	 * specified Feature", and in Level 1 should be "1.0"
   	 *
  -	 * @return    true iff this implementation is compatable with the specified
  +	 * @return true iff this implementation is compatable with the specified
   	 * feature and version.
   	 */
  -    public boolean hasFeature(String feature, String version) {
  -
  -        boolean anyVersion = version == null || version.length() == 0;
  -		if (feature.startsWith("+")) {
  -			feature = feature.substring(1);
  -		}
  -        // check if Xalan implementation is around and if yes report true for supporting
  -        // XPath API
  -        if ((feature.equalsIgnoreCase("XPath")
  -            || feature.equalsIgnoreCase("+XPath"))
  -            && (anyVersion || version.equals("3.0"))) {
  -            try {
  -                Class xpathClass =
  -                    ObjectFactory.findProviderClass(
  -                        "org.apache.xpath.domapi.XPathEvaluatorImpl",
  -                        ObjectFactory.findClassLoader(),
  -                        true);
  -            } catch (Exception e) {
  -                return false;
  -            }
  -            return true;
  -        }
  -        return (
  -            feature.equalsIgnoreCase("Core")
  -                && (anyVersion
  -                    || version.equals("1.0")
  -                    || version.equals("2.0")
  -                    || version.equals("3.0")))
  -            || (feature.equalsIgnoreCase("XML")
  -                && (anyVersion
  -                    || version.equals("1.0")
  -                    || version.equals("2.0")
  -                    || version.equals("3.0")))
  -            || (feature.equalsIgnoreCase("LS")
  -                && (anyVersion || version.equals("3.0")));
  -    } // hasFeature(String,String):boolean
  +	public boolean hasFeature(String feature, String version) {
  +	    
  +	    boolean anyVersion = version == null || version.length() == 0;
  +	    
  +	    // check if Xalan implementation is around and if yes report true for supporting
  +	    // XPath API
  +	    // if a plus sign "+" is prepended to any feature name, implementations 
  +	    // are considered in which the specified feature may not be directly 
  +	    // castable DOMImplementation.getFeature(feature, version). Without a 
  +	    // plus, only features whose interfaces are directly castable are considered.
  +	    if ((feature.equalsIgnoreCase("+XPath"))       
  +	        && (anyVersion || version.equals("3.0"))) {
  +	        try {
  +	            Class xpathClass = ObjectFactory.findProviderClass(
  +	                "org.apache.xpath.domapi.XPathEvaluatorImpl",
  +	                ObjectFactory.findClassLoader(), true);
  +                
  +                // Check if the DOM XPath implementation implements
  +                // the interface org.w3c.dom.XPathEvaluator
  +                Class interfaces[] = xpathClass.getInterfaces();
  +                for (int i = 0; i < interfaces.length; i++) {
  +                    if (interfaces[i].getName().equals(
  +                        "org.w3c.dom.xpath.XPathEvaluator")) {
  +                        return true;
  +                    }
  +                }
  +	        } catch (Exception e) {
  +	            return false;
  +	        }
  +	        return true;
  +	    }
  +	    if (feature.startsWith("+")) {
  +	        feature = feature.substring(1);
  +	    }
  +	    return (
  +	        feature.equalsIgnoreCase("Core")
  +	            && (anyVersion
  +	                || version.equals("1.0")
  +	                || version.equals("2.0")
  +	                || version.equals("3.0")))
  +	                || (feature.equalsIgnoreCase("XML")
  +	            && (anyVersion
  +	                || version.equals("1.0")
  +	                || version.equals("2.0")
  +	                || version.equals("3.0")))
  +	                || (feature.equalsIgnoreCase("LS")
  +	            && (anyVersion || version.equals("3.0")));
  +	} // hasFeature(String,String):boolean
   
   
   	/**
  @@ -252,13 +265,32 @@
   
   	/**
   	 * DOM Level 3 WD - Experimental.
  -     */
  +	 */
   	public Object getFeature(String feature, String version) {
  -		if (singleton.hasFeature(feature, version)){
  -			return singleton;
  -		}
  -		return null;
  -
  +	    if (singleton.hasFeature(feature, version)) {
  +	        if ((feature.equalsIgnoreCase("+XPath"))) {
  +	            try {
  +	                Class xpathClass = ObjectFactory.findProviderClass(
  +	                    "org.apache.xpath.domapi.XPathEvaluatorImpl",
  +	                    ObjectFactory.findClassLoader(), true);
  +	                
  +	                // Check if the DOM XPath implementation implements
  +	                // the interface org.w3c.dom.XPathEvaluator
  +	                Class interfaces[] = xpathClass.getInterfaces();
  +	                for (int i = 0; i < interfaces.length; i++) {
  +	                    if (interfaces[i].getName().equals(
  +	                        "org.w3c.dom.xpath.XPathEvaluator")) {
  +	                        return xpathClass.newInstance();
  +	                    }
  +	                }
  +	            } catch (Exception e) {
  +	                return null;
  +	            }
  +	        } else {
  +	            return singleton;
  +	        }
  +	    }
  +	    return null;
   	}
   
   	// DOM L3 LS
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: xerces-cvs-unsubscribe@xml.apache.org
For additional commands, e-mail: xerces-cvs-help@xml.apache.org