package org.fcrepo.server.security.xacml.pdp.data;
import java.io.File;
import java.io.FileNotFoundException;
import java.util.HashSet;
import java.util.Set;
import org.fcrepo.server.security.xacml.pdp.MelcoePDPException;
import org.fcrepo.server.security.xacml.util.PopulatePolicyDatabase;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public abstract class AbstractPolicyStore implements PolicyStore {
public static final Logger LOGGER =
LoggerFactory.getLogger(PopulatePolicyDatabase.class);
public static Set<String> policyNames = new HashSet<String>();
protected boolean policiesLoaded = false;
@Override
public void init() throws FileNotFoundException, PolicyStoreException{
AbstractPolicyStore.addDocuments(this);
}
public void reloadPolicies() throws FileNotFoundException, PolicyStoreException {
synchronized(AbstractPolicyStore.class){
this.policiesLoaded = false;
AbstractPolicyStore.addDocuments(this, true);
}
}
public static synchronized void addDocuments(AbstractPolicyStore policyStore) throws PolicyStoreException,
FileNotFoundException {
addDocuments(policyStore, false);
}
public static synchronized void addDocuments(AbstractPolicyStore policyStore, boolean reload) throws PolicyStoreException,
FileNotFoundException {
if (policyStore.policiesLoaded)
return;
File[] files = PopulatePolicyDatabase.getPolicyFiles();
if (files.length == 0) {
return;
}
PolicyUtils utils = new PolicyUtils();
// don't fail if a single policy fails, instead continue and list failed policies when done
StringBuilder failedPolicies = new StringBuilder();
for (File f : files) {
try {
String policyID = utils.getPolicyName(f);
// TODO: name mangling only if Fedora policy store; use consts for ns from that
if (policyStore instanceof FedoraPolicyStore) {
// get the policy ID - note that adding a policy with no name will generate a PID from
// the policy ID, but using the default PID namespace; we want specific namespace for bootstrap policies hence doing this here
// if XACML policy ID contains a pid separator, escape it
if (policyID.contains(":")) {
policyID = policyID.replace(":", "%3A");
}
policyID = FedoraPolicyStore.FESL_BOOTSTRAP_POLICY_NAMESPACE + ":" + policyID;
}
if (policyStore.contains(policyID) && !reload) {
if (LOGGER.isDebugEnabled()) {
LOGGER.debug("Policy database already contains " + policyID + " (" + f.getName()+ ")"
+ ". Skipping.");
}
} else {
AbstractPolicyStore.policyNames.add(policyStore.addPolicy(f, policyID));
}
} catch (MelcoePDPException e){
LOGGER.warn("Failed to add bootstrap policy " + f.getName() + " - " + e.getMessage());
failedPolicies.append(f.getName() + "\n");
}
}
if (failedPolicies.length() != 0) {
throw new PolicyStoreException("Failed to load some bootstrap policies: " + failedPolicies.toString());
}
policyStore.policiesLoaded = true;
}
}