/* (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.security.decorators; import java.util.List; import org.geoserver.catalog.LayerGroupInfo; import org.geoserver.catalog.LayerInfo; import org.geoserver.catalog.PublishedInfo; import org.geoserver.catalog.StyleInfo; import org.geoserver.catalog.impl.AbstractDecorator; import org.geoserver.catalog.impl.FilteredList; public class SecuredLayerGroupInfo extends DecoratingLayerGroupInfo { private LayerInfo rootLayer; private List<PublishedInfo> layers; private List<StyleInfo> styles; /** * Overrides the layer group layer list with the one provided (which is * supposed to have been wrapped so that each layer can be accessed only * accordingly to the current user privileges) * * @param delegate * @param layers */ public SecuredLayerGroupInfo(LayerGroupInfo delegate, LayerInfo rootLayer, List<PublishedInfo> layers, List<StyleInfo> styles) { super(delegate); this.rootLayer = rootLayer; this.layers = layers; this.styles = styles; } @Override public LayerInfo getRootLayer() { return rootLayer; } @Override public void setRootLayer(LayerInfo rootLayer) { //keep synchronised this.rootLayer = rootLayer; delegate.setRootLayer((LayerInfo) unwrap(rootLayer)); } @Override public List<PublishedInfo> getLayers() { return new FilteredList<PublishedInfo>(layers, delegate.getLayers()) { @Override protected PublishedInfo unwrap(PublishedInfo element) { return SecuredLayerGroupInfo.unwrap(element); } }; } @Override public List<StyleInfo> getStyles() { return new FilteredList<StyleInfo>(styles, delegate.getStyles()); } private static PublishedInfo unwrap(PublishedInfo pi) { if (pi instanceof SecuredLayerInfo || pi instanceof SecuredLayerGroupInfo) { @SuppressWarnings("unchecked") AbstractDecorator<? extends PublishedInfo> decorator = (AbstractDecorator<? extends PublishedInfo>) pi; return decorator.unwrap(PublishedInfo.class); } else { return pi; } } }