stevel      2005/02/25 03:32:35

  Modified:    src/main/org/apache/tools/ant/types defaults.properties
               docs/manual/CoreTasks conditions.html
  Added:       src/etc/testcases/taskdefs/conditions parsersupports.xml
               src/main/org/apache/tools/ant/taskdefs/condition
                        ParserSupports.java
               src/testcases/org/apache/tools/ant/taskdefs/condition
                        ParserSupportsTest.java
  Log:
  condition to check for parser features. Left to others to put into Ant's 
build.xml.
  
  Revision  Changes    Path
  1.1                  
ant/src/etc/testcases/taskdefs/conditions/parsersupports.xml
  
  Index: parsersupports.xml
  ===================================================================
  <project name="parsersupports" >
  <!--
   * Copyright  2005 The Apache Software Foundation
   *
   *  Licensed under the Apache License, Version 2.0 (the "License");
   *  you may not use this file except in compliance with the License.
   *  You may obtain a copy of the License at
   *
   *      http://www.apache.org/licenses/LICENSE-2.0
   *
   *  Unless required by applicable law or agreed to in writing, software
   *  distributed under the License is distributed on an "AS IS" BASIS,
   *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   *  See the License for the specific language governing permissions and
   *  limitations under the License.
   *
  -->
  
    <target name="testEmpty">
      <condition property="empty">
        <parsersupports />
      </condition>
      <fail>Expected failure before here</fail>
    </target>
  
    <target name="testBoth">
      <condition property="both">
        <parsersupports property="http://bar"; feature="http://foo"/>
      </condition>
      <fail>Expected failure before here</fail>
    </target>
  
    <target name="testNamespaces">
      <fail>
      <condition >
        <not>
          <parsersupports feature="http://xml.org/sax/features/namespaces"/>
        </not>
      </condition>
        Expected namespace support
      </fail>
    </target>
  
    <target name="testPropertyInvalid">
      <fail>
        <condition>
          <not>
            <parsersupports
              property="http://xml.org/sax/properties/declaration-handler";
              value="undefined"/>
          </not>
        </condition>
        Expected DTD declaration property settable.
      </fail>
    </target>
  
    <target name="testPropertyNoValue">
      <fail>
        <condition>
          <not>
            <parsersupports
              property="http://xml.org/sax/properties/declaration-handler";
                />
          </not>
        </condition>
        Expected no property
      </fail>
    </target>
    
    <target name="testUnknownProperty">
      <fail>
        <condition>
            <parsersupports property="http://org.apache.ant/something";
                value="undefined"/>
        </condition>
        Expected unsupported property.
      </fail>
    </target>
    
    <target name="testXercesProperty">
      <fail>
        <condition>
          <not>
            <parsersupports
            
property="http://apache.org/xml/properties/schema/external-noNamespaceSchemaLocation";
              value="parsersupports.xml"/>
          </not>
        </condition>
        Expected XSD support on Xerces.
      </fail>
    </target>
    
  </project>
  
  
  1.1                  
