import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Collections;
+import java.util.HashMap;
import java.util.List;
+import java.util.Map;
import java.util.Properties;
import oasis.names.tc.xacml._3_0.core.schema.wd_17.PolicyType;
+import org.apache.commons.lang3.tuple.Pair;
import org.onap.policy.models.decisions.concepts.DecisionRequest;
import org.onap.policy.models.decisions.concepts.DecisionResponse;
import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicy;
private Path pathForData = null;
private Properties pdpProperties = null;
private PDPEngine pdpEngine = null;
+ private Map<ToscaPolicy, Path> mapLoadedPolicies = new HashMap<>();
public StdXacmlApplicationServiceProvider() {
super();
@Override
public List<ToscaPolicyTypeIdentifier> supportedPolicyTypes() {
- return Collections.emptyList();
+ throw new UnsupportedOperationException("Please override and implement supportedPolicyTypes");
}
@Override
}
@Override
- public synchronized void loadPolicy(ToscaPolicy toscaPolicy) {
+ public synchronized boolean loadPolicy(ToscaPolicy toscaPolicy) {
try {
//
// Convert the policies first
// Save the properties
//
this.pdpProperties = newProperties;
+ //
+ // Save in our map
+ //
+ this.mapLoadedPolicies.put(toscaPolicy, refPath);
} catch (IOException | ToscaPolicyConversionException e) {
LOGGER.error("Failed to loadPolicies {}", e);
+ return false;
+ }
+ return true;
+ }
+
+ @Override
+ public synchronized boolean unloadPolicy(ToscaPolicy toscaPolicy) throws XacmlApplicationException {
+ //
+ // Find it in our map
+ //
+ Path refPolicy = this.mapLoadedPolicies.get(toscaPolicy);
+ if (refPolicy == null) {
+ LOGGER.error("Failed to find ToscaPolicy {} in our map size {}", toscaPolicy.getMetadata(),
+ this.mapLoadedPolicies.size());
+ return false;
+ }
+ //
+ // Create a copy of the properties object
+ //
+ Properties newProperties = this.getProperties();
+ //
+ // Remove it from the properties
+ //
+ XacmlPolicyUtils.removeRootPolicy(newProperties, refPolicy);
+ //
+ // We can delete the file
+ //
+ try {
+ Files.delete(refPolicy);
+ } catch (IOException e) {
+ LOGGER.error("Failed to delete policy {} from disk {}", toscaPolicy.getMetadata(),
+ refPolicy.toAbsolutePath().toString(), e);
}
+ //
+ // Write the properties to disk
+ //
+ try {
+ XacmlPolicyUtils.storeXacmlProperties(newProperties,
+ XacmlPolicyUtils.getPropertiesPath(this.getDataPath()));
+ } catch (IOException e) {
+ LOGGER.error("Failed to save the properties to disk {}", newProperties, e);
+ }
+ //
+ // Reload the engine
+ //
+ this.createEngine(newProperties);
+ //
+ // Save the properties
+ //
+ this.pdpProperties = newProperties;
+ //
+ // Save in our map
+ //
+ if (this.mapLoadedPolicies.remove(toscaPolicy) == null) {
+ LOGGER.error("Failed to remove toscaPolicy {} from internal map size {}", toscaPolicy.getMetadata(),
+ this.mapLoadedPolicies.size());
+ }
+ //
+ // Not sure if any of the errors above warrant returning false
+ //
+ return true;
}
@Override
- public synchronized DecisionResponse makeDecision(DecisionRequest request) {
+ public Pair<DecisionResponse, Response> makeDecision(DecisionRequest request) {
//
// Convert to a XacmlRequest
//
//
// Convert to a DecisionResponse
//
- return this.getTranslator().convertResponse(xacmlResponse);
+ return Pair.of(this.getTranslator().convertResponse(xacmlResponse), xacmlResponse);
}
protected abstract ToscaPolicyTranslator getTranslator(String type);