/* (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.data.layer;
import org.apache.commons.lang.StringUtils;
import org.apache.wicket.Component;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.image.Image;
import org.apache.wicket.markup.html.link.BookmarkablePageLink;
import org.apache.wicket.markup.html.panel.Fragment;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.Model;
import org.apache.wicket.request.resource.PackageResourceReference;
import org.geoserver.catalog.DataStoreInfo;
import org.geoserver.catalog.LayerInfo;
import org.geoserver.catalog.StoreInfo;
import org.geoserver.catalog.WMSStoreInfo;
import org.geoserver.web.CatalogIconFactory;
import org.geoserver.web.ComponentAuthorizer;
import org.geoserver.web.GeoServerSecuredPage;
import org.geoserver.web.data.SelectionRemovalLink;
import org.geoserver.web.data.resource.ResourceConfigurationPage;
import org.geoserver.web.data.store.CoverageStoreEditPage;
import org.geoserver.web.data.store.DataAccessEditPage;
import org.geoserver.web.data.store.WMSStoreEditPage;
import org.geoserver.web.wicket.GeoServerDataProvider.Property;
import org.geoserver.web.wicket.GeoServerDialog;
import org.geoserver.web.wicket.GeoServerTablePanel;
import org.geoserver.web.wicket.SimpleBookmarkableLink;
import static org.geoserver.web.data.layer.LayerProvider.*;
/**
* Page listing all the available layers. Follows the usual filter/sort/page approach,
* provides ways to bulk delete layers and to add new ones
*/
@SuppressWarnings("serial")
public class LayerPage extends GeoServerSecuredPage {
LayerProvider provider = new LayerProvider();
GeoServerTablePanel<LayerInfo> table;
GeoServerDialog dialog;
SelectionRemovalLink removal;
public LayerPage() {
final CatalogIconFactory icons = CatalogIconFactory.get();
table = new GeoServerTablePanel<LayerInfo>("table", provider, true) {
@Override
protected Component getComponentForProperty(String id, IModel<LayerInfo> itemModel,
Property<LayerInfo> property) {
if(property == TYPE) {
Fragment f = new Fragment(id, "iconFragment", LayerPage.this);
f.add(new Image("layerIcon", icons.getSpecificLayerIcon(itemModel.getObject())));
return f;
} else if(property == STORE) {
return storeLink(id, itemModel);
} else if(property == NAME) {
return layerLink(id, itemModel);
} else if(property == ENABLED) {
LayerInfo layerInfo = itemModel.getObject();
// ask for enabled() instead of isEnabled() to account for disabled resource/store
boolean enabled = layerInfo.enabled();
PackageResourceReference icon = enabled? icons.getEnabledIcon() : icons.getDisabledIcon();
Fragment f = new Fragment(id, "iconFragment", LayerPage.this);
f.add(new Image("layerIcon", icon));
return f;
} else if(property == SRS) {
return new Label(id, SRS.getModel(itemModel));
} else if (property == TITLE) {
return titleLink(id, itemModel);
}
throw new IllegalArgumentException("Don't know a property named " + property.getName());
}
@Override
protected void onSelectionUpdate(AjaxRequestTarget target) {
removal.setEnabled(table.getSelection().size() > 0);
target.add(removal);
}
};
table.setOutputMarkupId(true);
add(table);
// the confirm dialog
add(dialog = new GeoServerDialog("dialog"));
setHeaderPanel(headerPanel());
}
private Component titleLink(String id, IModel<LayerInfo> itemModel) {
IModel<String> layerNameModel = (IModel<String>) NAME.getModel(itemModel);
IModel<String> layerTitleModel = (IModel<String>) TITLE.getModel(itemModel);
String layerTitle = layerTitleModel.getObject();
String layerName = layerNameModel.getObject();
String wsName = getWorkspaceNameFromLayerInfo(itemModel.getObject());
IModel linkModel = layerTitleModel;
if (StringUtils.isEmpty(layerTitle)) {
linkModel = layerNameModel;
}
return new SimpleBookmarkableLink(id, ResourceConfigurationPage.class, linkModel,
ResourceConfigurationPage.NAME, layerName, ResourceConfigurationPage.WORKSPACE, wsName);
}
protected Component headerPanel() {
Fragment header = new Fragment(HEADER_PANEL, "header", this);
// the add button
header.add(new BookmarkablePageLink<Void>("addNew", NewLayerPage.class));
// the removal button
header.add(removal = new SelectionRemovalLink("removeSelected", table, dialog));
removal.setOutputMarkupId(true);
removal.setEnabled(false);
return header;
}
private Component layerLink(String id, final IModel<LayerInfo> model) {
@SuppressWarnings("unchecked")
IModel<String> layerNameModel = (IModel<String>) NAME.getModel(model);
String wsName = getWorkspaceNameFromLayerInfo(model.getObject());
String layerName = layerNameModel.getObject();
String linkTitle = wsName + ":" + layerName;
return new SimpleBookmarkableLink(id, ResourceConfigurationPage.class, new Model<>(linkTitle),
ResourceConfigurationPage.NAME, layerName, ResourceConfigurationPage.WORKSPACE, wsName);
}
private Component storeLink(String id, final IModel<LayerInfo> model) {
@SuppressWarnings("unchecked")
IModel<String> storeModel = (IModel<String>) STORE.getModel(model);
String wsName = getWorkspaceNameFromLayerInfo(model.getObject());
String storeName = storeModel.getObject();
LayerInfo layer = model.getObject();
StoreInfo store = layer.getResource().getStore();
if(store instanceof DataStoreInfo) {
return new SimpleBookmarkableLink(id, DataAccessEditPage.class, storeModel,
DataAccessEditPage.STORE_NAME, storeName,
DataAccessEditPage.WS_NAME, wsName);
} else if (store instanceof WMSStoreInfo) {
return new SimpleBookmarkableLink(id, WMSStoreEditPage.class, storeModel,
DataAccessEditPage.STORE_NAME, storeName,
DataAccessEditPage.WS_NAME, wsName);
} else {
return new SimpleBookmarkableLink(id, CoverageStoreEditPage.class, storeModel,
DataAccessEditPage.STORE_NAME, storeName,
DataAccessEditPage.WS_NAME, wsName);
}
}
/**
* Helper to grab the workspace name from the layer info
* @param li the li
* @return the workspace name of the ws the layer belong
*/
private String getWorkspaceNameFromLayerInfo(LayerInfo li) {
return li.getResource().getStore().getWorkspace().getName();
}
@Override
protected ComponentAuthorizer getPageAuthorizer() {
return ComponentAuthorizer.WORKSPACE_ADMIN;
}
}