Hi Luis,
as an alternative I want to show you my solution given in the below
listed
encoder class.
Each search criterion in my solution is represented by a type called
"TapestryClientCriterion". My generic search component renders any
number
of "finder input lines" each having a list of possible search criteria
which can be selected in a drop down.
My solution is based on the simple approach just to add a piece of
information identifying the input line a criterion belongs to in the
client
id of each criterion. So a criterions client id consists of its own
id and
a scond identifying the input line concatenated together with a certain
delimiter token. This all is done via an encoder (see below).
/**
* This encoder has the task to provide each client side element
of the
* component with id "<strong>criterionSelector</strong>" with a
value
* identifying this element by the id of the finder input line it is
* rendered in and its own id. Both ids are concatenated using
the "~"
token
* as delimiter. The server side representation will be restored by
looking
* up for the correct "<strong>{@linkplain TapestryClientCriterion}
* </strong>" in the correct "<strong>{@linkplain
FinderInputLine}</strong>"
* using the information coded in the above mentioned
concatenated string.
* The only sense of this encoder is to make each rendered finder
criterion
* unique by the above id, because criteria are rendered multiple
times in
* the loop iterations.
*
*/
private class ClientCriterionEncoder implements
ValueEncoder<TapestryClientCriterion> {
/**
* @see
org.apache.tapestry5.ValueEncoder#toClient(java.lang.Object)
* @param value
* @return The id of the looped finder input line.
*/
@Override
public String toClient(TapestryClientCriterion value) {
String finderInputLineId = String.valueOf(value
.getFinderInputLineId());
String criterionId = String.valueOf(value.getId());
return finderInputLineId + "~" + criterionId;
}
/**
* @see
org.apache.tapestry5.ValueEncoder#toValue(java.lang.String)
* @param clientValue
* @return The finder input line for the given client id.
*/
@Override
public TapestryClientCriterion toValue(String clientValue) {
TapestryClientCriterion clientCriterion = null;
try {
String[] idParts = clientValue.split("~");
String finderInputLineIdStr = idParts[0];
String criterionIdStr = idParts[1];
int finderInputLineId =
Integer.parseInt(finderInputLineIdStr);
long criterionId = Long.parseLong(criterionIdStr);
// find the correct line
for (FinderInputLine finderInputLine : finderCallback
.getFinderInputLinesToRender()) {
if (finderInputLine.getFinderInputLineId() ==
finderInputLineId) {
// find the correct criterion
for (TapestryClientCriterion criterion :
finderInputLine
.getTapestryClientCriteria()) {
if (criterion.getId() == criterionId) {
clientCriterion = criterion;
break;
}
} // inner for
break;
}
} // outer for
} catch (Exception e) {
LOG.info(e.getMessage(), e);
}
return clientCriterion;
}
}
---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscr...@tapestry.apache.org
For additional commands, e-mail: users-h...@tapestry.apache.org