1 15 package org.apache.tapestry.engine; 16 17 import java.io.IOException ; 18 import java.util.HashMap ; 19 import java.util.Map ; 20 21 import org.apache.hivemind.ApplicationRuntimeException; 22 import org.apache.hivemind.util.Defense; 23 import org.apache.tapestry.IAction; 24 import org.apache.tapestry.IComponent; 25 import org.apache.tapestry.IPage; 26 import org.apache.tapestry.IRequestCycle; 27 import org.apache.tapestry.StaleSessionException; 28 import org.apache.tapestry.Tapestry; 29 import org.apache.tapestry.services.LinkFactory; 30 import org.apache.tapestry.services.ResponseRenderer; 31 import org.apache.tapestry.services.ServiceConstants; 32 import org.apache.tapestry.web.WebRequest; 33 import org.apache.tapestry.web.WebSession; 34 35 43 44 public class ActionService implements IEngineService 45 { 46 47 private ResponseRenderer _responseRenderer; 48 49 50 private LinkFactory _linkFactory; 51 52 53 private static final String ACTION = "action"; 54 55 56 private WebRequest _request; 57 58 public ILink getLink(IRequestCycle cycle, Object parameter) 59 { 60 Defense.isAssignable(parameter, ActionServiceParameter.class, "parameter"); 61 62 ActionServiceParameter asp = (ActionServiceParameter) parameter; 63 64 IComponent component = asp.getComponent(); 65 IPage activePage = cycle.getPage(); 66 IPage componentPage = component.getPage(); 67 68 Map parameters = new HashMap (); 69 70 boolean stateful = _request.getSession(false) != null; 71 72 parameters.put(ServiceConstants.SERVICE, Tapestry.ACTION_SERVICE); 73 parameters.put(ServiceConstants.COMPONENT, component.getIdPath()); 74 parameters.put(ServiceConstants.PAGE, activePage.getPageName()); 75 parameters.put(ServiceConstants.CONTAINER, activePage == componentPage ? null 76 : componentPage.getPageName()); 77 parameters.put(ACTION, asp.getActionId()); 78 parameters.put(ServiceConstants.SESSION, stateful ? "T" : null); 79 80 return _linkFactory.constructLink(cycle, parameters, true); 81 } 82 83 public void service(IRequestCycle cycle) throws IOException 84 { 85 String componentId = cycle.getParameter(ServiceConstants.COMPONENT); 86 String componentPageName = cycle.getParameter(ServiceConstants.CONTAINER); 87 String activePageName = cycle.getParameter(ServiceConstants.PAGE); 88 String actionId = cycle.getParameter(ACTION); 89 boolean activeSession = cycle.getParameter(ServiceConstants.SESSION) != null; 90 91 IPage page = cycle.getPage(activePageName); 92 93 95 cycle.activate(page); 96 97 IPage componentPage = componentPageName == null ? page : cycle.getPage(componentPageName); 98 99 IComponent component = componentPage.getNestedComponent(componentId); 100 101 IAction action = null; 102 103 try 104 { 105 action = (IAction) component; 106 } 107 catch (ClassCastException ex) 108 { 109 throw new ApplicationRuntimeException(EngineMessages.wrongComponentType( 110 component, 111 IAction.class), component, null, ex); 112 } 113 114 117 if (activeSession && action.getRequiresSession()) 118 { 119 WebSession session = _request.getSession(false); 120 121 if (session == null || session.isNew()) 122 throw new StaleSessionException(EngineMessages.requestStateSession(component), 123 componentPage); 124 125 } 126 127 cycle.rewindPage(actionId, action); 128 129 132 134 _responseRenderer.renderResponse(cycle); 135 } 136 137 public String getName() 138 { 139 return Tapestry.ACTION_SERVICE; 140 } 141 142 143 public void setResponseRenderer(ResponseRenderer responseRenderer) 144 { 145 _responseRenderer = responseRenderer; 146 } 147 148 149 public void setLinkFactory(LinkFactory linkFactory) 150 { 151 _linkFactory = linkFactory; 152 } 153 154 155 public void setRequest(WebRequest request) 156 { 157 _request = request; 158 } 159 } | Popular Tags |