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}