You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@cocoon.apache.org by ha...@apache.org on 2002/12/16 11:37:33 UTC

cvs commit: xml-cocoon2/src/java/org/apache/cocoon/components/modules/input AbstractJXPathModule.java JXPathMetaModule.java

haul        2002/12/16 02:37:33

  Modified:    src/java/org/apache/cocoon/components/modules/input
                        AbstractJXPathModule.java JXPathMetaModule.java
  Log:
    <action dev="CH" type="update">
      AbstractJXPathModule / JXPathMetaModule default to lenient mode i.e. do not
      throw an exception on unsupported attributes but return null instead. Made
      this a configuration option.
    </action>
  
  Revision  Changes    Path
  1.7       +18 -3     xml-cocoon2/src/java/org/apache/cocoon/components/modules/input/AbstractJXPathModule.java
  
  Index: AbstractJXPathModule.java
  ===================================================================
  RCS file: /home/cvs/xml-cocoon2/src/java/org/apache/cocoon/components/modules/input/AbstractJXPathModule.java,v
  retrieving revision 1.6
  retrieving revision 1.7
  diff -u -r1.6 -r1.7
  --- AbstractJXPathModule.java	6 Dec 2002 09:20:20 -0000	1.6
  +++ AbstractJXPathModule.java	16 Dec 2002 10:37:33 -0000	1.7
  @@ -70,6 +70,10 @@
    *
    * <p>Configuration example:</p>
    * <table>
  + * <tr><td><code>&lt;lenient&gt;false&lt;/lenient&gt;</td>
  + * <td>When set to true, non-existing attributes return null, when set to false,
  + *     an exception is thrown. Default is true.</td> 
  + *</tr>
    * <tr><td><code>&lt;function name="java.lang.String" prefix="str"/&gt;</td>
    * <td>Imports the class "String" as extension class to the JXPathContext using 
    * the prefix "str". Thus "str:length(xpath)" would apply the method "length" to 
  @@ -96,6 +100,11 @@
        */
       protected FunctionLibrary library = null;
   
  +    /** set lenient mode for jxpath (i.e. throw an exception on
  +     * unsupported attributes) ? 
  +     */
  +    protected boolean lenient = true;
  +
   
       /**
        * Configure component. Preprocess list of packages and functions
  @@ -109,6 +118,7 @@
           // JXPathMetaModule starts copying here
           // please keep both in sync.
   
  +        this.lenient = config.getChild("lenient").getValueAsBoolean(this.lenient);
           this.library = new FunctionLibrary();
           getFunctions(this.library, config);
           getPackages(this.library, config);
  @@ -213,7 +223,9 @@
           try {
               JXPathContext jxContext = JXPathContext.newContext(contextObj);
               setupExtensions(jxContext, modeConf);
  -            return jxContext.getValue(name);
  +            if (this.lenient) jxContext.setLenient(true); // return null insted of exception on non existing property
  +            Object obj = jxContext.getValue(name);
  +            return obj;
           } catch (Exception e) {
               throw new ConfigurationException(
                   "Module does not support <" + name + ">" + "attribute.",
  @@ -253,11 +265,14 @@
               JXPathContext jxContext = JXPathContext.newContext(contextObj);
               List values = new LinkedList();
               setupExtensions(jxContext, modeConf);
  +            if (this.lenient) jxContext.setLenient(true); // return null insted of exception on non existing property
               Iterator i = jxContext.iterate(name);
               while (i.hasNext()) {
                   values.add(i.next());
               }
  -            return values.toArray();
  +            Object[] obj = values.toArray();
  +            if (obj.length == 0) obj = null;
  +            return obj;
           } catch (Exception e) {
               throw new ConfigurationException(
                   "Module does not support <" + name + ">" + "attribute.",
  
  
  
  1.4       +40 -10    xml-cocoon2/src/java/org/apache/cocoon/components/modules/input/JXPathMetaModule.java
  
  Index: JXPathMetaModule.java
  ===================================================================
  RCS file: /home/cvs/xml-cocoon2/src/java/org/apache/cocoon/components/modules/input/JXPathMetaModule.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- JXPathMetaModule.java	6 Dec 2002 09:28:55 -0000	1.3
  +++ JXPathMetaModule.java	16 Dec 2002 10:37:33 -0000	1.4
  @@ -71,6 +71,10 @@
    *
    * <p>Configuration example:</p>
    * <table>
  + * <tr><td><code>&lt;lenient&gt;false&lt;/lenient&gt;</td>
  + * <td>When set to true, non-existing attributes return null, when set to false,
  + *     an exception is thrown. Default is true.</td> 
  + *</tr>
    * <tr><td><code>&lt;input-module name="request-attr" parameter="foo"/&gt;</td>
    * <td>Uses the "request-attr" input module to obtain parameter named "foo" and 
    *     applies the given JXPath expression to it.</td> 
  @@ -100,7 +104,13 @@
        *
        */
       protected FunctionLibrary library = null;
  -    protected String parameter = null;
  +
  +    /** set lenient mode for jxpath (i.e. throw an exception on
  +     * unsupported attributes) ? 
  +     */
  +    protected boolean lenient = true;
  +
  +    protected String parameter = "";
   
   
       public JXPathMetaModule() {
  @@ -125,6 +135,7 @@
           // start verbatim copy of AbstractJXPathModule
           // please keep both in sync.
   
  +        this.lenient = config.getChild("lenient").getValueAsBoolean(this.lenient);
           this.library = new FunctionLibrary();
           getFunctions(this.library, config);
           getPackages(this.library, config);
  @@ -225,11 +236,15 @@
                                  Map objectModel)
           throws ConfigurationException {
   
  +        Object contextObj = getContextObject(modeConf, objectModel);
           try {
  -            Object contextObj = getContextObject(modeConf, objectModel);
               JXPathContext jxContext = JXPathContext.newContext(contextObj);
               setupExtensions(jxContext, modeConf);
  -            return jxContext.getValue(name);
  +            if (this.lenient) jxContext.setLenient(true); // return null insted of exception on non existing property
  +            Object obj = jxContext.getValue(name);
  +            if (getLogger().isDebugEnabled())
  +                getLogger().debug("for "+name+" returning an "+(obj == null ? "null" : obj.getClass().getName())+" as "+obj);
  +            return obj;
           } catch (Exception e) {
               throw new ConfigurationException(
                   "Module does not support <" + name + ">" + "attribute.",
  @@ -264,16 +279,21 @@
       public Object[] getAttributeValues(String name, Configuration modeConf, Map objectModel)
           throws ConfigurationException {
   
  +        Object contextObj = getContextObject(modeConf, objectModel);
           try {
  -            Object contextObj = getContextObject(modeConf, objectModel);
               JXPathContext jxContext = JXPathContext.newContext(contextObj);
               List values = new LinkedList();
               setupExtensions(jxContext, modeConf);
  +            if (this.lenient) jxContext.setLenient(true); // return null insted of exception on non existing property
               Iterator i = jxContext.iterate(name);
               while (i.hasNext()) {
                   values.add(i.next());
               }
  -            return values.toArray();
  +            Object[] obj = values.toArray();
  +            if (obj.length == 0) obj = null;
  +            if (getLogger().isDebugEnabled())
  +                getLogger().debug("for "+name+" returning an "+(obj == null ? "null" : obj.getClass().getName())+" as "+obj);
  +            return obj;
           } catch (Exception e) {
               throw new ConfigurationException(
                   "Module does not support <" + name + ">" + "attribute.",
  @@ -297,12 +317,22 @@
           String inputName=null;
           String parameter = this.parameter;
           if (modeConf!=null) {
  -            inputName   = modeConf.getChild("input-module").getAttribute("name",null);
  +            mConf   = modeConf.getChild("input-module");
  +            inputName   = mConf.getAttribute("name",null);
               parameter   = modeConf.getAttribute("parameter",parameter);
           }
  -        return this.getValue(parameter, objectModel, 
  -                             this.input, this.defaultInput, this.inputConf,
  -                             null, inputName, modeConf);
  +
  +        if (getLogger().isDebugEnabled())
  +            getLogger().debug("modeConf is "+modeConf+" this.inputConf is "+this.inputConf+" mConf is "+mConf+" this.input is "+this.input+" this.defaultInput is "+this.defaultInput+" inputName is "+inputName+" parameter is "+parameter);
  +
  +        Object obj =  this.getValue(parameter, objectModel, 
  +                                    this.input, this.defaultInput, this.inputConf,
  +                                    null, inputName, mConf);
  +        
  +        if (getLogger().isDebugEnabled())
  +            getLogger().debug("returning an "+(obj == null ? "null" : obj.getClass().getName())+" as "+obj);
  +
  +        return obj;
       }
   
   }
  
  
  

----------------------------------------------------------------------
In case of troubles, e-mail:     webmaster@xml.apache.org
To unsubscribe, e-mail:          cocoon-cvs-unsubscribe@xml.apache.org
For additional commands, e-mail: cocoon-cvs-help@xml.apache.org