+ private String id = null;
+
+ private String name = null;
+
+ private String policyId = null;
+
+ private String description = null;
+
+ private int[] version = null;
+
+ private boolean isRoot = false;
+
+ private boolean isValid = false;
+
+ private URI location = null;
+
+ public StdPDPPolicy() {
+ //
+ // Methods needed for JSON Deserialization
+ //
+ }
+
+ public StdPDPPolicy(String id, boolean isRoot) {
+ this.id = id;
+ this.isRoot = isRoot;
+ }
+
+ public StdPDPPolicy(String id, boolean isRoot, String name) {
+ this(id, isRoot);
+ this.name = name;
+ }
+
+ /**
+ * StdPDPPolicy.
+ *
+ * @param id String
+ * @param isRoot boolean
+ * @param name String
+ * @param location URI
+ * @throws IOException IOException
+ */
+ public StdPDPPolicy(String id, boolean isRoot, String name, URI location) throws IOException {
+ this(id, isRoot);
+ this.name = name;
+ this.location = location;
+
+ //
+ // Read the policy data
+ //
+ String theID = this.readPolicyData();
+
+ if (this.id == null) {
+ logger.debug("id is null so we are calling readPolicyData() to get the policyID");
+ this.id = theID;
+ }
+
+ logger.debug("The final outcome of the constructor returned the following: id = " + id + ", location = "
+ + location + ", name = " + name);
+
+ }
+
+ /**
+ * StdPDPPolicy constructor.
+ *
+ * @param stdPDPPolicyParams StdPDPPolicyParams
+ * @throws IOException IOException
+ */
+ public StdPDPPolicy(StdPDPPolicyParams stdPDPPolicyParams) throws IOException {
+ this(stdPDPPolicyParams.getId(), stdPDPPolicyParams.isRoot());
+ this.name = stdPDPPolicyParams.getName();
+ this.location = stdPDPPolicyParams.getLocation();
+ this.policyId = stdPDPPolicyParams.getPolicyId();
+ this.description = stdPDPPolicyParams.getDescription();
+ this.version = versionStringToArray(stdPDPPolicyParams.getVersion());
+ this.isValid = stdPDPPolicyParams.isValid();
+
+ logger.debug("The final outcome of the constructor returned the following: id = " + stdPDPPolicyParams.getId()
+ + ", location = " + stdPDPPolicyParams.getLocation() + ", name = " + stdPDPPolicyParams.getName()
+ + ", policyId = " + stdPDPPolicyParams.getPolicyId() + ", description = "
+ + stdPDPPolicyParams.getDescription() + ", Version = " + stdPDPPolicyParams.getVersion());
+
+ }
+
+ /**
+ * StdPDPPolicy.
+ *
+ * @param id String
+ * @param isRoot boolean
+ * @param name String
+ * @param location URI
+ * @param isFromAPI boolean
+ * @throws IOException IOException
+ */
+ public StdPDPPolicy(String id, boolean isRoot, String name, URI location, boolean isFromAPI) throws IOException {
+ this(id, isRoot);
+ this.name = name;
+ this.location = location;
+ this.isValid = isFromAPI;
+
+ logger.debug("The final outcome of the constructor returned the following: id = " + id + ", location = "
+ + location + ", name = " + name);
+
+ }
+
+ /**
+ * StdPDPPolicy.
+ *
+ * @param id String
+ * @param isRoot boolean
+ * @param location URI
+ * @param properties boolean
+ * @throws IOException IOException
+ */
+ public StdPDPPolicy(String id, boolean isRoot, URI location, Properties properties) throws IOException {
+ this(id, isRoot);
+ this.location = location;
+ //
+ // Read the policy data
+ //
+ this.readPolicyData();
+ //
+ // See if there's a name
+ //
+ for (Object key : properties.keySet()) {
+ if (key.toString().equals(id + ".name")) {
+ this.name = properties.getProperty(key.toString());
+ break;
+ }
+ }
+ }
+
+ private String readPolicyData() throws IOException {
+ //
+ // Extract XACML policy information
+ //
+ URL url = this.location.toURL();
+ Object rootElement = XACMLPolicyScanner.readPolicy(url.openStream());
+ if (rootElement == null || (!(rootElement instanceof PolicySetType) && !(rootElement instanceof PolicyType))) {
+ logger.warn("No root policy element in URI: " + this.location.toString() + " : " + rootElement);
+ this.isValid = false;
+ } else {
+ this.version = versionStringToArray(XACMLPolicyScanner.getVersion(rootElement));
+ if (rootElement instanceof PolicySetType) {
+ this.policyId = ((PolicySetType) rootElement).getPolicySetId();
+ this.description = ((PolicySetType) rootElement).getDescription();
+ this.isValid = true;
+ this.version = versionStringToArray(((PolicySetType) rootElement).getVersion());
+ } else if (rootElement instanceof PolicyType) {
+ this.policyId = ((PolicyType) rootElement).getPolicyId();
+ this.description = ((PolicyType) rootElement).getDescription();
+ this.version = versionStringToArray(((PolicyType) rootElement).getVersion());
+ this.isValid = true;
+ } else {
+ PolicyLogger.error("Unknown root element: " + rootElement.getClass().getCanonicalName());
+ }
+ }
+ if (this.policyId != null) {
+ ArrayList<String> foo = Lists.newArrayList(Splitter.on(':').split(this.policyId));
+ if (!foo.isEmpty()) {
+ return foo.get(foo.size() - 1);
+ }
+ }
+ return null;
+ }
+
+ @Override
+ public String getId() {
+ return id;
+ }
+
+ public void setId(String id) {
+ this.id = id;
+ }
+
+ @Override
+ public String getName() {
+ return this.name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ @Override
+ public String getPolicyId() {
+ return this.policyId;
+ }
+
+ @Override
+ public String getDescription() {
+ return this.description;
+ }
+
+ @Override
+ public String getVersion() {
+ return versionArrayToString(this.version);
+ }
+
+ @Override
+ @JsonIgnore
+ public int[] getVersionInts() {
+ return version;
+ }
+
+ @Override
+ public boolean isRoot() {
+ return this.isRoot;
+ }
+
+ @Override
+ public boolean isValid() {
+ return this.isValid;
+ }
+
+ @Override
+ @JsonIgnore
+ public InputStream getStream() throws PAPException, IOException {
+ try {
+ if (this.location != null) {
+ URL url = this.location.toURL();
+ return url.openStream();
+ }
+ return null;
+ } catch (FileNotFoundException e) {
+ throw new PAPException(e);
+ }
+ }
+
+ @Override
+ public URI getLocation() throws PAPException {
+ return this.location;
+ }
+
+ @Override
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((id == null) ? 0 : id.hashCode());
+ result = prime * result + ((policyId == null) ? 0 : policyId.hashCode());
+ result = prime * result;
+ if (version != null) {
+ for (int i = 0; i < version.length; i++) {
+ result += version[i];
+ }
+ }
+ return result;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj) {
+ return true;
+ }
+ if (obj == null) {
+ return false;
+ }
+ if (getClass() != obj.getClass()) {
+ return false;
+ }
+ StdPDPPolicy other = (StdPDPPolicy) obj;
+ if (id == null) {
+ if (other.id != null) {
+ return false;
+ }
+ } else if (!id.equals(other.id)) {
+ return false;
+ }
+ if (policyId == null) {
+ if (other.policyId != null) {
+ return false;
+ }
+ } else if (!policyId.equals(other.policyId)) {
+ return false;
+ }
+ if (version != other.version) {
+ return false;
+ }
+ return true;
+ }
+
+ @Override
+ public String toString() {
+ return "StdPDPPolicy [id=" + id + ", name=" + name + ", policyId=" + policyId + ", description=" + description
+ + ", version=" + this.getVersion() + ", isRoot=" + isRoot + ", isValid=" + isValid + ", location="
+ + location + "]";
+ }
+
+ /**
+ * Given a version string consisting of integers with dots between them, convert it into an array of ints.
+ *
+ * @param version String
+ * @return int array
+ */
+ public static int[] versionStringToArray(String version) {
+ if (version == null || version.length() == 0) {
+ return new int[0];
+ }
+ String[] stringArray = version.split("\\.");
+ int[] resultArray = new int[stringArray.length];
+ for (int i = 0; i < stringArray.length; i++) {
+ resultArray[i] = Integer.parseInt(stringArray[i]);
+ }
+ return resultArray;
+ }
+
+ /**
+ * Given an array representing a version, create the corresponding dot-separated string.
+ *
+ * @param array int array
+ * @return String
+ */
+ public static String versionArrayToString(int[] array) {
+ if (array == null || array.length == 0) {
+ return "";
+ }
+ String versionString = "";
+ if (array.length > 0) {
+ versionString = "" + Integer.toString(array[0]);
+ for (int i = 1; i < array.length; i++) {
+ versionString += "." + Integer.toString(array[i]);
+ }
+ }
+ return versionString;
+ }
+
+ public void setPolicyId(String policyId) {
+ this.policyId = policyId;
+ }
+
+ public void setDescription(String description) {
+ this.description = description;
+ }
+
+ public void setVersion(String version) {
+ this.version = versionStringToArray(version);
+ }
+
+ public void setRoot(boolean isRoot) {
+ this.isRoot = isRoot;
+ }
+
+ public void setValid(boolean isValid) {
+ this.isValid = isValid;
+ }
+
+ public void setLocation(URI location) {
+ this.location = location;
+ }