001/* 002 * Licensed to the Apache Software Foundation (ASF) under one or more 003 * contributor license agreements. See the NOTICE file distributed with 004 * this work for additional information regarding copyright ownership. 005 * The ASF licenses this file to You under the Apache License, Version 2.0 006 * (the "License"); you may not use this file except in compliance with 007 * the License. You may obtain a copy of the License at 008 * 009 * http://www.apache.org/licenses/LICENSE-2.0 010 * 011 * Unless required by applicable law or agreed to in writing, software 012 * distributed under the License is distributed on an "AS IS" BASIS, 013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 014 * See the License for the specific language governing permissions and 015 * limitations under the License. 016 */ 017package org.apache.wicket.core.request.handler; 018 019import org.apache.wicket.IRequestListener; 020import org.apache.wicket.request.IRequestCycle; 021import org.apache.wicket.request.component.IRequestableComponent; 022import org.apache.wicket.request.component.IRequestablePage; 023import org.apache.wicket.request.mapper.parameter.PageParameters; 024import org.apache.wicket.util.lang.Args; 025 026/** 027 * Request handler for bookmarkable pages with an {@link IRequestListener}. This handler is only used to 028 * generate URLs. Rendering is always handled by {@link ListenerRequestHandler}. 029 * 030 * @author Matej Knopp 031 */ 032public class BookmarkableListenerRequestHandler 033 implements 034 IPageRequestHandler, 035 IComponentRequestHandler 036{ 037 private final IPageAndComponentProvider pageComponentProvider; 038 039 private final Integer behaviorIndex; 040 041 /** 042 * Construct. 043 * 044 * @param pageComponentProvider 045 * @param behaviorIndex 046 */ 047 public BookmarkableListenerRequestHandler( 048 IPageAndComponentProvider pageComponentProvider, 049 Integer behaviorIndex) 050 { 051 Args.notNull(pageComponentProvider, "pageComponentProvider"); 052 053 this.pageComponentProvider = pageComponentProvider; 054 this.behaviorIndex = behaviorIndex; 055 } 056 057 /** 058 * Construct. 059 * 060 * @param pageComponentProvider 061 */ 062 public BookmarkableListenerRequestHandler(PageAndComponentProvider pageComponentProvider) 063 { 064 this(pageComponentProvider, null); 065 } 066 067 public boolean includeRenderCount() { 068 if (behaviorIndex == null) { 069 return ((IRequestListener)getComponent()).rendersPage(); 070 } else { 071 return ((IRequestListener)getComponent().getBehaviorById(getBehaviorIndex())).rendersPage(); 072 } 073 } 074 075 @Override 076 public IRequestableComponent getComponent() 077 { 078 return pageComponentProvider.getComponent(); 079 } 080 081 @Override 082 public final String getComponentPath() 083 { 084 return pageComponentProvider.getComponentPath(); 085 } 086 087 @Override 088 public IRequestablePage getPage() 089 { 090 return pageComponentProvider.getPageInstance(); 091 } 092 093 @Override 094 public Class<? extends IRequestablePage> getPageClass() 095 { 096 return pageComponentProvider.getPageClass(); 097 } 098 099 @Override 100 public Integer getPageId() 101 { 102 return pageComponentProvider.getPageId(); 103 } 104 105 @Override 106 public PageParameters getPageParameters() 107 { 108 return pageComponentProvider.getPageParameters(); 109 } 110 111 @Override 112 public void detach(IRequestCycle requestCycle) 113 { 114 pageComponentProvider.detach(); 115 } 116 117 /** 118 * Returns index of behavior this listener is targeted on or <code>null</code> if component is 119 * the target 120 * 121 * @return behavior index or <code>null</code> 122 */ 123 public Integer getBehaviorIndex() 124 { 125 return behaviorIndex; 126 } 127 128 @Override 129 public void respond(IRequestCycle requestCycle) 130 { 131 // nothing to do here, this handler is only used to generate URLs 132 } 133 134 @Override 135 public final boolean isPageInstanceCreated() 136 { 137 // this request handler always operates on a created page instance 138 return true; 139 } 140 141 /** 142 * @return the render count of the page 143 */ 144 @Override 145 public final Integer getRenderCount() 146 { 147 return pageComponentProvider.getRenderCount(); 148 } 149}