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.IComponent; 24 import org.apache.tapestry.IDirect; 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 42 43 public class DirectService implements IEngineService 44 { 45 46 private ResponseRenderer _responseRenderer; 47 48 49 private LinkFactory _linkFactory; 50 51 52 private WebRequest _request; 53 54 public ILink getLink(IRequestCycle cycle, Object parameter) 55 { 56 Defense.isAssignable(parameter, DirectServiceParameter.class, "parameter"); 57 58 DirectServiceParameter dsp = (DirectServiceParameter) parameter; 59 60 IComponent component = dsp.getDirect(); 61 62 70 IPage activePage = cycle.getPage(); 71 IPage componentPage = component.getPage(); 72 73 Map parameters = new HashMap (); 74 75 boolean stateful = _request.getSession(false) != null; 76 77 parameters.put(ServiceConstants.SERVICE, Tapestry.DIRECT_SERVICE); 78 parameters.put(ServiceConstants.PAGE, activePage.getPageName()); 79 parameters.put(ServiceConstants.COMPONENT, component.getIdPath()); 80 parameters.put(ServiceConstants.CONTAINER, componentPage == activePage ? null 81 : componentPage.getPageName()); 82 parameters.put(ServiceConstants.SESSION, stateful ? "T" : null); 83 parameters.put(ServiceConstants.PARAMETER, dsp.getServiceParameters()); 84 85 return _linkFactory.constructLink(cycle, parameters, true); 86 } 87 88 public void service(IRequestCycle cycle) throws IOException 89 { 90 String componentId = cycle.getParameter(ServiceConstants.COMPONENT); 91 String componentPageName = cycle.getParameter(ServiceConstants.CONTAINER); 92 String activePageName = cycle.getParameter(ServiceConstants.PAGE); 93 boolean activeSession = cycle.getParameter(ServiceConstants.SESSION) != null; 94 95 IPage page = cycle.getPage(activePageName); 96 97 cycle.activate(page); 98 99 IPage componentPage = componentPageName == null ? page : cycle.getPage(componentPageName); 100 101 IComponent component = componentPage.getNestedComponent(componentId); 102 103 IDirect direct = null; 104 105 try 106 { 107 direct = (IDirect) component; 108 } 109 catch (ClassCastException ex) 110 { 111 throw new ApplicationRuntimeException(EngineMessages.wrongComponentType( 112 component, 113 IDirect.class), component, null, ex); 114 } 115 116 119 if (activeSession && direct.isStateful()) 120 { 121 WebSession session = _request.getSession(false); 122 123 if (session == null || session.isNew()) 124 throw new StaleSessionException(EngineMessages.requestStateSession(direct), 125 componentPage); 126 } 127 128 Object [] parameters = _linkFactory.extractListenerParameters(cycle); 129 130 cycle.setListenerParameters(parameters); 131 132 direct.trigger(cycle); 133 134 137 _responseRenderer.renderResponse(cycle); 138 } 139 140 public String getName() 141 { 142 return Tapestry.DIRECT_SERVICE; 143 } 144 145 146 public void setResponseRenderer(ResponseRenderer responseRenderer) 147 { 148 _responseRenderer = responseRenderer; 149 } 150 151 152 public void setLinkFactory(LinkFactory linkFactory) 153 { 154 _linkFactory = linkFactory; 155 } 156 157 158 public void setRequest(WebRequest request) 159 { 160 _request = request; 161 } 162 } | Popular Tags |