Skip to content

Commit

Permalink
[GEOS-8237] UI page table contents get ruined once page is serialized…
Browse files Browse the repository at this point in the history
… and read back
  • Loading branch information
aaime committed Jul 28, 2017
1 parent 15eff2c commit 087759e
Show file tree
Hide file tree
Showing 4 changed files with 73 additions and 18 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@
import org.apache.wicket.markup.html.panel.Fragment;
import org.apache.wicket.markup.repeater.ReuseIfModelsEqualStrategy;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.LoadableDetachableModel;
import org.apache.wicket.model.PropertyModel;
import org.apache.wicket.validation.IValidatable;
import org.apache.wicket.validation.IValidator;
Expand Down Expand Up @@ -158,8 +159,13 @@ class Editor extends FormComponentPanel<DefaultValueConfigurations> {
public Editor(String id, final Collection<String> enabledDimensionNames,
IModel<DefaultValueConfigurations> model) {
super(id, model);
List<Property<DefaultValueConfiguration>> properties = Arrays.asList(DIMENSION, POLICY,
DEFAULT_VALUE_EXPRESSION);
IModel<List<Property<DefaultValueConfiguration>>> properties = new LoadableDetachableModel<List<Property<DefaultValueConfiguration>>>() {

@Override
protected List<Property<DefaultValueConfiguration>> load() {
return Arrays.asList(DIMENSION, POLICY, DEFAULT_VALUE_EXPRESSION);
}
};

table = new ReorderableTablePanel<DefaultValueConfiguration>("defaultConfigs",
configurations, properties) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
import org.apache.wicket.markup.html.panel.Panel;
import org.apache.wicket.markup.repeater.DefaultItemReuseStrategy;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.LoadableDetachableModel;
import org.apache.wicket.model.Model;
import org.apache.wicket.request.resource.PackageResourceReference;
import org.geoserver.catalog.LayerGroupInfo;
Expand All @@ -46,19 +47,19 @@ public class LayerGroupEntryPanel extends Panel {

private static final long serialVersionUID = -5483938812185582866L;

public static Property<LayerGroupEntry> LAYER = new PropertyPlaceholder<LayerGroupEntry>(
public static final Property<LayerGroupEntry> LAYER = new PropertyPlaceholder<LayerGroupEntry>(
"layer");

public static Property<LayerGroupEntry> DEFAULT_STYLE = new PropertyPlaceholder<LayerGroupEntry>(
public static final Property<LayerGroupEntry> DEFAULT_STYLE = new PropertyPlaceholder<LayerGroupEntry>(
"defaultStyle");

public static Property<LayerGroupEntry> STYLE = new PropertyPlaceholder<LayerGroupEntry>(
public static final Property<LayerGroupEntry> STYLE = new PropertyPlaceholder<LayerGroupEntry>(
"style");

public static Property<LayerGroupEntry> REMOVE = new PropertyPlaceholder<LayerGroupEntry>(
public static final Property<LayerGroupEntry> REMOVE = new PropertyPlaceholder<LayerGroupEntry>(
"remove");

static List<Property<LayerGroupEntry>> PROPERTIES = Arrays.asList(LAYER, DEFAULT_STYLE, STYLE, REMOVE);
static final List<Property<LayerGroupEntry>> PROPERTIES = Arrays.asList(LAYER, DEFAULT_STYLE, STYLE, REMOVE);

ModalWindow popupWindow;
GeoServerTablePanel<LayerGroupEntry> layerTable;
Expand All @@ -79,8 +80,16 @@ public LayerGroupEntryPanel( String id, LayerGroupInfo layerGroup, IModel<Worksp
add(dialog = new GeoServerDialog("dialog"));
add(new HelpLink("layersHelp").setDialog(dialog));

//layers
add(layerTable = new ReorderableTablePanel<LayerGroupEntry>("layers", items, PROPERTIES) {
// make sure we don't end up serializing the list, but get it fresh from the dataProvider,
// to avoid serialization issues seen in GEOS-8273
LoadableDetachableModel<List<Property<LayerGroupEntry>>> propertiesModel = new LoadableDetachableModel<List<Property<LayerGroupEntry>>>() {
@Override
protected List<Property<LayerGroupEntry>> load() {
return PROPERTIES;
}
};
// layers
add(layerTable = new ReorderableTablePanel<LayerGroupEntry>("layers", items, propertiesModel) {

private static final long serialVersionUID = -3270471094618284639L;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@
import org.apache.wicket.markup.repeater.ReuseIfModelsEqualStrategy;
import org.apache.wicket.markup.repeater.data.DataView;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.LoadableDetachableModel;
import org.apache.wicket.model.Model;
import org.apache.wicket.model.PropertyModel;
import org.apache.wicket.model.ResourceModel;
Expand Down Expand Up @@ -208,8 +209,18 @@ protected void populateItem(ListItem<Property<T>> item) {

protected void buildRowListView(final GeoServerDataProvider<T> dataProvider, Item<T> item,
final IModel<T> itemModel) {
// make sure we don't serialize the list, but get it fresh from the dataProvider,
// to avoid serialization issues seen in GEOS-8273
IModel propertyList = new LoadableDetachableModel() {

@Override
protected Object load() {
return dataProvider.getVisibleProperties();
}

};
// create one component per viewable property
ListView<Property<T>> items = new ListView<Property<T>>("itemProperties", dataProvider.getVisibleProperties()) {
ListView<Property<T>> items = new ListView<Property<T>>("itemProperties", propertyList) {

private static final long serialVersionUID = -4552413955986008990L;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
import org.apache.wicket.markup.repeater.Item;
import org.apache.wicket.markup.repeater.OddEvenItem;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.LoadableDetachableModel;
import org.apache.wicket.model.Model;
import org.geoserver.web.data.layergroup.LayerGroupEntry;
import org.geoserver.web.wicket.GeoServerDataProvider.Property;
Expand Down Expand Up @@ -47,19 +48,30 @@ static class ReorderableDataProvider<T> extends GeoServerDataProvider<T> {

private List<T> items;

private List<org.geoserver.web.wicket.GeoServerDataProvider.Property<T>> properties;
private IModel<List<org.geoserver.web.wicket.GeoServerDataProvider.Property<T>>> properties;

@SuppressWarnings("unchecked")
public ReorderableDataProvider(List<T> items, List<Property<T>> properties) {
public ReorderableDataProvider(List<T> items, IModel<List<Property<T>>> properties) {
this.items = items;
this.properties = new ArrayList<Property<T>>(properties);
this.properties.add(0, (Property<T>) POSITION);
this.properties.add(0, (Property<T>) RENDERING_ORDER);
// make sure we don't serialize the list, but get it fresh from the dataProvider,
// to avoid serialization issues seen in GEOS-8273
this.properties = new LoadableDetachableModel<List<Property<T>>>() {

@Override
protected List<Property<T>> load() {
List result = new ArrayList<Property<T>>(properties.getObject());
result.add(0, (Property<T>) POSITION);
result.add(0, (Property<T>) RENDERING_ORDER);
return result;
}

};

}

@Override
protected List<Property<T>> getProperties() {
return properties;
return properties.getObject();
}

@Override
Expand All @@ -76,9 +88,19 @@ protected List<T> getItems() {
static Property<?> POSITION = new PropertyPlaceholder<Object>("position");

static Property<?> RENDERING_ORDER = new PropertyPlaceholder<Object>("order");


/**
* Deprecated, provide a loadable model for properties instead which ensures always the
* same exact property objects are returned (or use equality by name in the getComponentForProperty method)
*/
@SuppressWarnings("serial")
@Deprecated
public ReorderableTablePanel(String id, List<T> items, List<Property<T>> properties) {
this(id, items, Model.ofList(properties));
}

@SuppressWarnings("serial")
public ReorderableTablePanel(String id, List<T> items, IModel<List<Property<T>>> properties) {
super(id, new ReorderableDataProvider<T>(items, properties));
this.setOutputMarkupId(true);
this.add(new WebTheme());
Expand Down Expand Up @@ -110,7 +132,14 @@ public void onDrop(AjaxRequestTarget target, Transfer transfer, Location locatio
@Override
protected void buildRowListView(GeoServerDataProvider<T> dataProvider, Item<T> item, IModel<T> itemModel) {
// create one component per viewable property
ListView<Property<T>> items = new ListView<Property<T>>("itemProperties", dataProvider.getVisibleProperties()) {
IModel propertyList = new LoadableDetachableModel() {

@Override
protected Object load() {
return dataProvider.getVisibleProperties();
}
};
ListView<Property<T>> items = new ListView<Property<T>>("itemProperties", propertyList) {

private static final long serialVersionUID = -7089826211241039856L;

Expand Down

0 comments on commit 087759e

Please sign in to comment.