98340b2d5054cadc0f1cb11758410b8b18d2fa16
[policy/xacml-pdp.git] / main / src / main / java / org / onap / policy / pdpx / main / rest / provider / DecisionProvider.java
1 /*-
2  * ============LICENSE_START=======================================================
3  * Copyright (C) 2019-2020, 2022 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.pdpx.main.rest.provider;
22
23 import com.att.research.xacml.api.Request;
24 import com.att.research.xacml.api.Response;
25 import com.att.research.xacml.api.Result;
26 import java.util.Map;
27 import org.apache.commons.lang3.tuple.Pair;
28 import org.onap.policy.models.decisions.concepts.DecisionException;
29 import org.onap.policy.models.decisions.concepts.DecisionRequest;
30 import org.onap.policy.models.decisions.concepts.DecisionResponse;
31 import org.onap.policy.pdp.xacml.application.common.XacmlApplicationServiceProvider;
32 import org.onap.policy.pdpx.main.rest.XacmlPdpApplicationManager;
33 import org.onap.policy.pdpx.main.rest.XacmlPdpStatisticsManager;
34 import org.onap.policy.xacml.pdp.application.nativ.NativePdpApplication;
35 import org.slf4j.Logger;
36 import org.slf4j.LoggerFactory;
37
38
39 public class DecisionProvider {
40     private static final Logger LOGGER = LoggerFactory.getLogger(DecisionProvider.class);
41
42     /**
43      * Retrieves the policy decision for the specified parameters.
44      *
45      * @param request DecisionRequest
46      * @param queryParams Map of parameters
47      * @return DecisionResponse
48      */
49     public DecisionResponse fetchDecision(DecisionRequest request, Map<String, String[]> queryParams) {
50         LOGGER.debug("Fetching decision {}", request);
51         //
52         // Find application for this decision
53         //
54         XacmlApplicationServiceProvider application = findApplication(request);
55         //
56         // Found application for action
57         //
58         Pair<DecisionResponse, Response> decision = application.makeDecision(request, queryParams);
59         //
60         // Calculate statistics
61         //
62         this.calculateStatistic(decision.getValue(), application.applicationName());
63         //
64         // Return the decision
65         //
66         return decision.getKey();
67     }
68
69     /**
70      * Retrieves the policy decision for the native xacml request.
71      *
72      * @param request the xacml request
73      * @return the xacml response
74      */
75     public Response fetchNativeDecision(Request request) {
76         LOGGER.debug("Fetching decision {}", request);
77         //
78         // Assign native request to native application directly
79         //
80         XacmlApplicationServiceProvider nativeApp = findNativeApplication();
81         //
82         // Make xacml decision
83         //
84         Response decision = ((NativePdpApplication) nativeApp).makeNativeDecision(request);
85         LOGGER.debug("Xacml decision {}", decision);
86         //
87         // Calculate statistics
88         //
89         this.calculateStatistic(decision, nativeApp.applicationName());
90         //
91         // Return the string decision
92         //
93         return decision;
94     }
95
96     private XacmlApplicationServiceProvider findApplication(DecisionRequest request) {
97         XacmlApplicationServiceProvider application = XacmlPdpApplicationManager.getCurrent().findApplication(request);
98         if (application != null) {
99             return application;
100         }
101         throw new DecisionException(javax.ws.rs.core.Response.Status.BAD_REQUEST,
102                 "No application for action " + request.getAction());
103     }
104
105     private XacmlApplicationServiceProvider findNativeApplication() {
106         XacmlApplicationServiceProvider application = XacmlPdpApplicationManager.getCurrent().findNativeApplication();
107         if (application instanceof NativePdpApplication) {
108             return application;
109         }
110         throw new DecisionException(javax.ws.rs.core.Response.Status.INTERNAL_SERVER_ERROR,
111                 "Native PDP application cannot be found");
112     }
113
114     private void calculateStatistic(Response xacmlResponse, String appName) {
115         if (xacmlResponse == null) {
116             XacmlPdpStatisticsManager.getCurrent().updateErrorCount();
117             return;
118         }
119         for (Result result : xacmlResponse.getResults()) {
120             switch (result.getDecision()) {
121                 case PERMIT:
122                     XacmlPdpStatisticsManager.getCurrent().updatePermitDecisionsCount(appName);
123                     break;
124
125                 case DENY:
126                     XacmlPdpStatisticsManager.getCurrent().updateDenyDecisionsCount(appName);
127                     break;
128
129                 case INDETERMINATE:
130                 case INDETERMINATE_DENY:
131                 case INDETERMINATE_DENYPERMIT:
132                 case INDETERMINATE_PERMIT:
133                     XacmlPdpStatisticsManager.getCurrent().updateIndeterminantDecisionsCount(appName);
134                     break;
135
136                 case NOTAPPLICABLE:
137                     XacmlPdpStatisticsManager.getCurrent().updateNotApplicableDecisionsCount(appName);
138                     break;
139
140                 default:
141                     break;
142             }
143         }
144     }
145 }