package org.fcrepo.server.security;
import java.io.File;
import java.io.IOException;
import java.util.Map;
import org.fcrepo.server.ReadOnlyContext;
import org.fcrepo.server.Server;
import org.fcrepo.server.errors.ObjectNotInLowlevelStorageException;
import org.fcrepo.server.errors.ServerException;
import org.fcrepo.server.errors.ValidationException;
import org.fcrepo.server.storage.DOReader;
import org.fcrepo.server.storage.RepositoryReader;
import org.fcrepo.server.storage.types.Datastream;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.jboss.security.xacml.sunxacml.AbstractPolicy;
public abstract class PolicyLoader {
private static final Logger logger =
LoggerFactory.getLogger(PolicyLoader.class);
protected final RepositoryReader m_repoReader;
public PolicyLoader(RepositoryReader repoReader) {
m_repoReader = repoReader;
}
// load and parse all policies (*.xml) from a given directory, recursively
public abstract Map<String,AbstractPolicy> loadPolicies(PolicyParser policyParser, boolean validate, File dir)
throws IOException, ValidationException;
// if the object exists and has a POLICY datastream, parse and return it
// the passed parser must be safe to use in this thread
protected AbstractPolicy loadObjectPolicy(PolicyParser policyParser, String pid, boolean validate) throws ServerException {
try {
DOReader reader = m_repoReader.getReader(Server.USE_DEFINITIVE_STORE,
ReadOnlyContext.EMPTY,
pid);
Datastream ds = reader.GetDatastream("POLICY", null);
if (ds != null) {
logger.debug("Using POLICY for {}", pid);
return policyParser.parse(ds.getContentStream(), validate);
} else {
return null;
}
} catch (ObjectNotInLowlevelStorageException e) {
return null;
}
}
}