001 package org.apache.tapestry.binding; 002 003 import org.apache.hivemind.ApplicationRuntimeException; 004 import org.apache.hivemind.Location; 005 import org.apache.hivemind.util.Defense; 006 import org.apache.tapestry.IComponent; 007 import org.apache.tapestry.coerce.ValueConverter; 008 009 import java.util.ArrayList; 010 import java.util.List; 011 012 /** 013 * Binding that is specifcially used to bind against components of type {@link org.apache.tapestry.IDynamicInvoker} 014 * and only for the parameter name "updateComponents". 015 * 016 * <p> 017 * Will take a parameter specification of <code>updateComponents="componentA, componentB"</code> and turn it 018 * into the equivalent of a {@link List} containing the result of invoking {@link org.apache.tapestry.IComponent#getClientId()} on 019 * each component specified. 020 * </p> 021 */ 022 public class ClientIdListBinding extends AbstractBinding { 023 024 private final IComponent _target; 025 026 private final String[] _componentIds; 027 private IComponent[] _targets; 028 029 public ClientIdListBinding(String description, ValueConverter valueConverter, 030 Location location, IComponent component, String[] componentIds) 031 { 032 super(description, valueConverter, location); 033 034 Defense.notNull(component, "component"); 035 Defense.notNull(componentIds, "componentIds"); 036 037 _target = component; 038 _componentIds = componentIds; 039 _targets = new IComponent[_componentIds.length]; 040 } 041 042 public Object getObject() 043 { 044 try 045 { 046 List clientIds = new ArrayList(_componentIds.length); 047 048 for (int i=0; i < _componentIds.length; i++) 049 { 050 if (_targets[i] == null) 051 { 052 if (_target.getComponents().containsKey(_componentIds[i])) 053 { 054 _targets[i] = _target.getComponent(_componentIds[i]); 055 } else if (_target.getPage() != null) { 056 057 _targets[i] = _target.getPage().getComponent(_componentIds[i]); 058 } 059 060 // if not found we're in trouble 061 062 if (_targets[i] == null) 063 throw new ApplicationRuntimeException(BindingMessages.unknownComponent(_target, _componentIds[i]), getLocation(), null); 064 } 065 066 clientIds.add(_targets[i].getClientId()); 067 } 068 069 return clientIds; 070 } 071 catch (Exception ex) 072 { 073 throw new ApplicationRuntimeException(ex.getMessage(), getLocation(), ex); 074 } 075 } 076 077 public Object getComponent() 078 { 079 return _target; 080 } 081 082 public boolean isInvariant() 083 { 084 return false; 085 } 086 }