package org.geoserver.wfsv.security;
import org.geoserver.platform.ExtensionPriority;
import org.geoserver.security.Response;
import org.geoserver.security.WrapperPolicy;
import org.geoserver.security.decorators.SecuredObjectFactory;
import org.geotools.data.VersioningDataStore;
import org.geotools.data.VersioningFeatureLocking;
import org.geotools.data.VersioningFeatureSource;
import org.geotools.data.VersioningFeatureStore;
/**
* A factory that applies the proper security policy to versionig related data
* objects
*
* @author Andrea Aime - TOPP
*
*/
public class VersionedSecureDataFactory implements SecuredObjectFactory {
public boolean canSecure(Class clazz) {
return VersioningDataStore.class.isAssignableFrom(clazz)
|| VersioningFeatureSource.class.isAssignableFrom(clazz)
|| VersioningFeatureStore.class.isAssignableFrom(clazz)
|| VersioningFeatureLocking.class.isAssignableFrom(clazz);
}
public Object secure(Object object, WrapperPolicy policy) {
// null check
if (object == null)
return null;
Class clazz = object.getClass();
if (VersioningDataStore.class.isAssignableFrom(clazz)) {
return new ReadOnlyVersioningDataStore((VersioningDataStore) object, policy);
}
if (VersioningFeatureSource.class.isAssignableFrom(clazz)) {
// if the policy is not challenge, since this is a secured object,
// it must be read only (we don't wrap native objects if not
// required in order to add a security restriction)
if (policy.response != Response.CHALLENGE) {
return new ReadOnlyVersioningFeatureSource((VersioningFeatureSource) object,
policy);
} else if (VersioningFeatureLocking.class.isAssignableFrom(clazz)) {
return new ReadOnlyVersioningFeatureLocking((VersioningFeatureLocking) object,
policy);
} else if (VersioningFeatureStore.class.isAssignableFrom(clazz)) {
return new ReadOnlyVersioningFeatureStore((VersioningFeatureStore) object,
policy);
} else if (VersioningFeatureSource.class.isAssignableFrom(clazz)) {
return new ReadOnlyVersioningFeatureSource((VersioningFeatureSource) object,
policy);
}
}
throw new IllegalArgumentException("Cannot wrap objects of class " + clazz);
}
public int getPriority() {
return (ExtensionPriority.LOWEST + ExtensionPriority.HIGHEST) / 2;
}
}