Merge "Add Control Loop Coordination policy."
[policy/xacml-pdp.git] / applications / common / src / main / java / org / onap / policy / pdp / xacml / application / common / std / StdOnapPip.java
1 /*-
2  * ============LICENSE_START=======================================================
3  * Copyright (C) 2019 AT&T Intellectual Property. All rights reserved.
4  * ================================================================================
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at
8  *
9  *      http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  *
17  * SPDX-License-Identifier: Apache-2.0
18  * ============LICENSE_END=========================================================
19  */
20
21 package org.onap.policy.pdp.xacml.application.common.std;
22
23 import com.att.research.xacml.api.Attribute;
24 import com.att.research.xacml.api.AttributeValue;
25 import com.att.research.xacml.api.Identifier;
26 import com.att.research.xacml.api.XACML3;
27 import com.att.research.xacml.api.pip.PIPException;
28 import com.att.research.xacml.api.pip.PIPFinder;
29 import com.att.research.xacml.api.pip.PIPRequest;
30 import com.att.research.xacml.api.pip.PIPResponse;
31 import com.att.research.xacml.std.StdMutableAttribute;
32 import com.att.research.xacml.std.datatypes.DataTypes;
33 import com.att.research.xacml.std.pip.StdMutablePIPResponse;
34 import com.att.research.xacml.std.pip.StdPIPRequest;
35 import com.att.research.xacml.std.pip.engines.StdConfigurableEngine;
36
37 import java.math.BigInteger;
38 import java.util.Arrays;
39 import java.util.Collection;
40 import java.util.Collections;
41 import java.util.Iterator;
42 import java.util.Properties;
43
44 import javax.persistence.EntityManager;
45
46 import org.onap.policy.pdp.xacml.application.common.ToscaDictionary;
47 import org.slf4j.Logger;
48 import org.slf4j.LoggerFactory;
49
50
51 public abstract class StdOnapPip extends StdConfigurableEngine {
52     protected static Logger logger = LoggerFactory.getLogger(StdOnapPip.class);
53
54     protected static final PIPRequest PIP_REQUEST_ACTOR   = new StdPIPRequest(
55             XACML3.ID_ATTRIBUTE_CATEGORY_RESOURCE,
56             ToscaDictionary.ID_RESOURCE_GUARD_ACTOR,
57             XACML3.ID_DATATYPE_STRING);
58
59     protected static final PIPRequest PIP_REQUEST_RECIPE  = new StdPIPRequest(
60             XACML3.ID_ATTRIBUTE_CATEGORY_RESOURCE,
61             ToscaDictionary.ID_RESOURCE_GUARD_RECIPE,
62             XACML3.ID_DATATYPE_STRING);
63
64     protected static final PIPRequest PIP_REQUEST_TARGET  = new StdPIPRequest(
65             XACML3.ID_ATTRIBUTE_CATEGORY_RESOURCE,
66             ToscaDictionary.ID_RESOURCE_GUARD_TARGETID,
67             XACML3.ID_DATATYPE_STRING);
68
69     protected Properties properties;
70     protected EntityManager em;
71
72     public StdOnapPip() {
73         super();
74     }
75
76     @Override
77     public Collection<PIPRequest> attributesProvided() {
78         return Collections.emptyList();
79     }
80
81     @Override
82     public void configure(String id, Properties properties) throws PIPException {
83         super.configure(id, properties);
84         logger.debug("Configuring historyDb PIP {}", properties);
85         this.properties = properties;
86     }
87
88     protected String getAttribute(PIPFinder pipFinder, PIPRequest pipRequest) {
89         //
90         // Get the actor value
91         //
92         PIPResponse pipResponse = this.getAttribute(pipRequest, pipFinder);
93         if (pipResponse == null) {
94             logger.error("Need actor attribute which is not found");
95             return null;
96         }
97         //
98         // Find the actor
99         //
100         return findFirstAttributeValue(pipResponse);
101     }
102
103     protected PIPResponse getAttribute(PIPRequest pipRequest, PIPFinder pipFinder) {
104         PIPResponse pipResponse = null;
105         try {
106             pipResponse = pipFinder.getMatchingAttributes(pipRequest, this);
107             if (pipResponse.getStatus() != null && !pipResponse.getStatus().isOk()) {
108                 if (logger.isInfoEnabled()) {
109                     logger.info("get attribute error retrieving {}: {}", pipRequest.getAttributeId().stringValue(),
110                         pipResponse.getStatus());
111                 }
112                 pipResponse = null;
113             }
114             if (pipResponse != null && pipResponse.getAttributes().isEmpty()) {
115                 if (logger.isInfoEnabled()) {
116                     logger.info("No value for {}", pipRequest.getAttributeId().stringValue());
117                 }
118                 pipResponse = null;
119             }
120         } catch (PIPException ex) {
121             logger.error("PIPException getting subject-id attribute: " + ex.getMessage(), ex);
122         }
123         return pipResponse;
124     }
125
126     protected String findFirstAttributeValue(PIPResponse pipResponse) {
127         for (Attribute attribute: pipResponse.getAttributes()) {
128             Iterator<AttributeValue<String>> iterAttributeValues    = attribute.findValues(DataTypes.DT_STRING);
129             if (iterAttributeValues != null) {
130                 while (iterAttributeValues.hasNext()) {
131                     String value   = iterAttributeValues.next().getValue();
132                     if (value != null) {
133                         return value;
134                     }
135                 }
136             }
137         }
138         return null;
139     }
140
141     protected void addIntegerAttribute(StdMutablePIPResponse stdPipResponse, Identifier category,
142             Identifier attributeId, int value, PIPRequest pipRequest) {
143         AttributeValue<BigInteger> attributeValue   = null;
144         try {
145             attributeValue  = DataTypes.DT_INTEGER.createAttributeValue(value);
146         } catch (Exception e) {
147             logger.error("Failed to convert {} to integer {}", value, e);
148         }
149         if (attributeValue != null) {
150             stdPipResponse.addAttribute(new StdMutableAttribute(category, attributeId, attributeValue,
151                     pipRequest.getIssuer(), false));
152         }
153     }
154
155     protected void addLongAttribute(StdMutablePIPResponse stdPipResponse, Identifier category,
156             Identifier attributeId, long value, PIPRequest pipRequest) {
157         AttributeValue<BigInteger> attributeValue   = null;
158         try {
159             attributeValue  = DataTypes.DT_INTEGER.createAttributeValue(value);
160         } catch (Exception e) {
161             logger.error("Failed to convert {} to long {}", value, e);
162         }
163         if (attributeValue != null) {
164             stdPipResponse.addAttribute(new StdMutableAttribute(category, attributeId, attributeValue,
165                     pipRequest.getIssuer(), false));
166         }
167     }
168
169     protected void addStringAttribute(StdMutablePIPResponse stdPipResponse, Identifier category, Identifier attributeId,
170             String value, PIPRequest pipRequest) {
171         AttributeValue<String> attributeValue = null;
172         try {
173             attributeValue = DataTypes.DT_STRING.createAttributeValue(value);
174         } catch (Exception ex) {
175             logger.error("Failed to convert {} to an AttributeValue<String>", value, ex);
176         }
177         if (attributeValue != null) {
178             stdPipResponse.addAttribute(new StdMutableAttribute(category, attributeId, attributeValue,
179                     pipRequest.getIssuer(), false));
180         }
181     }
182
183 }