/* Copyright (c) 2001 - 2007 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.layer; import java.util.Arrays; import java.util.Comparator; import java.util.List; import org.apache.wicket.extensions.markup.html.repeater.util.SortParam; import org.apache.wicket.model.IModel; import org.geoserver.catalog.LayerInfo; import org.geoserver.web.wicket.GeoServerDataProvider; /** * Provides a filtered, sorted view over the catalog layers. * @author Andrea Aime - OpenGeo */ @SuppressWarnings("serial") public class LayerProvider extends GeoServerDataProvider<LayerInfo> { static final Property<LayerInfo> TYPE = new BeanProperty<LayerInfo>("type", "type"); static final Property<LayerInfo> WORKSPACE = new BeanProperty<LayerInfo>( "workspace", "resource.store.workspace.name"); static final Property<LayerInfo> STORE = new BeanProperty<LayerInfo>( "store", "resource.store.name"); static final Property<LayerInfo> NAME = new BeanProperty<LayerInfo>("name", "name"); /** * A custom property that uses the derived enabled() property instead of isEnabled() to account * for disabled resource/store */ static final Property<LayerInfo> ENABLED = new AbstractProperty<LayerInfo>("enabled") { public Boolean getPropertyValue(LayerInfo item) { return Boolean.valueOf(item.enabled()); } }; static final Property<LayerInfo> SRS = new BeanProperty<LayerInfo>("SRS", "resource.SRS") { /** * We roll a custom comparator that treats the numeric part of the * code as a number */ public java.util.Comparator<LayerInfo> getComparator() { return new Comparator<LayerInfo>() { public int compare(LayerInfo o1, LayerInfo o2) { // split out authority and code String[] srs1 = o1.getResource().getSRS().split(":"); String[] srs2 = o2.getResource().getSRS().split(":"); // use sign to control sort order if (srs1[0].equalsIgnoreCase(srs2[0]) && srs1.length > 1 && srs2.length > 1) { try { // in case of same authority, compare numbers return new Integer(srs1[1]).compareTo(new Integer( srs2[1])); } catch(NumberFormatException e) { // a handful of codes are not numeric, // handle the general case as well return srs1[1].compareTo(srs2[1]); } } else { // compare authorities return srs1[0].compareToIgnoreCase(srs2[0]); } } }; } }; static final List<Property<LayerInfo>> PROPERTIES = Arrays.asList(TYPE, WORKSPACE, STORE, NAME, ENABLED, SRS); @Override protected List<LayerInfo> getItems() { return getCatalog().getLayers(); } @Override protected List<Property<LayerInfo>> getProperties() { return PROPERTIES; } public IModel newModel(Object object) { return new LayerDetachableModel((LayerInfo) object); } @Override protected Comparator<LayerInfo> getComparator(SortParam sort) { return super.getComparator(sort); } }