String activePageName = parameters.getActivePageName(); String containingPageName = parameters.getContainingPageName(); String eventType = parameters.getEventType(); String nestedComponentId = parameters.getNestedComponentId(); boolean hasComponentId = InternalUtils.isNonBlank(nestedComponentId); appendContext(true, parameters.getEventContext(), builder); EventContext pageActivationContext = parameters.getPageActivationContext();
public void handleComponentEvent(final ComponentEventRequestParameters parameters, final ComponentRequestHandler handler) throws IOException { String componentId = parameters.getNestedComponentId().equals("") ? parameters.getContainingPageName() : parameters.getContainingPageName() + ":" + parameters.getNestedComponentId(); tracker.perform(String.format("Handling %s '%s' component event request for %s.", request.isXHR() ? "Ajax" : "traditional", parameters.getEventType(), componentId), new IOOperation<Void>() { public Void perform() throws IOException { handler.handleComponentEvent(parameters); return null; } }); }
@Override public void handleComponentEvent(ComponentEventRequestParameters parameters, ComponentRequestHandler handler) throws IOException { Page containerPage = cache.get(parameters.getContainingPageName()); try { containerPage.getComponentElementByNestedId(parameters.getNestedComponentId()); handler.handleComponentEvent(parameters); } catch (UnknownValueException ex) { request.setAttribute(InternalConstants.REFERENCED_COMPONENT_NOT_FOUND, true); } }
public void createdComponentEventLink(Link link, ComponentEventRequestParameters parameters) { trigger(parameters.getActivePageName(), EventConstants.DECORATE_COMPONENT_EVENT_LINK, link, parameters); }
@Test public void page_name_includes_dash_in_component_event_request() { ComponentClassResolver resolver = mockComponentClassResolver(); Request request = mockRequest(); LocalizationSetter ls = mockLocalizationSetter(); MetaDataLocator metaDataLocator = neverWhitelistProtected(); expect(ls.isSupportedLocaleName("foo-bar")).andReturn(false); train_getParameter(request, InternalConstants.PAGE_CONTEXT_NAME, null); train_getParameter(request, InternalConstants.CONTAINER_PAGE_NAME, null); train_getLocale(request, Locale.ENGLISH); ls.setNonPersistentLocaleFromLocaleName("en"); String path = "/foo-bar/baz.biff"; train_getPath(request, path); train_isPageName(resolver, "foo-bar/baz", true); train_canonicalizePageName(resolver, "foo-bar/baz", "foo-bar/Baz"); replay(); ComponentEventLinkEncoderImpl linkEncoder = new ComponentEventLinkEncoderImpl(resolver, contextPathEncoder, ls, null, null, null, null, true, null, "", metaDataLocator, null); ComponentEventRequestParameters parameters = linkEncoder.decodeComponentEventRequest(request); assertEquals(parameters.getActivePageName(), "foo-bar/Baz"); assertEquals(parameters.getNestedComponentId(), "biff"); verify(); }
@Test public void decode_compoent_event_request_with_slash_in_context_path() throws Exception { ComponentClassResolver resolver = mockComponentClassResolver(); Request request = mockRequest(); Response response = mockResponse(); LocalizationSetter ls = mockLocalizationSetter(); MetaDataLocator metaDataLocator = neverWhitelistProtected(); expect(ls.isSupportedLocaleName("page.component:event")).andReturn(false); train_getParameter(request, InternalConstants.PAGE_CONTEXT_NAME, null); train_getParameter(request, InternalConstants.CONTAINER_PAGE_NAME, null); train_getLocale(request, Locale.ENGLISH); ls.setNonPersistentLocaleFromLocaleName("en"); train_getPath(request, "/foo/bar/page.component:event"); train_isPageName(resolver, "page", true); train_canonicalizePageName(resolver, "page", "Page"); replay(); ComponentEventLinkEncoderImpl linkEncoder = new ComponentEventLinkEncoderImpl(resolver, contextPathEncoder, ls, response, null, null, null, true, null, "foo/bar", metaDataLocator, null); ComponentEventRequestParameters parameters = linkEncoder.decodeComponentEventRequest(request); assertNotNull(parameters); assertEquals(parameters.getActivePageName(), "Page"); assertEquals(parameters.getEventType(), "event"); verify(); }
private ComponentEventRequestParameters validateAndConstructComponentEventRequest(Request request, String pageName, String nestedComponentId, String eventType, List<String> remainingPath) { if (!componentClassResolver.isPageName(pageName)) { return null; } String activePageName = componentClassResolver.canonicalizePageName(pageName); if (isWhitelistOnlyAndNotValid(activePageName)) { return null; } String value = request.getParameter(InternalConstants.CONTAINER_PAGE_NAME); String containingPageName = value == null ? activePageName : componentClassResolver.canonicalizePageName(value); EventContext eventContext = contextPathEncoder.decodePath(joinPath(remainingPath)); EventContext activationContext = contextPathEncoder.decodePath(request.getParameter(InternalConstants.PAGE_CONTEXT_NAME)); return new ComponentEventRequestParameters(activePageName, containingPageName, nestedComponentId, eventType, activationContext, eventContext); }
@Override public void handleComponentEvent( ComponentEventRequestParameters parameters, ComponentRequestHandler handler) throws IOException { if (logger.isTraceEnabled()) { logger.trace("handleComponentEvent"); } if (redirectUnauthorizedUser(parameters.getActivePageName())) { return; } handler.handleComponentEvent(parameters); }
public Link createComponentEventLink(Page page, String nestedId, String eventType, boolean forForm, Object... eventContext) { assert page != null; assert InternalUtils.isNonBlank(eventType); Page activePage = pageRenderQueue.getRenderingPage(); // See TAPESTRY-2184 if (activePage == null) activePage = page; String activePageName = activePage.getName(); Object[] pageActivationContext = contextCollector.collectPageActivationContext(activePageName); ComponentEventRequestParameters parameters = new ComponentEventRequestParameters(activePageName, page.getName(), toBlank(nestedId), eventType, new ArrayEventContext(typeCoercer, pageActivationContext), new ArrayEventContext(typeCoercer, eventContext)); Link link = linkEncoder.createComponentEventLink(parameters, forForm); for (LinkCreationListener2 listener : listeners) listener.createdComponentEventLink(link, parameters); return link; }
public void handle(ComponentEventRequestParameters parameters) throws IOException Page activePage = cache.get(parameters.getActivePageName()); .getPageActivationContext(), resultProcessor)) Page containerPage = cache.get(parameters.getContainingPageName()); environment.push(TrackableComponentEventCallback.class, callback); ComponentPageElement element = containerPage.getComponentElementByNestedId(parameters.getNestedComponentId()); boolean handled = element.triggerContextEvent(parameters.getEventType(), parameters.getEventContext(), callback); throw new TapestryException(String.format("Request event '%s' (on component %s) was not handled; you must provide a matching event handler method in the component or in one of its containers.", parameters.getEventType(), element.getCompleteId()), element, null);
public void handleComponentEvent(ComponentEventRequestParameters parameters, ComponentRequestHandler handler) throws IOException { globals.storeActivePageName(parameters.getActivePageName()); handler.handleComponentEvent(parameters); }
public ComponentEventRequestParameters decodeComponentEventRequest(Request request) { if (!request.getPath().equals("/event")) return null; String localeName = request.getParameter("x:locale"); String pageName = request.getParameter("x:page"); String container = request.getParameter("x:container"); String id = request.getParameter("x:id"); String pac = request.getParameter("x:pac"); String ec = request.getParameter("x:ec"); String type = request.getParameter("x:type"); if (localeName != null) localizationSetter.setLocaleFromLocaleName(localeName); return new ComponentEventRequestParameters(pageName, container == null ? pageName : container, id, type, toContext(pac), toContext(ec)); }
public Link transformComponentEventLink(Link defaultLink, ComponentEventRequestParameters parameters) { Link link = defaultLink.copyWithBasePath("/event"); for (String name : defaultLink.getParameterNames()) { link.removeParameter(name); } Locale locale = persistentLocale.get(); if (locale != null) { link.addParameter("x:locale", locale.toString()); } link.addParameter("x:type", parameters.getEventType()); addEventContext(link, "x:ec", parameters.getEventContext()); addEventContext(link, "x:pac", parameters.getPageActivationContext()); link.addParameter("x:page", parameters.getActivePageName()); link.addParameter("x:id", parameters.getNestedComponentId()); if (!parameters.getActivePageName().equals(parameters.getContainingPageName())) link.addParameter("x:container", parameters.getContainingPageName()); return link; }
public boolean checkForInsecureComponentEventRequest(ComponentEventRequestParameters parameters) throws IOException { if (!needsRedirect(parameters.getActivePageName())) { return false; } // Page is secure but request is not, so redirect. // We can safely ignore the forForm parameter since secure form requests are always done from // an already secured page Link link = componentEventLinkEncoder.createComponentEventLink(parameters, false); response.sendRedirect(link); return true; }
@Test public void component_event_from_other_page() { String primaryPageName = "blocks/AppDisplay"; Page primaryPage = mockPage(); Page activePage = mockPage(); PageRenderQueue queue = mockPageRenderQueue(); PageActivationContextCollector collector = mockPageActivationContextCollector(); ComponentEventLinkEncoder linkEncoder = mockComponentEventLinkEncoder(); Link link = mockLink(); train_getRenderingPage(queue, activePage); train_getName(activePage, "order/View"); train_getName(primaryPage, primaryPageName); train_collectPageActivationContext(collector, "order/View", "x", "y"); EventContext pageActivationContext = new ArrayEventContext(typeCoercer, "x", "y"); EventContext eventContext = new ArrayEventContext(typeCoercer, 3, 5, 9); ComponentEventRequestParameters parameters = new ComponentEventRequestParameters("order/View", primaryPageName, "gnip.gnop", "myevent", pageActivationContext, eventContext); expect(linkEncoder.createComponentEventLink(parameters, true)).andReturn(link); replay(); LinkSource source = new LinkSourceImpl(queue, collector, typeCoercer, null, linkEncoder, null, null, emptyConfiguration); assertSame(source.createComponentEventLink(primaryPage, "gnip.gnop", "myevent", true, 3, 5, 9), link); verify(); }
public void handle(ComponentEventRequestParameters parameters) throws IOException Page activePage = cache.get(parameters.getActivePageName()); request.setAttribute(InternalConstants.PAGE_NAME_ATTRIBUTE_NAME, parameters.getActivePageName()); .getPageActivationContext(), interceptor)) return; Page containerPage = cache.get(parameters.getContainingPageName()); ComponentPageElement element = containerPage.getComponentElementByNestedId(parameters.getNestedComponentId()); .triggerContextEvent(parameters.getEventType(), parameters.getEventContext(), callback); throw new TapestryException(String.format("Request event '%s' (on component %s) was not handled; you must provide a matching event handler method in the component or in one of its containers.", parameters.getEventType(), element.getCompleteId()), element, null);
@Override public void handle(ComponentEventRequestParameters parameters, ComponentEventRequestHandler handler) throws IOException { FileUploadException uploadException = decoder.getUploadException(); if (uploadException != null) { Component page = componentSource.getPage(parameters.getActivePageName()); ComponentResultProcessorWrapper callback = new ComponentResultProcessorWrapper(resultProcessor); page.getComponentResources().triggerEvent(UploadEvents.UPLOAD_EXCEPTION, new Object[] { uploadException }, callback); // If an event handler exists and returns a value, then the callback will be aborted and a response // (typically a redirect) will already have been sent to the client. if (callback.isAborted()) return; // If the page does not properly handle the exception, then we throw it now. throw new RuntimeException(UploadMessages.unableToDecode(), uploadException); } handler.handle(parameters); } }
ClientWhitelist whitelist = newMock(ClientWhitelist.class); ComponentEventRequestParameters expectedParameters = new ComponentEventRequestParameters( containerPageName, containerPageName, "", "anevent", new EmptyEventContext(), new EmptyEventContext());
@Override public void handle(ComponentEventRequestParameters parameters, ComponentEventRequestHandler handler) throws IOException { FileUploadException uploadException = decoder.getUploadException(); if (uploadException != null) { Component page = componentSource.getPage(parameters.getActivePageName()); ComponentResultProcessorWrapper callback = new ComponentResultProcessorWrapper(resultProcessor); page.getComponentResources().triggerEvent(UploadEvents.UPLOAD_EXCEPTION, new Object[] { uploadException }, callback); // If an event handler exists and returns a value, then the callback will be aborted and a response // (typically a redirect) will already have been sent to the client. if (callback.isAborted()) return; // If the page does not properly handle the exception, then we throw it now. throw new RuntimeException(UploadMessages.unableToDecode(), uploadException); } handler.handle(parameters); } }
private void testEventLinkCreation2(String pageName, String nestedId, String eventType, boolean forForm, Object... context) { Page primaryPage = mockPage(); PageRenderQueue queue = mockPageRenderQueue(); PageActivationContextCollector collector = mockPageActivationContextCollector(); LinkCreationListener2 listener = mockLinkCreationListener2(); ComponentEventLinkEncoder linkEncoder = mockComponentEventLinkEncoder(); Link link = mockLink(); ArrayEventContext eventContext = new ArrayEventContext(typeCoercer, context); ArrayEventContext pageEventContext = new ArrayEventContext(typeCoercer, "a", "b"); train_getRenderingPage(queue, null); train_getName(primaryPage, pageName); train_collectPageActivationContext(collector, pageName, "a", "b"); ComponentEventRequestParameters parameters = new ComponentEventRequestParameters(pageName, pageName, nestedId, eventType, pageEventContext, eventContext); expect(linkEncoder.createComponentEventLink(parameters, forForm)).andReturn(link); listener.createdComponentEventLink(link, parameters); List<LinkCreationListener2> configuration = CollectionFactory.newList(listener); replay(); LinkSource source = new LinkSourceImpl(queue, collector, typeCoercer, null, linkEncoder, null, null, configuration); Link returnedLink = source.createComponentEventLink(primaryPage, nestedId, eventType, forForm, context); // Make sure the same link is returned. assertSame(returnedLink, link); verify(); }