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
9 * http://www.apache.org/licenses/LICENSE-2.0
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.
17 * SPDX-License-Identifier: Apache-2.0
18 * ============LICENSE_END=========================================================
21 package org.onap.policy.pdp.xacml.application.common.std;
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;
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;
44 import javax.persistence.EntityManager;
46 import org.onap.policy.pdp.xacml.application.common.ToscaDictionary;
47 import org.slf4j.Logger;
48 import org.slf4j.LoggerFactory;
51 public abstract class StdOnapPip extends StdConfigurableEngine {
52 protected static Logger logger = LoggerFactory.getLogger(StdOnapPip.class);
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);
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);
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);
69 protected Properties properties;
70 protected EntityManager em;
77 public Collection<PIPRequest> attributesProvided() {
78 return Collections.emptyList();
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;
88 protected String getAttribute(PIPFinder pipFinder, PIPRequest pipRequest) {
90 // Get the actor value
92 PIPResponse pipResponse = this.getAttribute(pipRequest, pipFinder);
93 if (pipResponse == null) {
94 logger.error("Need actor attribute which is not found");
100 return findFirstAttributeValue(pipResponse);
103 protected PIPResponse getAttribute(PIPRequest pipRequest, PIPFinder pipFinder) {
104 PIPResponse pipResponse = null;
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());
114 if (pipResponse != null && pipResponse.getAttributes().isEmpty()) {
115 if (logger.isInfoEnabled()) {
116 logger.info("No value for {}", pipRequest.getAttributeId().stringValue());
120 } catch (PIPException ex) {
121 logger.error("PIPException getting subject-id attribute: " + ex.getMessage(), ex);
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();
141 protected void addIntegerAttribute(StdMutablePIPResponse stdPipResponse, Identifier category,
142 Identifier attributeId, int value, PIPRequest pipRequest) {
143 AttributeValue<BigInteger> attributeValue = null;
145 attributeValue = DataTypes.DT_INTEGER.createAttributeValue(value);
146 } catch (Exception e) {
147 logger.error("Failed to convert {} to integer {}", value, e);
149 if (attributeValue != null) {
150 stdPipResponse.addAttribute(new StdMutableAttribute(category, attributeId, attributeValue,
151 pipRequest.getIssuer(), false));
155 protected void addLongAttribute(StdMutablePIPResponse stdPipResponse, Identifier category,
156 Identifier attributeId, long value, PIPRequest pipRequest) {
157 AttributeValue<BigInteger> attributeValue = null;
159 attributeValue = DataTypes.DT_INTEGER.createAttributeValue(value);
160 } catch (Exception e) {
161 logger.error("Failed to convert {} to long {}", value, e);
163 if (attributeValue != null) {
164 stdPipResponse.addAttribute(new StdMutableAttribute(category, attributeId, attributeValue,
165 pipRequest.getIssuer(), false));
169 protected void addStringAttribute(StdMutablePIPResponse stdPipResponse, Identifier category, Identifier attributeId,
170 String value, PIPRequest pipRequest) {
171 AttributeValue<String> attributeValue = null;
173 attributeValue = DataTypes.DT_STRING.createAttributeValue(value);
174 } catch (Exception ex) {
175 logger.error("Failed to convert {} to an AttributeValue<String>", value, ex);
177 if (attributeValue != null) {
178 stdPipResponse.addAttribute(new StdMutableAttribute(category, attributeId, attributeValue,
179 pipRequest.getIssuer(), false));