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.devutils.inspector;
018
019import java.io.Serializable;
020import java.text.SimpleDateFormat;
021import java.util.ArrayList;
022import java.util.List;
023
024import org.apache.wicket.Application;
025import org.apache.wicket.devutils.DevUtilsPage;
026import org.apache.wicket.markup.html.WebMarkupContainer;
027import org.apache.wicket.markup.html.basic.Label;
028import org.apache.wicket.markup.html.image.NonCachingImage;
029import org.apache.wicket.markup.html.list.ListItem;
030import org.apache.wicket.markup.html.list.PageableListView;
031import org.apache.wicket.markup.html.navigation.paging.PagingNavigator;
032import org.apache.wicket.model.IModel;
033import org.apache.wicket.model.Model;
034import org.apache.wicket.protocol.http.IRequestLogger;
035import org.apache.wicket.protocol.http.IRequestLogger.RequestData;
036import org.apache.wicket.protocol.http.IRequestLogger.SessionData;
037import org.apache.wicket.protocol.http.RequestLogger;
038import org.apache.wicket.protocol.http.WebApplication;
039import org.apache.wicket.util.lang.Bytes;
040
041/**
042 * @author jcompagner
043 */
044public class RequestsPage extends DevUtilsPage
045{
046        private static final long serialVersionUID = 1L;
047        private final SimpleDateFormat sdf = new SimpleDateFormat("dd MMM hh:mm:ss.SSS");
048
049        /**
050         * Construct.
051         * 
052         * @param sessionData
053         */
054        public RequestsPage(final SessionData sessionData)
055        {
056                add(new NonCachingImage("bug"));
057                if (sessionData == null)
058                {
059                        add(new Label("id").setVisible(false));
060                        add(new Label("sessionInfo").setVisible(false));
061                        add(new Label("startDate").setVisible(false));
062                        add(new Label("lastRequestTime").setVisible(false));
063                        add(new Label("numberOfRequests").setVisible(false));
064                        add(new Label("totalTimeTaken").setVisible(false));
065                        add(new Label("size").setVisible(false));
066                        add(new WebMarkupContainer("sessionid"));
067                }
068                else
069                {
070                        add(new Label("id", new Model<>(sessionData.getSessionId())));
071                        add(new Label("sessionInfo", new Model<>(
072                                (Serializable)sessionData.getSessionInfo())));
073                        add(new Label("startDate", new Model<>(sdf.format(sessionData.getStartDate()))));
074                        add(new Label("lastRequestTime", new Model<>(
075                                sdf.format(sessionData.getLastActive()))));
076                        add(new Label("numberOfRequests", new Model<>(sessionData.getNumberOfRequests())));
077                        add(new Label("totalTimeTaken", new Model<>(sessionData.getTotalTimeTaken())));
078                        add(new Label("size", new Model<>(Bytes.bytes(sessionData.getSessionSize()))));
079                        add(new WebMarkupContainer("sessionid").setVisible(false));
080                }
081
082                IModel<List<RequestData>> requestsModel = new IModel<List<RequestData>>()
083                {
084                        private static final long serialVersionUID = 1L;
085
086                        @Override
087                        public ArrayList<RequestData> getObject()
088                        {
089                                List<RequestData> requests = getRequestLogger().getRequests();
090                                if (sessionData != null)
091                                {
092                                        ArrayList<RequestData> returnValues = new ArrayList<>();
093                                        for (RequestData data : requests)
094                                        {
095                                                if (sessionData.getSessionId().equals(data.getSessionId()))
096                                                {
097                                                        returnValues.add(data);
098                                                }
099                                        }
100                                        return returnValues;
101                                }
102                                return new ArrayList<>(requests);
103                        }
104                };
105                PageableListView<RequestData> listView = new PageableListView<RequestData>("requests",
106                        requestsModel, 50)
107                {
108                        private static final long serialVersionUID = 1L;
109
110                        @Override
111                        protected void populateItem(final ListItem<RequestData> item)
112                        {
113                                RequestData rd = item.getModelObject();
114                                item.add(new Label("id", new Model<>(rd.getSessionId())).setVisible(sessionData == null));
115                                item.add(new Label("startDate", new Model<>(sdf.format(rd.getStartDate()))));
116                                item.add(new Label("timeTaken", new Model<>(rd.getTimeTaken())));
117                                String eventTarget = rd.getEventTarget() != null ? rd.getEventTarget()
118                                        .getClass()
119                                        .getName() : "";
120                                item.add(new Label("eventTarget", new Model<>(eventTarget)));
121                                String responseTarget = rd.getResponseTarget() != null ? rd.getResponseTarget()
122                                        .getClass()
123                                        .getName() : "";
124                                item.add(new Label("responseTarget", new Model<>(responseTarget)));
125                                item.add(new Label("alteredObjects", new Model<>(rd.getAlteredObjects())).setEscapeModelStrings(false));
126                                item.add(new Label("sessionSize", new Model<>(Bytes.bytes(rd.getSessionSize()))));
127                        }
128                };
129                add(listView);
130
131                PagingNavigator navigator = new PagingNavigator("navigator", listView);
132                add(navigator);
133        }
134
135        IRequestLogger getRequestLogger()
136        {
137                WebApplication webApplication = (WebApplication)Application.get();
138
139                IRequestLogger requestLogger = webApplication.getRequestLogger();
140
141                if (webApplication.getRequestLogger() == null)
142                        requestLogger = new RequestLogger();
143                return requestLogger;
144        }
145}