/* Copyright (c) 2001 - 2008 TOPP - www.openplans.org. All rights reserved.
* This code is licensed under the GPL 2.0 license, available at the root
* application directory.
*/
package org.geoserver.web.importer;
import static org.geoserver.web.importer.ImportSummaryProvider.*;
import java.util.logging.Level;
import org.apache.wicket.AttributeModifier;
import org.apache.wicket.Component;
import org.apache.wicket.Page;
import org.apache.wicket.PageParameters;
import org.apache.wicket.ResourceReference;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.behavior.AttributeAppender;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.image.Image;
import org.apache.wicket.markup.html.link.ExternalLink;
import org.apache.wicket.markup.html.link.Link;
import org.apache.wicket.markup.html.panel.Fragment;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.Model;
import org.geoserver.catalog.CascadeDeleteVisitor;
import org.geoserver.catalog.Catalog;
import org.geoserver.catalog.FeatureTypeInfo;
import org.geoserver.catalog.LayerInfo;
import org.geoserver.catalog.StoreInfo;
import org.geoserver.catalog.WorkspaceInfo;
import org.geoserver.importer.ImportStatus;
import org.geoserver.importer.ImportSummary;
import org.geoserver.importer.LayerSummary;
import org.geoserver.web.CatalogIconFactory;
import org.geoserver.web.GeoServerSecuredPage;
import org.geoserver.web.data.resource.ResourceConfigurationPage;
import org.geoserver.web.demo.PreviewLayer;
import org.geoserver.web.wicket.ConfirmationAjaxLink;
import org.geoserver.web.wicket.GeoServerTablePanel;
import org.geoserver.web.wicket.ParamResourceModel;
import org.geoserver.web.wicket.GeoServerDataProvider.Property;
import org.opengis.feature.type.GeometryDescriptor;
/**
* Reports the import results in a table and allows the user to
* edit the and to preview the layers
* @author aaime
*
*/
@SuppressWarnings("serial")
public class ImportSummaryPage extends GeoServerSecuredPage {
public ImportSummaryPage(final ImportSummary summary) {
// the synthetic results
IModel summaryMessage;
Exception error = summary.getError();
if(error != null) {
String errorSummary = error.getClass().getSimpleName() + ", " + error.getMessage();
summaryMessage = new ParamResourceModel("summaryError", this, errorSummary);
} else if(summary.getProcessedLayers() == 0) {
summaryMessage = new ParamResourceModel("summaryCancelled", this);
} else {
if(summary.getFailures() > 0) {
if(summary.isCompleted()) {
summaryMessage = new ParamResourceModel("summaryFailures", this, summary.getTotalLayers(), summary.getFailures());
} else {
summaryMessage = new ParamResourceModel("summaryPartialFailures", this, summary.getTotalLayers(),
summary.getProcessedLayers(), summary.getFailures());
}
} else {
if(summary.isCompleted()) {
summaryMessage = new ParamResourceModel("summarySuccess", this, summary.getTotalLayers());
} else {
summaryMessage = new ParamResourceModel("summaryPartialSuccess", this, summary.getTotalLayers(),
summary.getProcessedLayers());
}
}
}
add(new Label("summary", summaryMessage));
// the list of imported layers
GeoServerTablePanel<LayerSummary> table = new GeoServerTablePanel<LayerSummary>("importSummary", new ImportSummaryProvider(
summary.getLayers())) {
@Override
protected Component getComponentForProperty(String id, IModel itemModel,
Property<LayerSummary> property) {
final LayerSummary layerSummary = (LayerSummary) itemModel.getObject();
final CatalogIconFactory icons = CatalogIconFactory.get();
LayerInfo layer = layerSummary.getLayer();
if(property == LAYER) {
Fragment f = new Fragment(id, "edit", ImportSummaryPage.this);
Link editLink = editLink(layerSummary);
editLink.setEnabled(layer != null);
f.add(editLink);
return f;
} else if(property == STATUS) {
ResourceReference icon = layerSummary.getStatus().successful() ?
icons.getEnabledIcon() : icons.getDisabledIcon();
Fragment f = new Fragment(id, "iconFragment", ImportSummaryPage.this);
f.add(new Image("icon", icon));
return f;
} else if(property == TYPE) {
if(layer != null) {
ResourceReference icon = icons.getSpecificLayerIcon(layer);
Fragment f = new Fragment(id, "iconFragment", ImportSummaryPage.this);
Image image = new Image("icon", icon);
image.add(new AttributeModifier("title", true, new Model(getTypeTooltip(layer))));
f.add(image);
return f;
} else {
return new Label(id, "");
}
} else if(property == COMMANDS) {
Fragment f = new Fragment(id, "preview", ImportSummaryPage.this);
ExternalLink link = new ExternalLink("preview", "#");
if(layerSummary.getStatus().successful()) {
// TODO: move the preview link generation ability to some utility object
PreviewLayer preview = new PreviewLayer(layer);
String url = "window.open(\"" + preview.getWmsLink() + "&format=application/openlayers\")";
link.add(new AttributeAppender("onclick", new Model(url), ";"));
} else {
link.setEnabled(false);
}
f.add(link);
return f;
}
return null;
}
};
table.setOutputMarkupId(true);
table.setFilterable(false);
add(table);
// the rollback command
add(new ConfirmationAjaxLink("rollback", null,
new ParamResourceModel("rollback", this),
new ParamResourceModel("confirmRollback", this)) {
@Override
protected void onClick(AjaxRequestTarget target) {
Catalog catalog = getCatalog();
CascadeDeleteVisitor deleteVisitor = new CascadeDeleteVisitor(catalog);
String project = summary.getProject();
if(summary.isWorkspaceNew()) {
WorkspaceInfo ws = catalog.getWorkspaceByName(project);
if(ws != null)
ws.accept(deleteVisitor);
} else if(summary.isStoreNew()) {
StoreInfo si = catalog.getStoreByName(project, project, StoreInfo.class);
if(si != null)
si.accept(deleteVisitor);
} else {
// just remove the layers we created
for (LayerSummary layer : summary.getLayers()) {
catalog.remove(layer.getLayer());
catalog.remove(layer.getLayer().getResource());
}
}
setResponsePage(ImportPage.class, new PageParameters("afterCleanup=true"));
}
});
}
Link editLink(final LayerSummary layerSummary) {
Link link = new Link("edit") {
@Override
public void onClick() {
Page p = new ResourceConfigurationPage(layerSummary.getLayer(), true) {
@Override
protected void onSuccessfulSave() {
setResponsePage(ImportSummaryPage.this);
layerSummary.setStatus(ImportStatus.SUCCESS);
}
@Override
protected void onCancel() {
setResponsePage(ImportSummaryPage.this);
}
};
setResponsePage(p);
}
};
// keep the last modified name if possible
String name;
if(layerSummary.getLayer() != null)
name = layerSummary.getLayer().getName();
else
name = layerSummary.getLayerName();
link.add(new Label("name", name));
// also set a tooltip explaining what this action does
link.add(new AttributeModifier("title", true, new ParamResourceModel("edit", this, name)));
return link;
}
String getTypeTooltip(LayerInfo layer) {
try {
String type = null;
FeatureTypeInfo fti = (FeatureTypeInfo) layer.getResource();
GeometryDescriptor gd = fti.getFeatureType().getGeometryDescriptor();
if(gd != null) {
type = gd.getType().getBinding().getSimpleName();
}
if(type != null)
return new ParamResourceModel("geomtype." + type, ImportSummaryPage.this).getString();
else
return "geomtype.null";
} catch(Exception e) {
LOGGER.log(Level.WARNING, "Could not compute the geom type tooltip", e);
return "geomtype.error";
}
}
}