package org.fcrepo.server.security.xacml.pdp.data;
import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Date;
import java.util.Map;
import org.apache.commons.io.IOUtils;
import org.fcrepo.server.config.ServerConfiguration;
import org.fcrepo.server.storage.types.Datastream;
import org.fcrepo.server.storage.types.DigitalObject;
import org.fcrepo.server.utilities.rebuild.Rebuilder;
public class PolicyIndexRebuilder
implements Rebuilder {
protected PolicyIndex m_policyIndex = null;
@Override
public void addObject(DigitalObject object) throws Exception {
// does it have a policy datastream?
Iterable<Datastream> policyDatastreams = object.datastreams(FedoraPolicyStore.FESL_POLICY_DATASTREAM);
// try to get the latest policy datastream version
Date latest = null;
Datastream policyDatastream = null;
for (Datastream ds : policyDatastreams) {
if (latest == null || ds.DSCreateDT.after(latest)) {
latest = ds.DSCreateDT;
policyDatastream = ds;
}
}
// null means no policy datastream found
if (policyDatastream != null ) {
// add to cache
System.out.println(" Adding " + object.getPid() + " to index.");
String policy = new String(IOUtils.toByteArray(policyDatastream.getContentStream()), "UTF-8");
// TODO: PolicyIndex would benefit from methods that can accept streams
m_policyIndex.addPolicy(object.getPid(), policy);
}
}
@Override
public void finish() throws Exception {
}
@Override
public String getAction() {
return "Rebuild the FeSL policy cache";
}
@Override
public boolean shouldStopServer() {
return true;
}
@Override
public void start(Map<String, String> options) throws Exception {
// attempt to clear index; request manual deletion if this fails
if (!m_policyIndex.clear()) {
BufferedReader reader =
new BufferedReader(new InputStreamReader(System.in));
System.out.println();
System.out
.println("NOTE: You must now manually delete (clear) ");
System.out
.println(" the existing database. This rebuilder was");
System.out
.println(" unable to perform this step. ");
System.out
.println(" Press enter when finished.");
try {
reader.readLine();
} catch (IOException e) {
}
}
}
@Override
public Map<String, String> getOptions() throws Exception {
return null;
}
@Override
public void init() {
}
public void setPolicyIndex(PolicyIndex policyIndex) {
m_policyIndex = policyIndex;
}
@Override
public void setServerConfiguration(ServerConfiguration serverConfig) {
// not needed
}
@Override
public void setServerDir(File serverBaseDir) {
// not needed
}
}