001 // Copyright 2004, 2005 The Apache Software Foundation
002 //
003 // Licensed under the Apache License, Version 2.0 (the "License");
004 // you may not use this file except in compliance with the License.
005 // You may obtain a copy of the License at
006 //
007 // http://www.apache.org/licenses/LICENSE-2.0
008 //
009 // Unless required by applicable law or agreed to in writing, software
010 // distributed under the License is distributed on an "AS IS" BASIS,
011 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
012 // See the License for the specific language governing permissions and
013 // limitations under the License.
014
015 package org.apache.tapestry.callback;
016
017 import org.apache.hivemind.ApplicationRuntimeException;
018 import org.apache.hivemind.util.Defense;
019 import org.apache.tapestry.IComponent;
020 import org.apache.tapestry.IDirect;
021 import org.apache.tapestry.IPage;
022 import org.apache.tapestry.IRequestCycle;
023
024 /**
025 * Simple callback for re-invoking a {@link IDirect} trigger.
026 *
027 * @author Howard Lewis Ship
028 * @since 0.2.9
029 */
030
031 public class DirectCallback implements ICallback
032 {
033 /**
034 * @since 2.0.4
035 */
036
037 private static final long serialVersionUID = -8888847655917503471L;
038
039 private String _pageName;
040
041 private String _componentIdPath;
042
043 private Object[] _parameters;
044
045 /**
046 * Creates a new DirectCallback for the component. The parameters (which may be null) is
047 * retained, not copied.
048 */
049
050 public DirectCallback(IDirect component, Object[] parameters)
051 {
052 Defense.notNull(component, "component");
053
054 _pageName = component.getPage().getPageName();
055 _componentIdPath = component.getIdPath();
056 _parameters = parameters;
057 }
058
059 public String toString()
060 {
061 StringBuffer buffer = new StringBuffer("DirectCallback[");
062
063 buffer.append(_pageName);
064 buffer.append('/');
065 buffer.append(_componentIdPath);
066
067 if (_parameters != null)
068 {
069 for (int i = 0; i < _parameters.length; i++)
070 {
071 buffer.append(i == 0 ? " " : ", ");
072 buffer.append(_parameters[i]);
073 }
074 }
075
076 buffer.append(']');
077
078 return buffer.toString();
079
080 }
081
082 /**
083 * Locates the {@link IDirect}component that was previously identified (and whose page and id
084 * path were stored). Invokes {@link IRequestCycle#setListenerParameters(Object[]) (Object[])} to
085 * restore the service parameters, then invokes {@link IDirect#trigger(IRequestCycle)}on the
086 * component.
087 */
088
089 public void performCallback(IRequestCycle cycle)
090 {
091 IPage page = cycle.getPage(_pageName);
092 IComponent component = page.getNestedComponent(_componentIdPath);
093 IDirect direct = null;
094
095 try
096 {
097 direct = (IDirect) component;
098 }
099 catch (ClassCastException ex)
100 {
101 throw new ApplicationRuntimeException(CallbackMessages.componentNotDirect(component),
102 component, null, ex);
103 }
104
105 cycle.setListenerParameters(_parameters);
106 direct.trigger(cycle);
107 }
108 }