/*- * ============LICENSE_START======================================================= * ONAP * ================================================================================ * Copyright (C) 2019 AT&T Intellectual Property. All rights reserved. * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * * SPDX-License-Identifier: Apache-2.0 * ============LICENSE_END========================================================= */ package org.onap.policy.pdp.xacml.application.common.std; import com.att.research.xacml.api.AttributeValue; import com.att.research.xacml.api.DataType; import com.att.research.xacml.api.DataTypeException; import com.att.research.xacml.api.DataTypeFactory; import com.att.research.xacml.api.Request; import com.att.research.xacml.api.XACML3; import com.att.research.xacml.std.IdentifierImpl; import com.att.research.xacml.std.StdMutableAttribute; import com.att.research.xacml.std.StdMutableRequest; import com.att.research.xacml.std.StdMutableRequestAttributes; import com.att.research.xacml.std.annotations.RequestParser; import com.att.research.xacml.std.annotations.XACMLAction; import com.att.research.xacml.std.annotations.XACMLRequest; import com.att.research.xacml.std.annotations.XACMLSubject; import com.att.research.xacml.util.FactoryException; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.Map; import java.util.Map.Entry; import lombok.Getter; import lombok.Setter; import lombok.ToString; import org.onap.policy.models.decisions.concepts.DecisionRequest; import org.onap.policy.pdp.xacml.application.common.ToscaDictionary; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @Getter @Setter @ToString @XACMLRequest(ReturnPolicyIdList = true) public class StdMatchablePolicyRequest { private static final Logger LOGGER = LoggerFactory.getLogger(StdMatchablePolicyRequest.class); @XACMLSubject(includeInResults = true) private String onapName; @XACMLSubject(attributeId = "urn:org:onap:onap-component", includeInResults = true) private String onapComponent; @XACMLSubject(attributeId = "urn:org:onap:onap-instance", includeInResults = true) private String onapInstance; @XACMLAction() private String action; public StdMatchablePolicyRequest() { super(); } protected static DataTypeFactory dataTypeFactory = null; protected static synchronized DataTypeFactory getDataTypeFactory() { try { if (dataTypeFactory != null) { return dataTypeFactory; } dataTypeFactory = DataTypeFactory.newInstance(); if (dataTypeFactory == null) { LOGGER.error("Could not create data type factory"); } } catch (FactoryException e) { LOGGER.error("Can't get Data type Factory: {}", e); } return dataTypeFactory; } /** * Parses the DecisionRequest into a MonitoringRequest. * * @param decisionRequest Input DecisionRequest * @return Request XACML Request object * @throws DataTypeException DataType exception * @throws IllegalAccessException Illegal access exception */ @SuppressWarnings({"rawtypes", "unchecked"}) public static Request createInstance(DecisionRequest decisionRequest) throws IllegalAccessException, DataTypeException { // // Create our request object // StdMatchablePolicyRequest request = new StdMatchablePolicyRequest(); // // Add the subject attributes // request.onapName = decisionRequest.getOnapName(); request.onapComponent = decisionRequest.getOnapComponent(); request.onapInstance = decisionRequest.getOnapInstance(); // // Add the action attribute // request.action = decisionRequest.getAction(); // // Parse the request - we use the annotations to create a // basic XACML request. // Request xacmlRequest = RequestParser.parseRequest(request); // // Create an object we can add to // StdMutableRequest mutableRequest = new StdMutableRequest(xacmlRequest); StdMutableRequestAttributes resourceAttributes = new StdMutableRequestAttributes(); resourceAttributes.setCategory(XACML3.ID_ATTRIBUTE_CATEGORY_RESOURCE); // // Add the resource attributes // Map resources = decisionRequest.getResource(); for (Entry entrySet : resources.entrySet()) { // // Making an assumption that these fields are matchable. // Its possible we may have to load the policy type model // and use that to validate the fields that are matchable. // if (entrySet.getValue() instanceof Collection) { addResources(resourceAttributes, (Collection) entrySet.getValue(), entrySet.getKey()); } else { addResources(resourceAttributes, Arrays.asList(entrySet.getValue().toString()), entrySet.getKey()); } } mutableRequest.add(resourceAttributes); return mutableRequest; } private static StdMutableRequestAttributes addResources(StdMutableRequestAttributes attributes, Collection values, String id) throws DataTypeException { DataTypeFactory factory = getDataTypeFactory(); if (factory == null) { return null; } for (Object value : values) { StdMutableAttribute mutableAttribute = new StdMutableAttribute(); mutableAttribute.setCategory(XACML3.ID_ATTRIBUTE_CATEGORY_RESOURCE); mutableAttribute.setAttributeId(new IdentifierImpl(ToscaDictionary.ID_RESOURCE_MATCHABLE + id)); mutableAttribute.setIncludeInResults(true); DataType dataTypeExtended = factory.getDataType(XACML3.ID_DATATYPE_STRING); AttributeValue attributeValue = dataTypeExtended.createAttributeValue(value); Collection> attributeValues = new ArrayList<>(); attributeValues.add(attributeValue); mutableAttribute.setValues(attributeValues); attributes.add(mutableAttribute); } return attributes; } }