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}