ant/src/main/org/apache/tools/ant/taskdefs/condition/ParserSupports.java
  
  Index: ParserSupports.java
  ===================================================================
  /*
   * Copyright  2005 The Apache Software Foundation
   *
   *  Licensed under the Apache License, Version 2.0 (the "License");
   *  you may not use this file except in compliance with the License.
   *  You may obtain a copy of the License at
   *
   *      http://www.apache.org/licenses/LICENSE-2.0
   *
   *  Unless required by applicable law or agreed to in writing, software
   *  distributed under the License is distributed on an "AS IS" BASIS,
   *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   *  See the License for the specific language governing permissions and
   *  limitations under the License.
   *
   */
  package org.apache.tools.ant.taskdefs.condition;
  
  import org.apache.tools.ant.ProjectComponent;
  import org.apache.tools.ant.BuildException;
  import org.apache.tools.ant.Project;
  import org.apache.tools.ant.util.JAXPUtils;
  import org.xml.sax.XMLReader;
  import org.xml.sax.SAXNotRecognizedException;
  import org.xml.sax.SAXNotSupportedException;
  
  /**
   * test for the XML parser supporting a particular feature
   * @since Ant 1.7
   */
  public class ParserSupports extends ProjectComponent implements Condition {
  
      private String feature;
      private String property;
      private String value;
      public static final String ERROR_BOTH_ATTRIBUTES =
              "Property and feature attributes are exclusive";
      public static final String FEATURE="feature";
      public static final String PROPERTY = "property";
  
      public static final String NOT_RECOGNIZED =
              " not recognized: ";
      private static final String NOT_SUPPORTED =
              " not supported: ";
      public static final String ERROR_NO_ATTRIBUTES = "Neither feature or 
property are set";
      public static final String ERROR_NO_VALUE = "A value is needed when 
testing for property support";
  
      /**
       * Feature to probe for.
       *
       * @param feature
       */
      public void setFeature(String feature) {
          this.feature = feature;
      }
  
      /**
       * Property to probe for
       * @param property
       */
      public void setProperty(String property) {
          this.property = property;
      }
  
      /**
       * Optional value to set.
       * Converted to a boolean value when setting a property
       * @param value
       */
      public void setValue(String value) {
          this.value = value;
      }
  
  
  
      /**
       * validate the args, then try to set the feature or property
       * @return
       * @throws BuildException
       */
      public boolean eval() throws BuildException {
          if(feature!=null && property!=null) {
              throw new BuildException(ERROR_BOTH_ATTRIBUTES);
          }
          if(feature==null && property==null) {
              throw new BuildException(ERROR_NO_ATTRIBUTES);
          }
          //pick a value that is good for everything
          if(feature!=null) {
              return evalFeature();
          } else {
              if(value==null) {
                  throw new BuildException(ERROR_NO_VALUE);
              }
              return evalProperty();
          }
      }
  
      /**
       * get our reader
       * @return a reader
       */
      private XMLReader getReader() {
          JAXPUtils.getParser();
          return JAXPUtils.getXMLReader();
      }
  
      /**
       * set a feature
       * @return true if the feature could be set
       */
      public boolean evalFeature() {
          XMLReader reader = getReader();
          if (value == null) {
              value = "true";
          }
          boolean v= Project.toBoolean(value);
          try {
              reader.setFeature(feature,v);
          } catch (SAXNotRecognizedException e) {
              log(FEATURE+NOT_RECOGNIZED+feature,Project.MSG_VERBOSE);
              return false;
          } catch (SAXNotSupportedException e) {
              log(FEATURE+NOT_SUPPORTED + feature, Project.MSG_VERBOSE);
              return false;
          }
          return true;
      }
  
      /**
       * set a feature
       *
       * @return true if the feature could be set
       */
      public boolean evalProperty() {
          XMLReader reader = getReader();
          try {
              reader.setProperty(property, value);
          } catch (SAXNotRecognizedException e) {
              log(PROPERTY + NOT_RECOGNIZED + property, Project.MSG_VERBOSE);
              return false;
          } catch (SAXNotSupportedException e) {
              log(PROPERTY + NOT_SUPPORTED + property, Project.MSG_VERBOSE);
              return false;
          }
          return true;
      }
  
  
  }
  
  
  
  1.1                  
ant/src/testcases/org/apache/tools/ant/taskdefs/condition/ParserSupportsTest.java
  
  Index: ParserSupportsTest.java
  ===================================================================
  package org.apache.tools.ant.taskdefs.condition;
  
  import org.apache.tools.ant.BuildFileTest;
  
  /**
   
   */
  public class ParserSupportsTest extends BuildFileTest {
  
      public ParserSupportsTest(String name) {
          super(name);
      }
  
      /**
       * The JUnit setup method
       */
      public void setUp() {
          
configureProject("src/etc/testcases/taskdefs/conditions/parsersupports.xml");
      }
  
      public void testEmpty() throws Exception {
          expectBuildExceptionContaining("testEmpty",
                  ParserSupports.ERROR_NO_ATTRIBUTES,
                  ParserSupports.ERROR_NO_ATTRIBUTES);
      }
  
      public void testBoth() throws Exception {
          expectBuildExceptionContaining("testBoth",
                  ParserSupports.ERROR_BOTH_ATTRIBUTES,
                  ParserSupports.ERROR_BOTH_ATTRIBUTES);
      }
  
      public void testNamespaces() throws Exception {
          executeTarget("testNamespaces");
      }
  
      public void testPropertyNoValue() throws Exception {
          expectBuildExceptionContaining("testPropertyNoValue",
                  ParserSupports.ERROR_NO_VALUE,
                  ParserSupports.ERROR_NO_VALUE);
      }
  
      public void testUnknownProperty() throws Exception {
          executeTarget("testUnknownProperty");
      }
      public void NotestPropertyInvalid() throws Exception {
          executeTarget("testPropertyInvalid");
      }
      public void NotestXercesProperty() throws Exception {
          executeTarget("testXercesProperty");
      }
  }
  
  
  
  1.37      +1 -0      
