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.openecomp.policy.pdp.rest.api.services;
22 import java.util.ArrayList;
23 import java.util.Collection;
24 import java.util.HashMap;
25 import java.util.HashSet;
26 import java.util.List;
28 import java.util.UUID;
30 import javax.json.Json;
31 import javax.json.JsonArrayBuilder;
32 import javax.json.JsonObject;
33 import javax.json.JsonObjectBuilder;
35 import org.openecomp.policy.api.ConfigRequestParameters;
36 import org.openecomp.policy.api.PolicyConfigException;
37 import org.openecomp.policy.api.PolicyConfigStatus;
38 import org.openecomp.policy.common.logging.flexlogger.FlexLogger;
39 import org.openecomp.policy.common.logging.flexlogger.Logger;
40 import org.openecomp.policy.pdp.rest.api.models.PDPResponse;
41 import org.openecomp.policy.pdp.rest.api.models.PolicyConfig;
42 import org.openecomp.policy.xacml.api.XACMLErrorConstants;
43 import org.springframework.http.HttpStatus;
45 public class GetConfigService {
46 private static Logger LOGGER = FlexLogger.getLogger(GetConfigService.class.getName());
48 private ConfigRequestParameters configRequestParameters = null;
49 private String message = null;
50 private HttpStatus responseCode = HttpStatus.BAD_REQUEST;
51 private Collection<PolicyConfig> policyConfigs = null;
52 private boolean unique = false;
54 public GetConfigService(ConfigRequestParameters configRequestParameters,
56 this.configRequestParameters = configRequestParameters;
57 if(configRequestParameters.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());
67 requestUUID = UUID.randomUUID();
68 LOGGER.info("Generated Random UUID: " + requestUUID.toString());
70 this.configRequestParameters.setRequestID(requestUUID);
72 policyConfigs = new ArrayList<PolicyConfig>();
76 }catch(PolicyConfigException e){
77 PolicyConfig policyConfig = new PolicyConfig();
78 policyConfig.setPolicyConfigMessage(e.getMessage());
79 policyConfig.setPolicyConfigStatus(PolicyConfigStatus.CONFIG_NOT_FOUND);
80 policyConfigs.add(policyConfig);
81 responseCode = HttpStatus.BAD_REQUEST;
85 private void specialCheck() {
86 if(policyConfigs==null || policyConfigs.size()==0){
87 responseCode = HttpStatus.BAD_REQUEST;
88 }else if(policyConfigs.size()==1){
89 for(PolicyConfig policyConfig: policyConfigs){
90 if(policyConfig.getPolicyConfigMessage()!=null && policyConfig.getPolicyConfigMessage().contains("PE300")){
91 responseCode = HttpStatus.BAD_REQUEST;
95 responseCode = HttpStatus.OK;
99 private void run() throws PolicyConfigException{
101 if(!getValidation()){
102 LOGGER.error(message);
103 throw new PolicyConfigException(message);
106 String modelString = getModel().toString();
107 LOGGER.debug("Generated JSON Request is: " + modelString);
108 if(configRequestParameters.getUnique()){
109 LOGGER.info("Requested for Unique Result only. ");
114 PDPServices pdpServices = new PDPServices();
115 responseCode = HttpStatus.OK;
116 policyConfigs = configResult(pdpServices.generateRequest(modelString, configRequestParameters.getRequestID(), unique, false));
118 policyConfigs = filterResults(policyConfigs, configRequestParameters);
119 } catch (Exception e) {
120 LOGGER.error(XACMLErrorConstants.ERROR_DATA_ISSUE + e);
121 responseCode = HttpStatus.BAD_REQUEST;
122 throw new PolicyConfigException(XACMLErrorConstants.ERROR_DATA_ISSUE +e);
126 private Collection<PolicyConfig> configResult(
127 Collection<PDPResponse> generateRequest) {
128 Collection<PolicyConfig> result = new HashSet<PolicyConfig>();
129 if (generateRequest == null) {
132 if (!generateRequest.isEmpty()) {
133 for (PDPResponse stdStatus : generateRequest) {
134 PolicyConfig policyConfig = new PolicyConfig();
135 policyConfig.setConfig(stdStatus.getConfig());
136 policyConfig.setMatchingConditions(stdStatus.getMatchingConditions());
137 policyConfig.setPolicyConfigMessage(stdStatus.getPolicyConfigMessage());
138 policyConfig.setPolicyConfigStatus(stdStatus.getPolicyConfigStatus());
139 policyConfig.setPolicyName(stdStatus.getPolicyName());
140 policyConfig.setPolicyVersion(stdStatus.getPolicyVersion());
141 policyConfig.setProperty(stdStatus.getProperty());
142 policyConfig.setResponseAttributes(stdStatus.getResponseAttributes());
143 policyConfig.setType(stdStatus.getType());
144 result.add(policyConfig);
150 // Filter logic required for results comparing with requests.
151 private Collection<PolicyConfig> filterResults(
152 Collection<PolicyConfig> policyConfigs,
153 ConfigRequestParameters configRequestParameters) {
154 List<PolicyConfig> policyConfig = new ArrayList<PolicyConfig>();
155 for(PolicyConfig config: policyConfigs){
156 if(config.getPolicyName()!=null && configRequestParameters.getPolicyName()!=null && configRequestParameters.getPolicyName().trim().length()>0){
157 if(!config.getPolicyName().matches(configRequestParameters.getPolicyName())){
161 if(config.getMatchingConditions()!=null && config.getMatchingConditions().size()>0){
162 if(configRequestParameters.getEcompName()!=null && configRequestParameters.getEcompName().trim().length()>0 && config.getMatchingConditions().containsKey("ECOMPName")){
163 if(!config.getMatchingConditions().get("ECOMPName").matches(configRequestParameters.getEcompName())){
167 if(configRequestParameters.getConfigName()!=null && configRequestParameters.getConfigName().trim().length()>0 && config.getMatchingConditions().containsKey("ConfigName")){
168 if(!config.getMatchingConditions().get("ConfigName").matches(configRequestParameters.getConfigName())){
172 if(configRequestParameters.getConfigAttributes()!=null && configRequestParameters.getConfigAttributes().size()>0){
173 boolean flag = false;
174 for(String key: configRequestParameters.getConfigAttributes().keySet()){
175 if(!config.getMatchingConditions().containsKey(key) || !config.getMatchingConditions().get(key).matches(configRequestParameters.getConfigAttributes().get(key))){
185 policyConfig.add(config);
187 if(policyConfig.size()==0){
188 PolicyConfig pConfig = new PolicyConfig();
189 pConfig.setPolicyConfigStatus(PolicyConfigStatus.CONFIG_NOT_FOUND);
190 pConfig.setPolicyConfigMessage(XACMLErrorConstants.ERROR_DATA_ISSUE+"No Match Found, for the parameters sent.");
191 policyConfig.add(pConfig);
196 private JsonObject getModel() throws PolicyConfigException{
197 String policyName = configRequestParameters.getPolicyName();
198 if(policyName!= null && !policyName.trim().isEmpty() && !policyName.endsWith("xml")){
199 policyName = policyName + ".[\\d].*";
200 configRequestParameters.setPolicyName(policyName);
202 JsonArrayBuilder subjectArray = Json.createArrayBuilder();
203 JsonArrayBuilder resourceArray = Json.createArrayBuilder();
204 if(configRequestParameters.getPolicyName()!=null){
205 JsonObjectBuilder subjectBuilder = Json.createObjectBuilder();
206 subjectBuilder.add("Value", policyName);
207 subjectBuilder.add("AttributeId", "PolicyName");
208 subjectArray.add(subjectBuilder);
210 LOGGER.info("PolicyName values are not given. ");
212 if(configRequestParameters.getEcompName()!=null){
213 JsonObjectBuilder subjectBuilder = Json.createObjectBuilder();
214 subjectBuilder.add("Value", configRequestParameters.getEcompName());
215 subjectBuilder.add("AttributeId", "ECOMPName");
216 subjectArray.add(subjectBuilder);
217 if(configRequestParameters.getConfigName()!=null){
218 subjectBuilder = Json.createObjectBuilder();
219 subjectBuilder.add("Value", configRequestParameters.getConfigName());
220 subjectBuilder.add("AttributeId", "ConfigName");
221 subjectArray.add(subjectBuilder);
222 resourceArray = getResourceArray(configRequestParameters.getConfigAttributes());
224 LOGGER.info("Config Name is not given. ");
227 LOGGER.info("Ecomp Name is not given. ");
229 JsonObject model = Json.createObjectBuilder()
230 .add("Request",Json.createObjectBuilder()
231 .add("AccessSubject",Json.createObjectBuilder()
232 .add("Attribute",subjectArray))
233 .add("Action",Json.createObjectBuilder()
234 .add("Attribute",Json.createObjectBuilder()
235 .add("Value","ACCESS")
236 .add("AttributeId","urn:oasis:names:tc:xacml:1.0:action:action-id")))
237 .add("Resource",Json.createObjectBuilder()
238 .add("Attribute",resourceArray
239 .add(Json.createObjectBuilder()
240 .add("Value","Config")
241 .add("AttributeId","urn:oasis:names:tc:xacml:1.0:resource:resource-id")))))
246 private JsonArrayBuilder getResourceArray(Map<String, String> configAttributes) throws PolicyConfigException{
247 JsonArrayBuilder resourceArray = Json.createArrayBuilder();
248 configAttributes = configRequestParameters.getConfigAttributes();
249 if (configAttributes != null && !configAttributes.isEmpty()) {
250 if(!configAttributes.containsKey("RiskType")){
251 configAttributes.put("RiskType", ".*");
253 if(!configAttributes.containsKey("RiskLevel")){
254 configAttributes.put("RiskLevel", ".*");
256 if(!configAttributes.containsKey("guard")){
257 configAttributes.put("guard", ".*");
259 if(!configAttributes.containsKey("TTLDate")){
260 configAttributes.put("TTLDate", ".*");
263 // ConfigAttributes is Null. So add basic values.
264 configAttributes = new HashMap<String,String>();
265 configAttributes.put("RiskType", ".*");
266 configAttributes.put("RiskLevel", ".*");
267 configAttributes.put("guard", ".*");
268 configAttributes.put("TTLDate", ".*");
270 for (String key : configAttributes.keySet()) {
272 String message = XACMLErrorConstants.ERROR_DATA_ISSUE + "Cannot have an Empty Key";
273 LOGGER.error(message);
274 throw new PolicyConfigException(message);
276 JsonObjectBuilder resourceBuilder = Json.createObjectBuilder();
277 resourceBuilder.add("Value", configAttributes.get(key));
278 resourceBuilder.add("AttributeId", key);
279 resourceArray.add(resourceBuilder);
281 return resourceArray;
284 private Boolean getValidation(){
285 if(configRequestParameters==null){
286 message = XACMLErrorConstants.ERROR_DATA_ISSUE + "No config Request Parameters given.";
289 if(configRequestParameters.getEcompName()==null && configRequestParameters.getPolicyName()==null){
290 message = XACMLErrorConstants.ERROR_DATA_ISSUE + "Cannot proceed without eCOMPComponentName or PolicyName";
296 public Collection<PolicyConfig> getResult() {
297 return policyConfigs;
300 public HttpStatus getResponseCode() {