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.logger;
018
019import java.util.function.Supplier;
020
021import org.apache.wicket.Page;
022import org.apache.wicket.core.request.handler.IPageClassRequestHandler;
023import org.apache.wicket.core.request.handler.IPageProvider;
024import org.apache.wicket.core.request.handler.IPageRequestHandler;
025import org.apache.wicket.request.ILogData;
026import org.apache.wicket.request.component.IRequestablePage;
027import org.apache.wicket.request.mapper.parameter.PageParameters;
028
029/**
030 * Contains logging data for request handlers that are related to pages; most likely
031 * {@link IPageRequestHandler} or {@link IPageClassRequestHandler}.
032 *
033 * @author Emond Papegaaij
034 */
035public class PageLogData implements ILogData
036{
037        private static final long serialVersionUID = 1L;
038
039        private final Class<? extends IRequestablePage> pageClass;
040        private final Integer pageId;
041        private final PageParameters pageParameters;
042        private final Integer renderCount;
043
044        /**
045         * Construct.
046         *
047         * @param pageProvider
048         */
049        public PageLogData(IPageProvider pageProvider)
050        {
051                pageId = optional(pageProvider::getPageId);
052                renderCount = optional(pageProvider::getRenderCount);
053                pageClass = optional(pageProvider::getPageClass);
054                pageParameters = optional(pageProvider::getPageParameters);
055        }
056
057        /**
058         * Wrapper for optional values that might fail if the page does not exist
059         * (i.e. session timeout).
060         */
061        protected <T> T optional(Supplier<T> function) {
062                try {
063                        return function.get();
064                } catch (Exception ex) {
065                        return null;
066                }
067        }
068
069        /**
070         * Construct.
071         *
072         * @param page
073         */
074        public PageLogData(Page page)
075        {
076                pageClass = page.getPageClass();
077                pageId = page.getPageId();
078                pageParameters = page.getPageParameters();
079                renderCount = page.getRenderCount();
080        }
081
082        /**
083         * @return pageClass
084         */
085        public final Class<? extends IRequestablePage> getPageClass()
086        {
087                return pageClass;
088        }
089
090        /**
091         * @return pageId
092         */
093        public final Integer getPageId()
094        {
095                return pageId;
096        }
097
098        /**
099         * @return pageParameters
100         */
101        public final PageParameters getPageParameters()
102        {
103                return pageParameters;
104        }
105
106        /**
107         * @return renderCount
108         */
109        public final Integer getRenderCount()
110        {
111                return renderCount;
112        }
113
114        @Override
115        public String toString()
116        {
117                StringBuilder sb = new StringBuilder("{");
118                if (pageClass != null)
119                {
120                        sb.append("pageClass=");
121                        sb.append(getPageClass().getName());
122                        sb.append(',');
123                }
124                sb.append("pageId=");
125                sb.append(getPageId());
126                sb.append(",pageParameters={");
127                sb.append(getPageParameters());
128                sb.append("},renderCount=");
129                sb.append(getRenderCount());
130                sb.append("}");
131                return sb.toString();
132        }
133}