/* (c) 2014 - 2016 Open Source Geospatial Foundation - all rights reserved * (c) 2001 - 2013 OpenPlans * This code is licensed under the GPL 2.0 license, available at the root * application directory. */ package org.geoserver.web; import static org.geoserver.catalog.Predicates.acceptAll; import java.text.NumberFormat; import java.util.HashMap; import java.util.List; import org.apache.wicket.Component; import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.markup.html.link.BookmarkablePageLink; import org.apache.wicket.markup.html.link.ExternalLink; import org.apache.wicket.markup.html.list.ListItem; import org.apache.wicket.markup.html.list.ListView; import org.apache.wicket.markup.html.panel.Fragment; import org.apache.wicket.model.IModel; import org.apache.wicket.model.LoadableDetachableModel; import org.apache.wicket.model.Model; import org.apache.wicket.model.ResourceModel; import org.apache.wicket.model.StringResourceModel; import org.geoserver.catalog.Catalog; import org.geoserver.catalog.LayerInfo; import org.geoserver.catalog.StoreInfo; import org.geoserver.catalog.WorkspaceInfo; import org.geoserver.config.ContactInfo; import org.geoserver.config.GeoServer; import org.geoserver.config.ServiceInfo; import org.geoserver.platform.GeoServerExtensions; import org.geoserver.security.GeoServerSecurityManager; import org.geoserver.web.data.layer.LayerPage; import org.geoserver.web.data.layer.NewLayerPage; import org.geoserver.web.data.store.NewDataPage; import org.geoserver.web.data.store.StorePage; import org.geoserver.web.data.workspace.WorkspaceNewPage; import org.geoserver.web.data.workspace.WorkspacePage; import org.opengis.filter.Filter; import org.springframework.security.core.Authentication; import com.google.common.base.Stopwatch; /** * Home page, shows just the introduction and the capabilities link * * <p> * This page uses the {@link CapabilitiesHomePageLinkProvider} extension point to enable other * modules to contribute links for GetCapabilities documents. The default * {@link ServiceInfoCapabilitiesProvider} contributes the capabilities links for all the available * {@link ServiceInfo} implementations. Other extension point implementations may contribute service * description document links non backed by ServiceInfo objects. * </p> * * @author Andrea Aime - TOPP * */ public class GeoServerHomePage extends GeoServerBasePage implements GeoServerUnlockablePage { @SuppressWarnings({ "rawtypes", "unchecked" }) public GeoServerHomePage() { GeoServer gs = getGeoServer(); ContactInfo contact = gs.getGlobal().getSettings().getContact(); //add some contact info add(new ExternalLink("contactURL", contact.getOnlineResource()) .add( new Label("contactName", contact.getContactOrganization()))); { String version = String.valueOf(new ResourceModel("version").getObject()); String contactEmail = contact.getContactEmail(); HashMap<String, String>params = new HashMap<String, String>(); params.put("version", version); params.put("contactEmail", (contactEmail == null ? "geoserver@example.org" : contactEmail)); Label label = new Label("footerMessage", new StringResourceModel("GeoServerHomePage.footer", this, new Model(params))); label.setEscapeModelStrings(false); add(label); } Authentication auth = getSession().getAuthentication(); if(isAdmin(auth)) { Stopwatch sw = Stopwatch.createStarted(); Fragment f = new Fragment("catalogLinks", "catalogLinksFragment", this); Catalog catalog = getCatalog(); NumberFormat numberFormat = NumberFormat.getIntegerInstance(getLocale()); numberFormat.setGroupingUsed(true); final Filter allLayers = acceptAll(); final Filter allStores = acceptAll(); final Filter allWorkspaces = acceptAll(); final int layerCount = catalog.count(LayerInfo.class, allLayers); final int storesCount = catalog.count(StoreInfo.class, allStores); final int wsCount = catalog.count(WorkspaceInfo.class, allWorkspaces); f.add(new BookmarkablePageLink("layersLink", LayerPage.class) .add(new Label( "nlayers", numberFormat.format(layerCount) ))); f.add(new BookmarkablePageLink("addLayerLink", NewLayerPage.class)); f.add(new BookmarkablePageLink("storesLink",StorePage.class) .add(new Label( "nstores", numberFormat.format(storesCount) ))); f.add(new BookmarkablePageLink("addStoreLink", NewDataPage.class)); f.add(new BookmarkablePageLink("workspacesLink",WorkspacePage.class) .add(new Label( "nworkspaces", numberFormat.format(wsCount) ))); f.add(new BookmarkablePageLink("addWorkspaceLink", WorkspaceNewPage.class)); add(f); sw.stop(); } else { Label placeHolder = new Label("catalogLinks"); placeHolder.setVisible(false); add(placeHolder); } final IModel<List<GeoServerHomePageContentProvider>> contentProviders; contentProviders = getContentProviders(GeoServerHomePageContentProvider.class); ListView<GeoServerHomePageContentProvider> contentView = new ListView<GeoServerHomePageContentProvider>( "contributedContent", contentProviders) { private static final long serialVersionUID = 1L; @Override protected void populateItem(ListItem<GeoServerHomePageContentProvider> item) { GeoServerHomePageContentProvider provider = item.getModelObject(); Component extraContent = provider.getPageBodyComponent("contentList"); if(null == extraContent){ Label placeHolder = new Label("contentList"); placeHolder.setVisible(false); extraContent = placeHolder; } item.add(extraContent); } }; add(contentView); final IModel<List<CapabilitiesHomePageLinkProvider>> capsProviders; capsProviders = getContentProviders(CapabilitiesHomePageLinkProvider.class); ListView<CapabilitiesHomePageLinkProvider> capsView = new ListView<CapabilitiesHomePageLinkProvider>( "providedCaps", capsProviders) { private static final long serialVersionUID = 1L; @Override protected void populateItem(ListItem<CapabilitiesHomePageLinkProvider> item) { CapabilitiesHomePageLinkProvider provider = item.getModelObject(); Component capsList = provider.getCapabilitiesComponent("capsList"); item.add(capsList); } }; add(capsView); } private <T> IModel<List<T>> getContentProviders(final Class<T> providerClass) { IModel<List<T>> providersModel = new LoadableDetachableModel<List<T>>() { private static final long serialVersionUID = 1L; @Override protected List<T> load() { GeoServerApplication app = getGeoServerApplication(); List<T> providers = app.getBeansOfType(providerClass); return providers; } }; return providersModel; } /** * Checks if the current user is authenticated and is the administrator */ private boolean isAdmin(Authentication authentication) { return GeoServerExtensions.bean(GeoServerSecurityManager.class). checkAuthenticationForAdminRole(authentication); } }