[POLICY-73] replace openecomp for policy-engine
[policy/engine.git] / ONAP-PDP-REST / src / main / java / org / onap / policy / pdp / rest / api / services / GetDecisionService.java
1 /*-
2  * ============LICENSE_START=======================================================
3  * ONAP-PDP-REST
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
10  * 
11  *      http://www.apache.org/licenses/LICENSE-2.0
12  * 
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=========================================================
19  */
20 package org.onap.policy.pdp.rest.api.services;
21
22 import java.util.Collection;
23 import java.util.Map;
24 import java.util.Map.Entry;
25 import java.util.UUID;
26
27 import javax.json.Json;
28 import javax.json.JsonArrayBuilder;
29 import javax.json.JsonObject;
30 import javax.json.JsonObjectBuilder;
31
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;
42
43 public class GetDecisionService {
44     private static final Logger LOGGER = FlexLogger.getLogger(GetDecisionService.class.getName());
45     
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;
52     
53     public GetDecisionService(
54             DecisionRequestParameters decisionRequestParameters,
55             String requestID) {
56         this.decisionRequestParameters = decisionRequestParameters;
57         if(decisionRequestParameters.getRequestID()==null){
58             UUID requestUUID = null;
59             if (requestID != null && !requestID.isEmpty()) {
60                 try {
61                     requestUUID = UUID.fromString(requestID);
62                 } catch (IllegalArgumentException e) {
63                     requestUUID = UUID.randomUUID();
64                     LOGGER.info("Generated Random UUID: " + requestUUID.toString(),e);
65                 }
66             }else{
67                 requestUUID = UUID.randomUUID();
68                 LOGGER.info("Generated Random UUID: " + requestUUID.toString());
69             }
70             this.decisionRequestParameters.setRequestID(requestUUID);
71         }
72         try{
73             run();
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;
80         }
81     }
82
83     private void run() throws PolicyDecisionException{
84         // Get Validation.
85         if(!getValidation()){
86             LOGGER.error(message);
87             throw new PolicyDecisionException(message);
88         }
89         // Generate Request. 
90         String modelString = getModel().toString();
91         LOGGER.debug("Generated JSON Request is: " + modelString);
92         // Process Result. 
93         try {
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);
101         }
102     }
103
104     private DecisionResponse decisionResult(
105             Collection<PDPResponse> generateRequest) {
106         StdDecisionResponse policyDecision = new StdDecisionResponse();
107         if (generateRequest == null) {
108             return policyDecision;
109         }
110         if (!generateRequest.isEmpty()) {
111             for (PDPResponse stdStatus : generateRequest) {
112                 policyDecision.setDecision(stdStatus.getDecision());
113                 policyDecision.setDetails(stdStatus.getDetails());
114             }
115         }
116         return policyDecision;
117     }
118
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);
126             }
127             JsonObjectBuilder resourceBuilder = Json.createObjectBuilder();
128             if (key.getValue().matches("[0-9]+")) {
129                 
130                 if ((key.getKey().equals("ErrorCode")) || (key.getKey().equals("WorkStep"))) {
131                     
132                         resourceBuilder.add("Value", key.getValue());
133
134                 } else {
135                         
136                     int val = Integer.parseInt(key.getValue());
137                     resourceBuilder.add("Value", val);
138                     
139                 }
140                 
141             } else {
142                 resourceBuilder.add("Value", key.getValue());
143             }
144             resourceBuilder.add("AttributeId", key.getKey());
145             resourceArray.add(resourceBuilder);
146         }
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"))))
159                 .build();
160     }
161
162     private boolean getValidation() {
163         if(decisionRequestParameters==null){
164             message = XACMLErrorConstants.ERROR_DATA_ISSUE + "No Decision Request Paramaters";
165             return false; 
166         }
167         onapComponentName = decisionRequestParameters.getONAPComponentName();
168         decisionAttributes = decisionRequestParameters.getDecisionAttributes();
169         if (onapComponentName == null || onapComponentName.isEmpty()) {
170             message = XACMLErrorConstants.ERROR_DATA_ISSUE + "No onapComponentName given : " + onapComponentName;
171             return false;
172         }
173         if (decisionAttributes == null || decisionAttributes.isEmpty()) {
174             message = XACMLErrorConstants.ERROR_DATA_ISSUE + "No Decision Attributes Given. ";
175             return false;
176         }
177         return true;
178     }
179
180     public DecisionResponse getResult() {
181         return decisionResponse;
182     }
183
184     public HttpStatus getResponseCode() {
185         return status;
186     }
187
188 }
189