Tapestry 5
  1. Tapestry 5
  2. TAP5-818

Tapestry should properly support JDK 1.5 Generics when reading and updating properties and property expressions

    Details

    • Type: Bug Bug
    • Status: Closed
    • Priority: Major Major
    • Resolution: Fixed
    • Affects Version/s: 5.1.0.5
    • Fix Version/s: 5.2.1
    • Component/s: tapestry-core
    • Labels:
      None
    • Environment:
      Tapestry 5.1.0.5
      JDK5

      Description

      Below is the example
      KeyedObject.java:used to store string keyed object
      import java.util.*;
      import java.util.Map.Entry;
      public class KeyedObject<T> {
      private String key;
      private T value;
      public String getKey()

      { return key; }

      public void setKey(String key)

      { this.key = key; }

      public T getValue()

      { return value; }

      public void setValue(T value)

      { this.value = value; }


      }

      page java class:dbpools simply put BasicDataSource and its key name into a KeyObject list
      import java.util.Iterator;
      import java.util.LinkedList;
      import java.util.List;
      import java.util.Map;
      import java.util.Map.Entry;

      import org.apache.commons.dbcp.BasicDataSource;
      import org.apache.tapestry5.annotations.Property;
      import org.apache.tapestry5.ioc.annotations.Inject;

      import com.elite.predictob.EliteOBManagerProxy;
      import com.elite.predictob.KeyedObject;

      public class dbpools {
      @Inject
      private EliteOBManagerProxy proxy;

      @Property
      private KeyedObject<BasicDataSource> datasource;

      public List<KeyedObject<BasicDataSource>> getDatasources()
      {
      Map dbmap=proxy.getManager().getDataSources();
      synchronized (dbmap) {
      List<KeyedObject<BasicDataSource>> list=new LinkedList<KeyedObject<BasicDataSource>>();
      Iterator<Entry<String,BasicDataSource>> it=dbmap.entrySet().iterator();
      while(it.hasNext())

      { Entry<String,BasicDataSource> entry=it.next(); KeyedObject<BasicDataSource> obj=new KeyedObject<BasicDataSource>(); obj.setKey(entry.getKey()); obj.setValue(entry.getValue()); list.add(obj); }

      return list;
      }
      }
      }

      page template:
      <html xmlns:t="http://tapestry.apache.org/schema/tapestry_5_1_0.xsd"
      xmlns="tapestry:parameter"
      xmlns:cl="cl">
      <head>
      <t:elite.cachecontrol.cachecontrol/>
      <title>$

      {message:dbpoolconfig}

      </title>
      </head>
      <body>
      <table border="1">
      <tr t:type="loop" t:element="tr" t:source="datasources" value="datasource">
      <td>$

      {datasource.key}

      </td><td>$

      {datasource.value.numActive}</td>
      </tr>
      </table>
      </body>
      </html>


      ${datasource.value.numActive}

      will cause following error:
      Could not convert 'datasource.value.numActive' into a component parameter binding: Class java.lang.Object does not contain a property named 'numActive' (within property expression 'datasource.value.numActive'). Available properties: class.

        Activity

        Hide
        Hudson added a comment -

        Integrated in tapestry-5.2-freestyle #173 (See https://hudson.apache.org/hudson/job/tapestry-5.2-freestyle/173/)
        TAP5-818: Tapestry should properly support JDK 1.5 Generics when reading and updating properties and property expressions

        Show
        Hudson added a comment - Integrated in tapestry-5.2-freestyle #173 (See https://hudson.apache.org/hudson/job/tapestry-5.2-freestyle/173/ ) TAP5-818 : Tapestry should properly support JDK 1.5 Generics when reading and updating properties and property expressions
        Hide
        Howard M. Lewis Ship added a comment -

        Thanks Josh .... great patch (just watch those code reformats).

        Show
        Howard M. Lewis Ship added a comment - Thanks Josh .... great patch (just watch those code reformats).
        Hide
        Josh Canfield added a comment -

        Here is a patch that adds support for Property level generic support to the PropertyConduitSource.
        It also fixes a bug where an ArrayIndexOutOfBounds exception could occur if you had multiple levels of Generics with different numbers of arguments.

        class One<A,B>

        class Two<A> extends One<String, A>

        class Three extends Two<Long>

        Show
        Josh Canfield added a comment - Here is a patch that adds support for Property level generic support to the PropertyConduitSource. It also fixes a bug where an ArrayIndexOutOfBounds exception could occur if you had multiple levels of Generics with different numbers of arguments. class One<A,B> class Two<A> extends One<String, A> class Three extends Two<Long>
        Hide
        Josh Canfield added a comment -

        "As the type of T is not known until runtime, all Tapestry know is that T is Object."

        Actually everything needed to support this case is available when the PropertyConduit is created. Tapestry is currently evaluating the expression without considering the context provided by the class which owns the property.

        Show
        Josh Canfield added a comment - "As the type of T is not known until runtime, all Tapestry know is that T is Object." Actually everything needed to support this case is available when the PropertyConduit is created. Tapestry is currently evaluating the expression without considering the context provided by the class which owns the property.
        Hide
        Thiago H. de Paula Figueiredo added a comment -

        Tapestry's prop binding uses class creation, not reflection, to get and set values. As the type of T is not known until runtime, all Tapestry know is that T is Object.

        Show
        Thiago H. de Paula Figueiredo added a comment - Tapestry's prop binding uses class creation, not reflection, to get and set values. As the type of T is not known until runtime, all Tapestry know is that T is Object.
        Hide
        Shane Curcuru added a comment -

        I presume this is a Tapestry issue; otherwise please reassign as needd. This is not related to the PRC project (which is public relations).

        Show
        Shane Curcuru added a comment - I presume this is a Tapestry issue; otherwise please reassign as needd. This is not related to the PRC project (which is public relations).

          People

          • Assignee:
            Howard M. Lewis Ship
            Reporter:
            maxyu
          • Votes:
            1 Vote for this issue
            Watchers:
            0 Start watching this issue

            Dates

            • Created:
              Updated:
              Resolved:

              Development