2 * ============LICENSE_START=======================================================
4 * ================================================================================
5 * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
6 * ================================================================================
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
11 * http://www.apache.org/licenses/LICENSE-2.0
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
18 * ============LICENSE_END=========================================================
20 package org.onap.policy.pdp.rest.api.services;
22 import java.util.Collection;
24 import java.util.Map.Entry;
25 import java.util.UUID;
27 import javax.json.Json;
28 import javax.json.JsonArrayBuilder;
29 import javax.json.JsonObject;
30 import javax.json.JsonObjectBuilder;
32 import org.onap.policy.api.DecisionRequestParameters;
33 import org.onap.policy.api.DecisionResponse;
34 import org.onap.policy.api.PolicyDecision;
35 import org.onap.policy.api.PolicyDecisionException;
36 import org.onap.policy.common.logging.flexlogger.FlexLogger;
37 import org.onap.policy.common.logging.flexlogger.Logger;
38 import org.onap.policy.pdp.rest.api.models.PDPResponse;
39 import org.onap.policy.std.StdDecisionResponse;
40 import org.onap.policy.xacml.api.XACMLErrorConstants;
41 import org.springframework.http.HttpStatus;
43 public class GetDecisionService {
44 private static final Logger LOGGER = FlexLogger.getLogger(GetDecisionService.class.getName());
46 private DecisionResponse decisionResponse = null;
47 private HttpStatus status = HttpStatus.BAD_REQUEST;
48 private DecisionRequestParameters decisionRequestParameters = null;
49 private String message = null;
50 private String onapComponentName = null;
51 private Map<String,String> decisionAttributes = null;
53 public GetDecisionService(
54 DecisionRequestParameters decisionRequestParameters,
56 this.decisionRequestParameters = decisionRequestParameters;
57 if(decisionRequestParameters.getRequestID()==null){
58 UUID requestUUID = null;
59 if (requestID != null && !requestID.isEmpty()) {
61 requestUUID = UUID.fromString(requestID);
62 } catch (IllegalArgumentException e) {
63 requestUUID = UUID.randomUUID();
64 LOGGER.info("Generated Random UUID: " + requestUUID.toString(),e);
67 requestUUID = UUID.randomUUID();
68 LOGGER.info("Generated Random UUID: " + requestUUID.toString());
70 this.decisionRequestParameters.setRequestID(requestUUID);
74 }catch(PolicyDecisionException e){
75 StdDecisionResponse decisionResponse = new StdDecisionResponse();
76 decisionResponse.setDecision(PolicyDecision.ERROR);
77 decisionResponse.setDetails(XACMLErrorConstants.ERROR_DATA_ISSUE + e);
78 this.decisionResponse = decisionResponse;
79 status = HttpStatus.BAD_REQUEST;
83 private void run() throws PolicyDecisionException{
86 LOGGER.error(message);
87 throw new PolicyDecisionException(message);
90 String modelString = getModel().toString();
91 LOGGER.debug("Generated JSON Request is: " + modelString);
94 PDPServices pdpServices = new PDPServices();
95 status = HttpStatus.OK;
96 decisionResponse = decisionResult(pdpServices.generateRequest(modelString, decisionRequestParameters.getRequestID(), false, true));
97 } catch (Exception e) {
98 LOGGER.error(XACMLErrorConstants.ERROR_DATA_ISSUE + e);
99 status = HttpStatus.BAD_REQUEST;
100 throw new PolicyDecisionException(e);
104 private DecisionResponse decisionResult(
105 Collection<PDPResponse> generateRequest) {
106 StdDecisionResponse policyDecision = new StdDecisionResponse();
107 if (generateRequest == null) {
108 return policyDecision;
110 if (!generateRequest.isEmpty()) {
111 for (PDPResponse stdStatus : generateRequest) {
112 policyDecision.setDecision(stdStatus.getDecision());
113 policyDecision.setDetails(stdStatus.getDetails());
116 return policyDecision;
119 private JsonObject getModel() throws PolicyDecisionException{
120 JsonArrayBuilder resourceArray = Json.createArrayBuilder();
121 for (Entry<String,String> key : decisionAttributes.entrySet()) {
122 if (key.getKey().isEmpty()) {
123 String message = XACMLErrorConstants.ERROR_DATA_ISSUE + "Cannot have an Empty Key";
124 LOGGER.error(message);
125 throw new PolicyDecisionException(message);
127 JsonObjectBuilder resourceBuilder = Json.createObjectBuilder();
128 if (key.getValue().matches("[0-9]+")) {
130 if ((key.getKey().equals("ErrorCode")) || (key.getKey().equals("WorkStep"))) {
132 resourceBuilder.add("Value", key.getValue());
136 int val = Integer.parseInt(key.getValue());
137 resourceBuilder.add("Value", val);
142 resourceBuilder.add("Value", key.getValue());
144 resourceBuilder.add("AttributeId", key.getKey());
145 resourceArray.add(resourceBuilder);
147 return Json.createObjectBuilder()
148 .add("Request", Json.createObjectBuilder()
149 .add("AccessSubject", Json.createObjectBuilder()
150 .add("Attribute", Json.createObjectBuilder()
151 .add("Value", onapComponentName)
152 .add("AttributeId", "ONAPName")))
153 .add("Resource", Json.createObjectBuilder()
154 .add("Attribute", resourceArray))
155 .add("Action", Json.createObjectBuilder()
156 .add("Attribute", Json.createObjectBuilder()
157 .add("Value", "DECIDE")
158 .add("AttributeId", "urn:oasis:names:tc:xacml:1.0:action:action-id"))))
162 private boolean getValidation() {
163 if(decisionRequestParameters==null){
164 message = XACMLErrorConstants.ERROR_DATA_ISSUE + "No Decision Request Paramaters";
167 onapComponentName = decisionRequestParameters.getOnapName();
168 decisionAttributes = decisionRequestParameters.getDecisionAttributes();
169 if (onapComponentName == null || onapComponentName.isEmpty()) {
170 message = XACMLErrorConstants.ERROR_DATA_ISSUE + "No onapComponentName given : " + onapComponentName;
173 if (decisionAttributes == null || decisionAttributes.isEmpty()) {
174 message = XACMLErrorConstants.ERROR_DATA_ISSUE + "No Decision Attributes Given. ";
180 public DecisionResponse getResult() {
181 return decisionResponse;
184 public HttpStatus getResponseCode() {