/* Copyright (c) 2001 - 2009 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.data.store.aggregate;
import static org.geotools.data.aggregate.AggregatingDataStoreFactory.*;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.logging.Logger;
import org.apache.wicket.AttributeModifier;
import org.apache.wicket.Component;
import org.apache.wicket.ResourceReference;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.IAjaxCallDecorator;
import org.apache.wicket.ajax.calldecorator.AjaxPreprocessingCallDecorator;
import org.apache.wicket.ajax.markup.html.AjaxLink;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.PropertyModel;
import org.geoserver.web.GeoServerApplication;
import org.geoserver.web.data.store.StoreEditPanel;
import org.geoserver.web.data.store.panel.CheckBoxParamPanel;
import org.geoserver.web.data.store.panel.TextParamPanel;
import org.geoserver.web.util.MapModel;
import org.geoserver.web.wicket.GeoServerDataProvider.Property;
import org.geoserver.web.wicket.GeoServerTablePanel;
import org.geoserver.web.wicket.ImageAjaxLink;
import org.geoserver.web.wicket.ParamResourceModel;
import org.geoserver.web.wicket.SimpleAjaxLink;
import org.geotools.data.aggregate.AggregateTypeConfiguration;
import org.geotools.data.aggregate.AggregatingDataStoreFactory;
import org.geotools.util.logging.Logging;
/**
* Provides the form components for the shapefile datastore
*
* @author Andrea Aime - GeoSolution
*/
@SuppressWarnings("serial")
public class AggregateStoreEditPanel extends StoreEditPanel {
private static final Logger LOGGER = Logging.getLogger(AggregateStoreEditPanel.class);
private List<AggregateTypeConfiguration> configs;
private GeoServerTablePanel<AggregateTypeConfiguration> configTable;
private ConfigModel configModel;
public AggregateStoreEditPanel(final String componentId, final Form storeEditForm) {
super(componentId, storeEditForm);
final IModel model = storeEditForm.getModel();
setDefaultModel(model);
final IModel paramsModel = new PropertyModel(model, "connectionParameters");
new MapModel(paramsModel, CONFIGURATION.key).setObject(null);
add(new TextParamPanel("parallelism", new MapModel(paramsModel, PARALLELISM.key),
new ParamResourceModel("parallelism", this), true));
add(new CheckBoxParamPanel("tolerateErrors", new MapModel(paramsModel,
TOLERATE_CONNECTION_FAILURE.key), new ParamResourceModel("tolerateErrors", this)));
configModel = new ConfigModel(new MapModel(paramsModel, CONFIGURATION_XML.key));
configs = configModel.getObject();
if(configs == null) {
configs = new ArrayList<AggregateTypeConfiguration>();
configModel.setObject(configs);
}
configTable = new GeoServerTablePanel<AggregateTypeConfiguration>(
"configTable", new ConfigurationListProvider(configs)) {
@Override
protected Component getComponentForProperty(String id, IModel itemModel,
Property<AggregateTypeConfiguration> property) {
if (property == ConfigurationListProvider.NAME) {
return editLink(id, itemModel);
} else if (property == ConfigurationListProvider.SOURCES) {
return new Label(id, property.getModel(itemModel));
} else if(property == ConfigurationListProvider.REMOVE) {
return removeLink(id, itemModel);
} else {
return null;
}
}
};
configTable.setPageable(false);
configTable.setFilterable(false);
configTable.setOutputMarkupId(true);
add(configTable);
add(addNewLink());
}
protected Component addNewLink() {
AjaxLink<Void> link = new AjaxLink<Void>("addNew") {
@Override
public void onClick(AjaxRequestTarget target) {
setResponsePage(new ConfigNewPage(AggregateStoreEditPanel.this));
}
};
return link;
}
protected Component editLink(String id, IModel itemModel) {
SimpleAjaxLink link = new SimpleAjaxLink(id, itemModel, new PropertyModel<String>(itemModel, "name")) {
@Override
protected void onClick(AjaxRequestTarget target) {
setResponsePage(new ConfigEditPage(AggregateStoreEditPanel.this, (AggregateTypeConfiguration) getModelObject()));
}
};
return link;
}
Component removeLink(String id, IModel itemModel) {
final AggregateTypeConfiguration entry = (AggregateTypeConfiguration) itemModel.getObject();
ImageAjaxLink link = new ImageAjaxLink( id, new ResourceReference( GeoServerApplication.class, "img/icons/silk/delete.png") ) {
@Override
protected void onClick(AjaxRequestTarget target) {
configs.remove( entry );
target.addComponent( configTable );
}
@Override
protected IAjaxCallDecorator getAjaxCallDecorator() {
return new AjaxPreprocessingCallDecorator(null) {
@Override
public CharSequence preDecorateScript(CharSequence script) {
String msg = new ParamResourceModel("confirmTypeRemoval",
AggregateStoreEditPanel.this, entry.getName()).getString();
return "if(!confirm('" + msg +"')) return false;" + script;
}
};
}
};
link.getImage().add(new AttributeModifier("alt", true, new ParamResourceModel("AggregateStoreEditPanel.th.remove", link)));
return link;
}
@Override
public boolean onSave() {
configModel.setObject(configs);
return true;
}
class ConfigModel implements IModel<List<AggregateTypeConfiguration>> {
IModel model;
public ConfigModel(IModel model) {
this.model = model;
}
@Override
public void detach() {
model.detach();
}
@Override
public List<AggregateTypeConfiguration> getObject() {
String xml = (String) model.getObject();
try {
return new AggregatingDataStoreFactory().parseConfiguration(xml);
} catch (IOException e) {
return Collections.emptyList();
}
}
@Override
public void setObject(List<AggregateTypeConfiguration> configs) {
try {
String xml = new AggregatingDataStoreFactory().encodeConfiguration(configs);
model.setObject(xml);
} catch (IOException e) {
throw new RuntimeException("Failed to encode the configurations back to xml");
}
}
}
public void addConfiguration(AggregateTypeConfiguration config) {
configs.add(config);
}
}