ant/src/main/org/apache/tools/ant/types/defaults.properties
  
  Index: defaults.properties
  ===================================================================
  RCS file: 
/home/cvs/ant/src/main/org/apache/tools/ant/types/defaults.properties,v
  retrieving revision 1.36
  retrieving revision 1.37
  diff -u -r1.36 -r1.37
  --- defaults.properties       22 Jan 2005 22:01:15 -0000      1.36
  +++ defaults.properties       25 Feb 2005 11:32:35 -0000      1.37
  @@ -42,3 +42,4 @@
   scriptselector=org.apache.tools.ant.types.optional.ScriptSelector
   scriptcondition=org.apache.tools.ant.types.optional.ScriptCondition
   xor=org.apache.tools.ant.taskdefs.condition.Xor
  +parsersupports=org.apache.tools.ant.taskdefs.condition.ParserSupports
  
  
  
  1.28      +56 -0     ant/docs/manual/CoreTasks/conditions.html
  
  Index: conditions.html
  ===================================================================
  RCS file: /home/cvs/ant/docs/manual/CoreTasks/conditions.html,v
  retrieving revision 1.27
  retrieving revision 1.28
  diff -u -r1.27 -r1.28
  --- conditions.html   7 Feb 2005 23:41:10 -0000       1.27
  +++ conditions.html   25 Feb 2005 11:32:35 -0000      1.28
  @@ -475,6 +475,62 @@
   
   Sets the default value of the condition to true, then in the script, 
   sets the value to false. This condition always evaluates to "false"
  +
  +<h4>parsersupports</h4>
  +
  +<p>Tests whether Ant's XML parser supports a given
  +feature or property, as per the SAX/JAXP specifications, by
  +attempting to set the appropriate property/feature/</p>
  +
  +<p>This condition was added in Apache Ant 1.7.</p>
  +
  +<table border="1" cellpadding="2" cellspacing="0">
  +  <tr>
  +    <td valign="top"><b>Attribute</b></td>
  +    <td valign="top"><b>Description</b></td>
  +    <td align="center" valign="top"><b>Required</b></td>
  +  </tr>
  +  <tr>
  +    <td valign="top">property</td>
  +    <td valign="top">property to set</td>
  +    <td valign="top" align="center">one of property or feature</td>
  +  </tr>
  +  <tr>
  +    <td valign="top">feature</td>
  +    <td valign="top">feature to set</td>
  +    <td valign="top" align="center">one of property or feature</td>
  +  </tr>
  +  <tr>
  +    <td valign="top">value</td>
  +    <td valign="top">string (property) or boolean (feature)</td>
  +    <td valign="top" align="center">For property tests, but not for feature 
tests</td>
  +  </tr>
  +</table>
  +
  +<pre>
  +&lt;parsersupports feature="http://xml.org/sax/features/namespaces"/&gt;
  +</pre>
  +Check for namespace support. All SAX2 parsers should have this.
  +<pre>
  +&lt;or&gt;
  +  &lt;parsersupports
  +    feature="http://apache.org/xml/features/validation/schema"/&gt;
  +  &lt;parsersupports
  +    feature="http://java.sun.com/xml/jaxp/properties/schemaSource"/&gt;
  +&lt;/or&gt;
  +</pre>
  +
  +Check for XML Schema support.
  +
  +<pre>
  +
  +&lt;parsersupports
  +  
property="http://apache.org/xml/properties/schema/external-noNamespaceSchemaLocation";
  +  value="document.xsd"/&gt;
  +</pre>
  +
  +Check for Xerces-specific definition of the location of the no namespace 
schema.
  +
   <hr>
   <p align="center">Copyright &copy; 2001-2005 Apache Software
   Foundation. All rights Reserved.</p>
  
  
  

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

Reply via email to