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.pagestore.browser;
018
019import java.time.Duration;
020import java.util.ArrayList;
021import java.util.List;
022import java.util.Optional;
023import org.apache.wicket.PageReference;
024import org.apache.wicket.ajax.AbstractAjaxTimerBehavior;
025import org.apache.wicket.ajax.AjaxRequestTarget;
026import org.apache.wicket.ajax.form.AjaxFormComponentUpdatingBehavior;
027import org.apache.wicket.ajax.markup.html.AjaxFallbackLink;
028import org.apache.wicket.devutils.inspector.InspectorPage;
029import org.apache.wicket.extensions.markup.html.repeater.data.grid.ICellPopulator;
030import org.apache.wicket.extensions.markup.html.repeater.data.table.AbstractColumn;
031import org.apache.wicket.extensions.markup.html.repeater.data.table.DataTable;
032import org.apache.wicket.extensions.markup.html.repeater.data.table.DefaultDataTable;
033import org.apache.wicket.extensions.markup.html.repeater.data.table.IColumn;
034import org.apache.wicket.extensions.markup.html.repeater.data.table.PropertyColumn;
035import org.apache.wicket.markup.ComponentTag;
036import org.apache.wicket.markup.MarkupStream;
037import org.apache.wicket.markup.html.basic.Label;
038import org.apache.wicket.markup.html.form.DropDownChoice;
039import org.apache.wicket.markup.html.link.Link;
040import org.apache.wicket.markup.html.panel.GenericPanel;
041import org.apache.wicket.markup.repeater.Item;
042import org.apache.wicket.model.IModel;
043import org.apache.wicket.model.Model;
044import org.apache.wicket.pageStore.DefaultPageContext;
045import org.apache.wicket.pageStore.IPageContext;
046import org.apache.wicket.pageStore.IPersistedPage;
047import org.apache.wicket.pageStore.IPersistentPageStore;
048
049/**
050 * A panel that shows data about {@link IPersistedPage}s in an {@link IPersistentPageStore}.
051 */
052public class PersistedPanel extends GenericPanel<IPersistentPageStore>
053{
054
055        /**
056         * Construct.
057         * 
058         * @param id
059         *            the component id
060         */
061        public PersistedPanel(String id, IModel<IPersistentPageStore> store)
062        {
063                super(id, store);
064
065                final Label storeLabel = new Label("store", () -> {
066                        IPersistentPageStore s = getModelObject();
067                        
068                        if (s == null) {
069                                return "N/A";
070                        }
071                        
072                        return String.format("%s - %s", s.getClass().getName(), s.getTotalSize());
073                });
074                storeLabel.setOutputMarkupId(true);
075                add(storeLabel);
076                
077                final DropDownChoice<String> sessionsSelector = createSessionsSelector("sessions");
078                sessionsSelector.setOutputMarkupId(true);
079                add(sessionsSelector);
080
081                final DataTable<IPersistedPage, String> table = createTable("table", sessionsSelector.getModel());
082                table.setOutputMarkupId(true);
083                add(table);
084
085                AjaxFallbackLink<Void> refreshLink = new AjaxFallbackLink<Void>("refresh")
086                {
087                        @Override
088                        public void onClick(Optional<AjaxRequestTarget> targetOptional)
089                        {
090                                targetOptional.ifPresent(target -> target.add(table));
091                        }
092                };
093                add(refreshLink);
094
095                AjaxFallbackLink<Void> currentSessionLink = new AjaxFallbackLink<Void>("currentSessionLink")
096                {
097                        @Override
098                        public void onClick(Optional<AjaxRequestTarget> targetOptional)
099                        {
100                                sessionsSelector.setModelObject(getCurrentSessionIdentifier());
101                                targetOptional.ifPresent(target -> target.add(sessionsSelector, table));
102                        }
103
104                        @Override
105                        public boolean isVisible()
106                        {
107                                return PersistedPanel.this.getSession().isTemporary() == false;
108                        }
109                };
110                currentSessionLink.setOutputMarkupPlaceholderTag(true);
111                add(currentSessionLink);
112
113                sessionsSelector.add(new AjaxFormComponentUpdatingBehavior("change")
114                {
115                        @Override
116                        protected void onUpdate(AjaxRequestTarget target)
117                        {
118                                target.add(storeLabel);
119                                target.add(sessionsSelector);
120                                target.add(table);
121                        }
122                });
123
124                add(new AbstractAjaxTimerBehavior(Duration.ofSeconds(5)) {
125
126                        @Override
127                        protected void onTimer(AjaxRequestTarget target)
128                        {
129                                target.add(storeLabel);
130                                target.add(table);
131                        }
132                });
133        }
134
135        private DropDownChoice<String> createSessionsSelector(String id)
136        {
137                DropDownChoice<String> sessionsSelector = new DropDownChoice<String>("sessions",
138                        Model.of(getCurrentSessionIdentifier()), new SessionIdentifiersModel(getModel()));
139
140                return sessionsSelector;
141        }
142
143        private String getCurrentSessionIdentifier()
144        {
145                IPersistentPageStore store = getModelObject();
146                if (store == null) {
147                        return null;
148                }
149
150                IPageContext context = new DefaultPageContext();
151                
152                return store.getSessionIdentifier(context);
153        }
154
155        private DataTable<IPersistedPage, String> createTable(String id, IModel<String> sessionId)
156        {
157                PersistedPagesProvider provider = new PersistedPagesProvider(sessionId, getModel());
158
159                List<IColumn<IPersistedPage, String>> columns = new ArrayList<>();
160
161                columns.add(new AbstractColumn<IPersistedPage, String>(Model.of("Id"), "pageId")
162                {
163                        @Override
164                        public void populateItem(Item<ICellPopulator<IPersistedPage>> cellItem, String componentId, IModel<IPersistedPage> rowModel)
165                        {
166                                cellItem.add(new Link<IPersistedPage>(componentId, rowModel)
167                                {
168                                        @Override
169                                        protected void onComponentTag(ComponentTag tag)
170                                        {
171                                                tag.setName("a");
172                                                
173                                                super.onComponentTag(tag);
174                                        }
175                                        
176                                        @Override
177                                        public void onComponentTagBody(MarkupStream markupStream, ComponentTag openTag)
178                                        {
179                                                replaceComponentTagBody(markupStream, openTag, "" + getModelObject().getPageId());
180                                        }
181                                        
182                                        @Override
183                                        public void onClick()
184                                        {
185                                                setResponsePage(new InspectorPage(new PageReference(getModelObject().getPageId())));
186                                        }
187                                });
188                        }
189                });
190                columns.add(new PropertyColumn<>(Model.of("Type"), "pageType", "pageType"));
191                columns.add(new PropertyColumn<>(Model.of("Size"), "pageSize", "pageSize"));
192
193                DefaultDataTable<IPersistedPage, String> browserTable = new DefaultDataTable<>(id, columns, provider, 20);
194                browserTable.setOutputMarkupId(true);
195
196                return browserTable;
197        }
198
199}