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=========================================================
21 package org.onap.policy.pap.xacml.rest.components;
23 import java.io.BufferedWriter;
25 import java.io.FileWriter;
26 import java.io.IOException;
27 import java.nio.file.Path;
28 import java.nio.file.Paths;
29 import java.util.HashMap;
30 import java.util.LinkedList;
31 import java.util.List;
34 import javax.persistence.EntityManager;
35 import javax.persistence.Query;
37 import oasis.names.tc.xacml._3_0.core.schema.wd_17.AllOfType;
38 import oasis.names.tc.xacml._3_0.core.schema.wd_17.AnyOfType;
39 import oasis.names.tc.xacml._3_0.core.schema.wd_17.ApplyType;
40 import oasis.names.tc.xacml._3_0.core.schema.wd_17.AttributeAssignmentExpressionType;
41 import oasis.names.tc.xacml._3_0.core.schema.wd_17.AttributeDesignatorType;
42 import oasis.names.tc.xacml._3_0.core.schema.wd_17.AttributeValueType;
43 import oasis.names.tc.xacml._3_0.core.schema.wd_17.ConditionType;
44 import oasis.names.tc.xacml._3_0.core.schema.wd_17.EffectType;
45 import oasis.names.tc.xacml._3_0.core.schema.wd_17.MatchType;
46 import oasis.names.tc.xacml._3_0.core.schema.wd_17.ObjectFactory;
47 import oasis.names.tc.xacml._3_0.core.schema.wd_17.ObligationExpressionType;
48 import oasis.names.tc.xacml._3_0.core.schema.wd_17.ObligationExpressionsType;
49 import oasis.names.tc.xacml._3_0.core.schema.wd_17.PolicyType;
50 import oasis.names.tc.xacml._3_0.core.schema.wd_17.RuleType;
51 import oasis.names.tc.xacml._3_0.core.schema.wd_17.TargetType;
53 import org.onap.policy.pap.xacml.rest.XACMLPapServlet;
54 import org.onap.policy.pap.xacml.rest.util.JPAUtils;
55 import org.onap.policy.rest.adapter.PolicyRestAdapter;
56 import org.onap.policy.rest.jpa.ActionPolicyDict;
57 import org.onap.policy.rest.jpa.Datatype;
58 import org.onap.policy.rest.jpa.FunctionDefinition;
59 import org.onap.policy.xacml.api.XACMLErrorConstants;
61 import com.att.research.xacml.api.pap.PAPException;
63 import org.onap.policy.common.logging.eelf.MessageCodes;
64 import org.onap.policy.common.logging.eelf.PolicyLogger;
65 import org.onap.policy.common.logging.flexlogger.FlexLogger;
66 import org.onap.policy.common.logging.flexlogger.Logger;
68 public class ActionPolicy extends Policy {
73 private static final Logger LOGGER = FlexLogger.getLogger(ActionPolicy.class);
75 public static final String JSON_CONFIG = "JSON";
77 public static final String PDP_ACTION = "PDP";
78 public static final String PEP_ACTION = "PEP";
79 public static final String TYPE_ACTION = "REST";
81 public static final String GET_METHOD = "GET";
82 public static final String PUT_METHOD = "PUT";
83 public static final String POST_METHOD = "POST";
85 public static final String PERFORMER_ATTRIBUTEID = "performer";
86 public static final String TYPE_ATTRIBUTEID = "type";
87 public static final String METHOD_ATTRIBUTEID = "method";
88 public static final String HEADERS_ATTRIBUTEID = "headers";
89 public static final String URL_ATTRIBUTEID = "url";
90 public static final String BODY_ATTRIBUTEID = "body";
92 List<String> dynamicLabelRuleAlgorithms = new LinkedList<>();
93 List<String> dynamicFieldFunctionRuleAlgorithms = new LinkedList<>();
94 List<String> dynamicFieldOneRuleAlgorithms = new LinkedList<>();
95 List<String> dynamicFieldTwoRuleAlgorithms = new LinkedList<>();
97 protected Map<String, String> dropDownMap = new HashMap<>();
99 private static boolean isAttribute = false;
100 private synchronized static boolean getAttribute () {
104 private static synchronized void setAttribute (boolean att) {
108 public ActionPolicy() {
112 public ActionPolicy(PolicyRestAdapter policyAdapter){
113 this.policyAdapter = policyAdapter;
117 public Map<String, String> savePolicies() throws PAPException {
119 Map<String, String> successMap = new HashMap<>();
120 if(isPolicyExists()){
121 successMap.put("EXISTS", "This Policy already exist on the PAP");
125 if(!ActionPolicy.getAttribute()) {
126 successMap.put("invalidAttribute", "Action Attrbute was not in the database.");
130 if(!isPreparedToSave()){
131 //Prep and configure the policy for saving
135 // Until here we prepared the data and here calling the method to create xml.
136 Path newPolicyPath = null;
137 newPolicyPath = Paths.get(policyAdapter.getNewFileName());
138 successMap = createPolicy(newPolicyPath,getCorrectPolicyDataObject() );
142 //This is the method for preparing the policy for saving. We have broken it out
143 //separately because the fully configured policy is used for multiple things
145 public boolean prepareToSave() throws PAPException{
147 if(isPreparedToSave()){
148 //we have already done this
153 String policyID = policyAdapter.getPolicyID();
154 version = policyAdapter.getHighestVersion();
156 // Create the Instance for pojo, PolicyType object is used in marshalling.
157 if (policyAdapter.getPolicyType().equals("Action")) {
158 PolicyType policyConfig = new PolicyType();
160 policyConfig.setVersion(Integer.toString(version));
161 policyConfig.setPolicyId(policyID);
162 policyConfig.setTarget(new TargetType());
163 policyAdapter.setData(policyConfig);
166 policyName = policyAdapter.getNewFileName();
168 if (policyAdapter.getData() != null) {
169 // Action body is optional so checking value provided or not
170 String comboDictValue = policyAdapter.getActionAttribute();
171 String actionBody = getActionPolicyDict(comboDictValue).getBody();
172 if(!(actionBody==null || "".equals(actionBody))){
173 saveActionBody(policyName, actionBody);
176 LOGGER.error(XACMLErrorConstants.ERROR_DATA_ISSUE + "Could not find " + comboDictValue + " in the ActionPolicyDict table.");
181 PolicyType actionPolicy = (PolicyType) policyAdapter.getData();
182 actionPolicy.setDescription(policyAdapter.getPolicyDescription());
183 actionPolicy.setRuleCombiningAlgId(policyAdapter.getRuleCombiningAlgId());
185 AllOfType allOf = new AllOfType();
187 Map<String, String> dynamicFieldComponentAttributes = policyAdapter.getDynamicFieldConfigAttributes();
189 // If there is any dynamic field attributes create the matches here
190 for (String keyField : dynamicFieldComponentAttributes.keySet()) {
191 String key = keyField;
192 String value = dynamicFieldComponentAttributes.get(key);
193 MatchType dynamicMatch = createDynamicMatch(key, value);
194 allOf.getMatch().add(dynamicMatch);
197 AnyOfType anyOf = new AnyOfType();
198 anyOf.getAllOf().add(allOf);
200 TargetType target = new TargetType();
201 target.getAnyOf().add(anyOf);
203 // Adding the target to the policy element
204 actionPolicy.setTarget(target);
206 RuleType rule = new RuleType();
207 rule.setRuleId(policyAdapter.getRuleID());
209 rule.setEffect(EffectType.PERMIT);
210 rule.setTarget(new TargetType());
212 dynamicLabelRuleAlgorithms = policyAdapter.getDynamicRuleAlgorithmLabels();
213 dynamicFieldFunctionRuleAlgorithms = policyAdapter.getDynamicRuleAlgorithmCombo();
214 dynamicFieldOneRuleAlgorithms = policyAdapter.getDynamicRuleAlgorithmField1();
215 dynamicFieldTwoRuleAlgorithms = policyAdapter.getDynamicRuleAlgorithmField2();
216 //dropDownMap = policyAdapter.getDropDownMap();
217 dropDownMap = createDropDownMap();
219 // Rule attributes are optional and dynamic so check and add them to condition.
220 if (dynamicLabelRuleAlgorithms != null && dynamicLabelRuleAlgorithms.size() > 0) {
221 boolean isCompound = false;
222 ConditionType condition = new ConditionType();
223 int index = dynamicFieldOneRuleAlgorithms.size() - 1;
225 for (String labelAttr : dynamicLabelRuleAlgorithms) {
226 // if the rule algorithm as a label means it is a compound
227 if (dynamicFieldOneRuleAlgorithms.get(index).toString().equals(labelAttr)) {
228 ApplyType actionApply = new ApplyType();
230 String selectedFunction = (String) dynamicFieldFunctionRuleAlgorithms.get(index).toString();
231 String value1 = (String) dynamicFieldOneRuleAlgorithms.get(index).toString();
232 String value2 = dynamicFieldTwoRuleAlgorithms.get(index).toString();
233 actionApply.setFunctionId(dropDownMap.get(selectedFunction));
234 actionApply.getExpression().add(new ObjectFactory().createApply(getInnerActionApply(value1)));
235 actionApply.getExpression().add(new ObjectFactory().createApply(getInnerActionApply(value2)));
236 condition.setExpression(new ObjectFactory().createApply(actionApply));
240 // if rule algorithm not a compound
242 condition.setExpression(new ObjectFactory().createApply(getInnerActionApply(dynamicLabelRuleAlgorithms.get(index).toString())));
244 rule.setCondition(condition);
246 // set the obligations to rule
247 rule.setObligationExpressions(getObligationExpressions());
248 actionPolicy.getCombinerParametersOrRuleCombinerParametersOrVariableDefinition().add(rule);
249 policyAdapter.setPolicyData(actionPolicy);
251 PolicyLogger.error(MessageCodes.ERROR_DATA_ISSUE + "Unsupported data object." + policyAdapter.getData().getClass().getCanonicalName());
254 setPreparedToSave(true);
258 // Saving the json Configurations file if exists at server location for action policy.
259 private void saveActionBody(String policyName, String actionBodyData) {
261 if(policyName.endsWith(".xml")){
262 policyName = policyName.replace(".xml", "");
264 File file = new File(ACTION_HOME+ File.separator + policyName + ".json");
265 FileWriter fw = new FileWriter(file.getAbsoluteFile());
266 BufferedWriter bw = new BufferedWriter(fw);
267 bw.write(actionBodyData);
269 if (LOGGER.isInfoEnabled()) {
270 LOGGER.info("Action Body is succesfully saved at " + file.getAbsolutePath());
272 } catch (IOException e) {
273 LOGGER.error("Exception Occured"+e);
277 // Data required for obligation part is setting here.
278 private ObligationExpressionsType getObligationExpressions() {
279 ObligationExpressionsType obligations = new ObligationExpressionsType();
281 ObligationExpressionType obligation = new ObligationExpressionType();
282 String comboDictValue = policyAdapter.getActionAttribute();
283 obligation.setObligationId(comboDictValue);
284 obligation.setFulfillOn(EffectType.PERMIT);
286 // Add Action Assignment:
287 AttributeAssignmentExpressionType assignment1 = new AttributeAssignmentExpressionType();
288 assignment1.setAttributeId(PERFORMER_ATTRIBUTEID);
289 assignment1.setCategory(CATEGORY_RECIPIENT_SUBJECT);
291 AttributeValueType actionNameAttributeValue = new AttributeValueType();
292 actionNameAttributeValue.setDataType(STRING_DATATYPE);
293 actionNameAttributeValue.getContent().add(performer.get(policyAdapter.getActionPerformer()));
295 assignment1.setExpression(new ObjectFactory().createAttributeValue(actionNameAttributeValue));
296 obligation.getAttributeAssignmentExpression().add(assignment1);
298 // Add Type Assignment:
299 AttributeAssignmentExpressionType assignmentType = new AttributeAssignmentExpressionType();
300 assignmentType.setAttributeId(TYPE_ATTRIBUTEID);
301 assignmentType.setCategory(CATEGORY_RESOURCE);
303 AttributeValueType typeAttributeValue = new AttributeValueType();
304 typeAttributeValue.setDataType(STRING_DATATYPE);
305 String actionDictType = getActionPolicyDict(comboDictValue).getType();
306 typeAttributeValue.getContent().add(actionDictType);
308 assignmentType.setExpression(new ObjectFactory().createAttributeValue(typeAttributeValue));
309 obligation.getAttributeAssignmentExpression().add(assignmentType);
311 // Add Rest_URL Assignment:
312 AttributeAssignmentExpressionType assignmentURL = new AttributeAssignmentExpressionType();
313 assignmentURL.setAttributeId(URL_ATTRIBUTEID);
314 assignmentURL.setCategory(CATEGORY_RESOURCE);
316 AttributeValueType actionURLAttributeValue = new AttributeValueType();
317 actionURLAttributeValue.setDataType(URI_DATATYPE);
318 String actionDictUrl = getActionPolicyDict(comboDictValue).getUrl();
319 actionURLAttributeValue.getContent().add(actionDictUrl);
321 assignmentURL.setExpression(new ObjectFactory().createAttributeValue(actionURLAttributeValue));
322 obligation.getAttributeAssignmentExpression().add(assignmentURL);
324 // Add Method Assignment:
325 AttributeAssignmentExpressionType assignmentMethod = new AttributeAssignmentExpressionType();
326 assignmentMethod.setAttributeId(METHOD_ATTRIBUTEID);
327 assignmentMethod.setCategory(CATEGORY_RESOURCE);
329 AttributeValueType methodAttributeValue = new AttributeValueType();
330 methodAttributeValue.setDataType(STRING_DATATYPE);
331 String actionDictMethod = getActionPolicyDict(comboDictValue).getMethod();
332 methodAttributeValue.getContent().add(actionDictMethod);
334 assignmentMethod.setExpression(new ObjectFactory().createAttributeValue(methodAttributeValue));
335 obligation.getAttributeAssignmentExpression().add(assignmentMethod);
337 // Add JSON_URL Assignment:
338 String actionBody = getActionPolicyDict(comboDictValue).getBody();
339 if (actionBody != null) {
340 AttributeAssignmentExpressionType assignmentJsonURL = new AttributeAssignmentExpressionType();
341 assignmentJsonURL.setAttributeId(BODY_ATTRIBUTEID);
342 assignmentJsonURL.setCategory(CATEGORY_RESOURCE);
344 AttributeValueType jsonURLAttributeValue = new AttributeValueType();
345 jsonURLAttributeValue.setDataType(URI_DATATYPE);
346 jsonURLAttributeValue.getContent().add(CONFIG_URL + "/Action/" + policyName + ".json");
348 assignmentJsonURL.setExpression(new ObjectFactory().createAttributeValue(jsonURLAttributeValue));
349 obligation.getAttributeAssignmentExpression().add(assignmentJsonURL);
352 if(getActionPolicyDict(comboDictValue).getHeader() != null){
353 String headerVal = getActionPolicyDict(comboDictValue).getHeader();
354 if(headerVal != null && !headerVal.equals("")){
355 // parse it on : to get number of headers
356 String[] result = headerVal.split(":");
357 for (String eachString : result){
358 // parse each value on =
359 String[] textFieldVals = eachString.split("=");
360 obligation.getAttributeAssignmentExpression().add(addDynamicHeaders(textFieldVals[0], textFieldVals[1]));
366 obligations.getObligationExpression().add(obligation);
371 // if compound setting the inner apply here
372 protected ApplyType getInnerActionApply(String value1Label) {
373 ApplyType actionApply = new ApplyType();
375 // check the index for the label.
376 for (String labelAttr : dynamicLabelRuleAlgorithms) {
377 if (labelAttr.equals(value1Label)) {
378 String value1 = dynamicFieldOneRuleAlgorithms.get(index).toString();
379 // check if the row contains label again
380 for (String labelValue : dynamicLabelRuleAlgorithms) {
381 if (labelValue.equals(value1)) {
382 return getCompoundApply(index);
386 // Getting the values from the form.
387 String functionKey = dynamicFieldFunctionRuleAlgorithms.get(index).toString();
388 String value2 = dynamicFieldTwoRuleAlgorithms.get(index).toString();
389 actionApply.setFunctionId(dropDownMap.get(functionKey));
390 // if two text field are rule attributes.
391 if ((value1.contains(RULE_VARIABLE)) && (value2.contains(RULE_VARIABLE))) {
392 ApplyType innerActionApply1 = new ApplyType();
393 ApplyType innerActionApply2 = new ApplyType();
394 AttributeDesignatorType attributeDesignator1 = new AttributeDesignatorType();
395 AttributeDesignatorType attributeDesignator2 = new AttributeDesignatorType();
396 // If selected function is Integer function set integer functionID
397 if (functionKey.toLowerCase().contains("integer")) {
398 innerActionApply1.setFunctionId(FUNTION_INTEGER_ONE_AND_ONLY);
399 innerActionApply2.setFunctionId(FUNTION_INTEGER_ONE_AND_ONLY);
400 attributeDesignator1.setDataType(INTEGER_DATATYPE);
401 attributeDesignator2.setDataType(INTEGER_DATATYPE);
403 // If selected function is not a Integer function
404 // set String functionID
405 innerActionApply1.setFunctionId(FUNCTION_STRING_ONE_AND_ONLY);
406 innerActionApply2.setFunctionId(FUNCTION_STRING_ONE_AND_ONLY);
407 attributeDesignator1.setDataType(STRING_DATATYPE);
408 attributeDesignator2.setDataType(STRING_DATATYPE);
410 attributeDesignator1.setCategory(CATEGORY_RESOURCE);
411 attributeDesignator2.setCategory(CATEGORY_RESOURCE);
413 // Here set actual field values
414 attributeDesignator1.setAttributeId(value1.contains("resource:") ? value1.substring(9): value1.substring(8));
415 attributeDesignator2.setAttributeId(value1.contains("resource:") ? value1.substring(9): value1.substring(8));
417 innerActionApply1.getExpression().add(new ObjectFactory().createAttributeDesignator(attributeDesignator1));
418 innerActionApply2.getExpression().add(new ObjectFactory().createAttributeDesignator(attributeDesignator2));
420 actionApply.getExpression().add(new ObjectFactory().createApply(innerActionApply1));
421 actionApply.getExpression().add(new ObjectFactory().createApply(innerActionApply2));
423 } else {// if either of one text field is rule attribute.
424 ApplyType innerActionApply = new ApplyType();
425 AttributeDesignatorType attributeDesignator = new AttributeDesignatorType();
426 AttributeValueType actionConditionAttributeValue = new AttributeValueType();
428 if (functionKey.toLowerCase().contains("integer")) {
429 innerActionApply.setFunctionId(FUNTION_INTEGER_ONE_AND_ONLY);
430 actionConditionAttributeValue.setDataType(INTEGER_DATATYPE);
431 attributeDesignator.setDataType(INTEGER_DATATYPE);
433 innerActionApply.setFunctionId(FUNCTION_STRING_ONE_AND_ONLY);
434 actionConditionAttributeValue.setDataType(STRING_DATATYPE);
435 attributeDesignator.setDataType(STRING_DATATYPE);
438 String attributeId = null;
439 String attributeValue = null;
441 // Find which textField has rule attribute and set it as
442 attributeId = value1;
443 attributeValue = value2;
445 if (attributeId != null) {
446 attributeDesignator.setCategory(CATEGORY_RESOURCE);
447 attributeDesignator.setAttributeId(attributeId);
449 actionConditionAttributeValue.getContent().add(attributeValue);
450 innerActionApply.getExpression().add(new ObjectFactory().createAttributeDesignator(attributeDesignator));
451 // Decide the order of element based the values.
452 if (attributeId.equals(value1)) {
453 actionApply.getExpression().add(new ObjectFactory().createApply(innerActionApply));
454 actionApply.getExpression().add(new ObjectFactory().createAttributeValue(actionConditionAttributeValue));
456 actionApply.getExpression().add(new ObjectFactory().createAttributeValue(actionConditionAttributeValue));
457 actionApply.getExpression().add(new ObjectFactory().createApply(innerActionApply));
466 // if the rule algorithm is multiple compound one setting the apply
467 protected ApplyType getCompoundApply(int index) {
468 ApplyType actionApply = new ApplyType();
469 String selectedFunction = dynamicFieldFunctionRuleAlgorithms.get(index).toString();
470 String value1 = dynamicFieldOneRuleAlgorithms.get(index).toString();
471 String value2 = dynamicFieldTwoRuleAlgorithms.get(index).toString();
472 actionApply.setFunctionId(dropDownMap.get(selectedFunction));
473 actionApply.getExpression().add(new ObjectFactory().createApply(getInnerActionApply(value1)));
474 actionApply.getExpression().add(new ObjectFactory().createApply(getInnerActionApply(value2)));
478 // Adding the dynamic headers if any
479 private AttributeAssignmentExpressionType addDynamicHeaders(String header, String value) {
480 AttributeAssignmentExpressionType assignmentHeaders = new AttributeAssignmentExpressionType();
481 assignmentHeaders.setAttributeId("headers:" + header);
482 assignmentHeaders.setCategory(CATEGORY_RESOURCE);
484 AttributeValueType headersAttributeValue = new AttributeValueType();
485 headersAttributeValue.setDataType(STRING_DATATYPE);
486 headersAttributeValue.getContent().add(value);
488 assignmentHeaders.setExpression(new ObjectFactory().createAttributeValue(headersAttributeValue));
489 return assignmentHeaders;
492 private Map<String,String> createDropDownMap(){
493 JPAUtils jpaUtils = null;
494 Map<String, String> dropDownMap = new HashMap<>();
496 jpaUtils = JPAUtils.getJPAUtilsInstance(XACMLPapServlet.getEmf());
497 } catch (Exception e) {
498 LOGGER.error("Exception Occured"+e);
500 if(jpaUtils != null){
501 Map<Datatype, List<FunctionDefinition>> functionMap = jpaUtils.getFunctionDatatypeMap();
503 for (Datatype id : functionMap.keySet()) {
504 List<FunctionDefinition> functionDefinitions = (List<FunctionDefinition>) functionMap
506 for (FunctionDefinition functionDef : functionDefinitions) {
507 dropDownMap.put(functionDef.getShortname(),functionDef.getXacmlid());
514 private ActionPolicyDict getActionPolicyDict(String attributeName){
515 ActionPolicyDict retObj = new ActionPolicyDict();
516 EntityManager em = XACMLPapServlet.getEmf().createEntityManager();
517 Query getActionPolicyDicts = em.createNamedQuery("ActionPolicyDict.findAll");
518 List<?> actionPolicyDicts = getActionPolicyDicts.getResultList();
520 for (Object id : actionPolicyDicts) {
521 ActionPolicyDict actionPolicy = (ActionPolicyDict) id;
522 if(attributeName.equals(actionPolicy.getAttributeName())){
524 retObj = actionPolicy;
533 public Object getCorrectPolicyDataObject() {
534 return policyAdapter.getPolicyData();