/* (c) 2014 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;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.geoserver.catalog.Catalog;
import org.geoserver.catalog.CatalogInfo;
import org.geoserver.catalog.LayerGroupInfo;
import org.geoserver.catalog.LayerInfo;
import org.geoserver.catalog.NamespaceInfo;
import org.geoserver.catalog.Predicates;
import org.geoserver.catalog.ResourceInfo;
import org.geoserver.catalog.StyleInfo;
import org.geoserver.catalog.WorkspaceInfo;
import org.geoserver.platform.GeoServerExtensions;
import org.geotools.filter.expression.InternalVolatileFunction;
import org.opengis.filter.Filter;
import org.opengis.filter.FilterFactory;
/**
* A convenient base class for catalog filters. By default does not filter anything, it is advised
* to use this class as the base to protect yourself from CatalogFilter API changes, implement
* CatalogFilter directly only if you need a different base class
*
* @author Andrea Aime - GeoSolutions
*
*/
public abstract class AbstractCatalogFilter implements CatalogFilter {
private static Logger LOGGER =
org.geotools.util.logging.Logging.getLogger(AbstractCatalogFilter.class);
@Override
public boolean hideLayer(LayerInfo layer) {
return false;
}
@Override
public boolean hideStyle(StyleInfo style) {
return false;
}
@Override
public boolean hideLayerGroup(LayerGroupInfo layerGroup) {
return false;
}
@Override
public boolean hideWorkspace(WorkspaceInfo workspace) {
return false;
}
@Override
public boolean hideResource(ResourceInfo resource) {
return false;
}
protected Catalog getCatalog() {
return (Catalog) GeoServerExtensions.bean("catalog");
}
/**
* Returns a Filter equivalent to this CatalogFilter when applied to an object of the specified
* type. Implementers should override and return an appropriate well known filter
* @see Predicates
*/
@Override
public Filter getSecurityFilter(final Class<? extends CatalogInfo> clazz) {
org.opengis.filter.expression.Function visible;
if(ResourceInfo.class.isAssignableFrom(clazz)) {
visible = new InternalVolatileFunction() {
@Override
public Boolean evaluate(Object object) {
return !hideResource((ResourceInfo) object);
}
};
} else if(WorkspaceInfo.class.isAssignableFrom(clazz)) {
visible = new InternalVolatileFunction() {
@Override
public Boolean evaluate(Object object) {
return !hideWorkspace((WorkspaceInfo) object);
}
};
} else if(LayerGroupInfo.class.isAssignableFrom(clazz)) {
visible = new InternalVolatileFunction() {
@Override
public Boolean evaluate(Object object) {
return !hideLayerGroup((LayerGroupInfo) object);
}
};
} else if(StyleInfo.class.isAssignableFrom(clazz)) {
visible = new InternalVolatileFunction() {
@Override
public Boolean evaluate(Object object) {
return !hideStyle((StyleInfo) object);
}
};
} else if(LayerInfo.class.isAssignableFrom(clazz)) {
visible = new InternalVolatileFunction() {
@Override
public Boolean evaluate(Object object) {
return !hideLayer((LayerInfo) object);
}
};
} else if(NamespaceInfo.class.isAssignableFrom(clazz)) {
visible = new InternalVolatileFunction() {
@Override
public Boolean evaluate(Object object) {
WorkspaceInfo wsInfo = getCatalog().getWorkspaceByName(((NamespaceInfo)object).getPrefix());
return !hideWorkspace(wsInfo);
}
};
} else {
LOGGER.log(Level.FINE, "CatalogFilter does not recognize interface {0} accepting all.", clazz);
return Predicates.acceptAll();
}
FilterFactory factory = Predicates.factory;
// create a filter combined with the security credentials check
Filter filter = factory.equals(factory.literal(Boolean.TRUE), visible);
return filter;
}
}