/* (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.importer.web;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.form.AjaxFormComponentUpdatingBehavior;
import org.apache.wicket.ajax.markup.html.AjaxLink;
import org.apache.wicket.ajax.markup.html.form.AjaxButton;
import org.apache.wicket.ajax.markup.html.form.AjaxSubmitLink;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.form.CheckBox;
import org.apache.wicket.markup.html.form.ChoiceRenderer;
import org.apache.wicket.markup.html.form.DropDownChoice;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.markup.html.form.TextField;
import org.apache.wicket.markup.html.list.ListItem;
import org.apache.wicket.markup.html.list.ListView;
import org.apache.wicket.markup.html.panel.Panel;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.Model;
import org.apache.wicket.model.PropertyModel;
import org.apache.wicket.request.mapper.parameter.PageParameters;
import org.geoserver.catalog.AttributeTypeInfo;
import org.geoserver.catalog.FeatureTypeInfo;
import org.geoserver.importer.ImportTask;
import org.geoserver.importer.transform.AttributeRemapTransform;
import org.geoserver.importer.transform.DateFormatTransform;
import org.geoserver.importer.transform.NumberFormatTransform;
import org.geoserver.importer.transform.ReprojectTransform;
import org.geoserver.importer.transform.TransformChain;
import org.geoserver.web.GeoServerSecuredPage;
import org.geoserver.web.wicket.CRSPanel;
public class ImportTaskAdvancedPage extends GeoServerSecuredPage {
CheckBox reprojectCheckBox;
ReprojectionPanel reprojectPanel;
AttributeRemappingPanel remapPanel;
public ImportTaskAdvancedPage(final IModel<ImportTask> model) {
ImportTask item = model.getObject();
//item.getTransform().get
Form form = new Form("form");
add(form);
ReprojectTransform reprojectTx =
(ReprojectTransform) item.getTransform().get(ReprojectTransform.class);
reprojectCheckBox = new CheckBox("enableReprojection", new Model(reprojectTx != null));
reprojectCheckBox.add(new AjaxFormComponentUpdatingBehavior("click") {
@Override
protected void onUpdate(AjaxRequestTarget target) {
reprojectPanel.setEnabled(reprojectCheckBox.getModelObject());
target.add(reprojectPanel);
}
});
form.add(reprojectCheckBox);
if (reprojectTx == null) {
reprojectTx = new ReprojectTransform(null);
reprojectTx.setSource(item.getLayer().getResource().getNativeCRS());
}
reprojectPanel = new ReprojectionPanel("reprojection", reprojectTx);
reprojectPanel.setOutputMarkupId(true);
reprojectPanel.setEnabled(false);
form.add(reprojectPanel);
remapPanel = new AttributeRemappingPanel("remapping", model);
form.add(remapPanel);
form.add(new AjaxSubmitLink("save") {
@Override
protected void onSubmit(AjaxRequestTarget target, Form<?> form) {
ImportTask task = model.getObject();
TransformChain txChain = task.getTransform();
//reprojection
txChain.removeAll(ReprojectTransform.class);
if (reprojectCheckBox.getModelObject()) {
txChain.add(reprojectPanel.getTransform());
}
//remaps
txChain.removeAll(AttributeRemapTransform.class);
txChain.getTransforms().addAll(remapPanel.remaps);
ImporterWebUtils.importer().changed(task);
PageParameters pp = new PageParameters().add("id", task.getContext().getId());
setResponsePage(ImportPage.class, pp);
}
});
form.add(new AjaxLink("cancel") {
@Override
public void onClick(AjaxRequestTarget target) {
ImportTask task = model.getObject();
PageParameters pp = new PageParameters().add("id", task.getContext().getId());
setResponsePage(ImportPage.class, pp);
}
});
}
static class ReprojectionPanel extends Panel {
ReprojectTransform transform;
public ReprojectionPanel(String id, ReprojectTransform transform) {
super(id);
this.transform = transform;
add(new CRSPanel("from", new PropertyModel(transform, "source")));
add(new CRSPanel("to", new PropertyModel(transform, "target")));
}
public ReprojectTransform getTransform() {
return transform;
}
}
static class AttributeRemappingPanel extends Panel {
List<AttributeRemapTransform> remaps;
ListView<AttributeRemapTransform> remapList;
public AttributeRemappingPanel(String id, IModel<ImportTask> itemModel) {
super(id, itemModel);
setOutputMarkupId(true);
FeatureTypeInfo featureType =
(FeatureTypeInfo) itemModel.getObject().getLayer().getResource();
final List atts = new ArrayList();
for (AttributeTypeInfo at : featureType.getAttributes()) {
atts.add(at.getName());
}
final List<Class> types = (List) Arrays.asList(Integer.class, Double.class, Date.class);
final WebMarkupContainer remapContainer = new WebMarkupContainer("remapsContainer");
remapContainer.setOutputMarkupId(true);
add(remapContainer);
remaps =
itemModel.getObject().getTransform().getAll(AttributeRemapTransform.class);
remapList = new ListView<AttributeRemapTransform>("remaps", remaps) {
@Override
protected void populateItem(final ListItem<AttributeRemapTransform> item) {
final DropDownChoice<String> attChoice = new DropDownChoice<String>("att",
new PropertyModel(item.getModel(), "field"), atts);
item.add(attChoice);
final DropDownChoice<Class> typeChoice = new DropDownChoice<Class>("type",
new PropertyModel(item.getModel(), "type"), types, new ChoiceRenderer<Class>() {
public Object getDisplayValue(Class object) {
return object.getSimpleName();
}
});
item.add(typeChoice);
final TextField<String> dateFormatTextField = new TextField<String>("dateFormat", new Model());
dateFormatTextField.setOutputMarkupId(true);
item.add(dateFormatTextField);
typeChoice.add(new AjaxFormComponentUpdatingBehavior("change") {
@Override
protected void onUpdate(AjaxRequestTarget target) {
dateFormatTextField.setEnabled(
Date.class.equals(typeChoice.getModelObject()));
target.add(dateFormatTextField);
}
});
//dateFormatTextField.setVisible(false);
item.add(new AjaxButton("apply") {
@Override
protected void onSubmit(AjaxRequestTarget target, Form<?> form) {
attChoice.processInput();
typeChoice.processInput();
dateFormatTextField.processInput();
AttributeRemapTransform tx = item.getModelObject();
String field = tx.getField();
Class type = typeChoice.getModelObject();
if (Date.class.equals(type)) {
String dateFormat = dateFormatTextField.getModelObject();
if (dateFormat == null || "".equals(dateFormat.trim())) {
dateFormat = null;
}
item.setModelObject(new DateFormatTransform(field, dateFormat));
}
else if (Number.class.isAssignableFrom(type)) {
item.setModelObject(new NumberFormatTransform(field, type));
}
target.add(remapContainer);
}
}.setDefaultFormProcessing(false));
item.add(new AjaxButton("cancel") {
@Override
protected void onSubmit(AjaxRequestTarget target, Form<?> form) {
remaps.remove(item.getModelObject());
target.add(remapContainer);
}
}.setDefaultFormProcessing(false));
}
};
remapList.setOutputMarkupId(true);
remapContainer.add(remapList);
add(new AjaxLink<ImportTask>("add", itemModel) {
@Override
public void onClick(AjaxRequestTarget target) {
ImportTask task = getModelObject();
remaps.add(new AttributeRemapTransform(null, null));
target.add(remapContainer);
}
});
}
}
}