[ http://issues.apache.org/jira/browse/TAPESTRY-1171?page=all ]
Jesse Kuhnert resolved TAPESTRY-1171.
-------------------------------------
Resolution: Fixed
Makes sense to me.
> Change IAutocompleterModel semantics to be object friendly instead of string
> friendly
> -------------------------------------------------------------------------------------
>
> Key: TAPESTRY-1171
> URL: http://issues.apache.org/jira/browse/TAPESTRY-1171
> Project: Tapestry
> Issue Type: Improvement
> Affects Versions: 4.1.1
> Reporter: Ron Piterman
> Fix For: 4.1.1
>
>
> The semantics of the IAutocompleterModel is unclear.
> According to bugfix of http://issues.apache.org/jira/browse/TAPESTRY-1169 the
> following is the scenario:
> The Objects returned in the map from filterValues(String) are toString()ed to
> get the label.
> The same objects are used to extract the primaryKey.
> A method should be implemented - getLabelFor( Object ).
> Now - if one uses toString() - why implement getLabelFor(Object) - which
> object is passed to getLabelFor() ? only the current value? why ? why not use
> getLabelFor() also on the map values?generic
> So, the current use of the model can be represented as :
> public interface IAutocompleteModel<VAL,KEY> // extends IPrimaryKeyConverter
> {
>
> String getLabelFor(VAL value);
>
> Map<KEY,String> filterValues(String match);
> @Override
> KEY getPrimaryKey(VAL value);
> @Override
> VAL getValue(KEY primaryKey);
> }
> Where it should be :
> public interface IAutocompleteModel<VAL,KEY> // extends IPrimaryKeyConverter
> {
>
> String getLabelFor(VAL value);
>
> Map<KEY,VAL> filterValues(String match);
> @Override
> KEY getPrimaryKey(VAL mapValue);
> @Override
> VAL getValue(KEY primaryKey);
> }
> Currently, one have to wrap entities in a custom class in order them to be
> used in the Autocompleter :
> I have an Autocmpleter which should search over Equities - as one could
> expect, there are alot of them,
> So instead of a straightforward implementation:
> public class EquityModel implements IAutocompleteModel
> {
> private OrderFacade orderFacade;
>
> private static final int MAX_RESULTS = 20;
>
> private Log log = LogFactory.getLog( EquityModel.class );
> public Map filterValues(String match)
> {
> log.debug("Searching equity for: " + match);
>
> Collection<Equity> list = this.orderFacade.findEquitiesByName( match
> );
>
> log.debug("Found " + list.size() + "equities" );
>
> Map<Long,Equity> map = new HashMap<Long,Equity>();
> if ( list == null )
> return map;
>
> int i = 0;
> for ( Equity e : list ) {
> map.put( e.getId() , e );
> if ( i++ >= MAX_RESULTS )
> break;
> }
> return map;
> }
> public String getLabelFor(Object value)
> {
> return ((Equity)value).getName();
> }
> public Object getPrimaryKey(Object value)
> {
> return ((Equity)value).getId();
> }
> public Object getValue(Object primaryKey)
> {
> return this.orderFacade.getEquity( (Long)primaryKey );
> }
>
> public void init() {
> this.orderFacade = EJBResolver.getBean( OrderFacade.class );
> }
> }
> Now either I have to change the Equity.toString() method - but why should I ?
> what is the getLabelFor() method for ? also, the backend needs the toString()
> for logging - I can not just change an entity toString() just because
> tapestry uses it for the forntend...
> Or, I have to use a wrapper class, which is actually obsolete, if the
> Autocompleter would have used the map as it "should"tag:
> public class EquityModel implements IAutocompleteModel
> {
> ...
> public Map filterValues(String match)
> {
> log.debug("Searching equity for: " + match);
>
> Collection<Equity> list = this.orderFacade.findEquitiesByName( match
> );
>
> log.debug("Found " + list.size() + "equities" );
>
> Map<Long,EquityWrapper> map = new HashMap<Long,EquityWrapper>();
> if ( list == null )
> return map;
>
> int i = 0;
> for ( Equity e : list ) {
> map.put( e.getId() , new EquityWrapper(e) );
> if ( i++ >= MAX_RESULTS )
> break;
> }
> return map;
> }
> public String getLabelFor(Object value)
> {
> // is this ever called ?
> return ((Equity)value).getName();
> }
> public Object getPrimaryKey(Object value)
> {
> return ((EquityWrapper)value).getEquity().getId();
> }
> public Object getValue(Object primaryKey)
> {
> return this.orderFacade.getEquity( (Long)primaryKey );
> }
>
> public void init() {
> this.orderFacade = EJBResolver.getBean( OrderFacade.class );
> }
> }
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
http://issues.apache.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]