I have a Select Many Ordered Shuttle working in a faces page. The tag documentation contract for the shuttle states:
------------------------------------------ -- JavaScript proxies -- In some cases, developers will need to use JavaScript to manipulate or use the contents of the lists. This may be required as actions for the buttons or icons in the shuttle footers or outside the shuttle all together. Thus, a set of Javascript utility methods are available that operate on the lists. These are located in the shuttle.js Javascript library, which is automatically loaded if you use the shuttle. These methods can be accessed by creating a ShuttleProxy instance based on the shuttle client ID and form. // create the proxy object var proxy2 = new ShuttleProxy("testShuttle2", "testForm2"); Once the proxy is created, you can use it to gain information about the lists or to manipulate the lists in the shuttle. The proxy provides the following functions: ... addItem(leadingList, index, text, value, description) : adds an item at the given index to a list. The item is added to the leading list if leadingList is true, otherwise it is added to the trailing list. The index should be 0 based. Thus, to insert an item at the end of a list, set index to shuttleProxy.getItemCount(leadinglist). The text parameter specifies the display text for the item, while the value parameter specifies the value that represents this item upon form submission. The description parameter specifies a description of the item. The description parameter can be omitted .... ------------------------------------------- I have written the JavaScript code to add an item to the shuttle and this works at the client end; however, when I try and submit the shuttle lists, the server end fails when it gets to class org.apache.myfaces.trinidadinternal.renderkit.core.xhtml.SelectManyShuttleRenderer when it is decoding the submitted list in method getSubmittedValue as shown below: protected Object getSubmittedValue( FacesContext context, UIComponent component, String clientId) { // Since we override getSubmittedValue() entirely, // detect auto submit manually detectAutoSubmit(context, component, clientId); String trailingId = clientId + ":trailing:items"; String paramValue = (String) context.getExternalContext(). getRequestParameterMap().get(trailingId); if ((paramValue == null) || "".equals(paramValue)) return new String[0]; List<String> list = new ArrayList<String>(); StringTokenizer tokenizer = new StringTokenizer(paramValue, ";"); // don't let the submitted list get any bigger than the number of // total items in the shuttle int availableItems = SelectItemSupport.getSelectItemCount(component); int numItems = 0; while (tokenizer.hasMoreElements()) { numItems++; if (numItems > availableItems) { _LOG.severe("SELECTED_SHUTTLE_ITEMS_EXCEEDED_TOTAL_NUMBER", clientId); return new String[0]; } list.add(tokenizer.nextToken()); } The check to confirm that the number of submitted items is not greater than the original shuttle list already in existence at the server end, stops any user from adding an additional item to the shuttle. I understand that this may have been done to protect against an attack where someone sends in a huge list of shuttle items, BUT this seems to be in direct conflict with the shuttle contract above that states that I should be able to add one or more items to a shuttle at the client end. I don't believe the intention was simply to add items to the shuttle at the client end without submitting it. I was unable to find any examples, working or otherwise, anywhere that demonstrate said functionality. Given the above, if this getSubmittedValue code is correct and the addItem contract is also correct, how does one add an item to an existing shuttle AND submit it to the server? -=> Gregg <=-