Checkstyle improvements
[clamp.git] / src / main / java / org / onap / clamp / clds / model / actions / ActionsHandler.java
1 /*-
2  * ============LICENSE_START=======================================================
3  * ONAP CLAMP
4  * ================================================================================
5  * Copyright (C) 2018-2019 AT&T Intellectual Property. All rights
6  *                             reserved.
7  * ================================================================================
8  * Licensed under the Apache License, Version 2.0 (the "License");
9  * you may not use this file except in compliance with the License.
10  * You may obtain a copy of the License at
11  *
12  * http://www.apache.org/licenses/LICENSE-2.0
13  *
14  * Unless required by applicable law or agreed to in writing, software
15  * distributed under the License is distributed on an "AS IS" BASIS,
16  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17  * See the License for the specific language governing permissions and
18  * limitations under the License.
19  * ============LICENSE_END============================================
20  * ===================================================================
21  *
22  */
23
24 package org.onap.clamp.clds.model.actions;
25
26 import com.att.eelf.configuration.EELFLogger;
27 import com.google.gson.JsonElement;
28 import com.google.gson.JsonObject;
29 import com.google.gson.JsonParseException;
30 import java.util.Arrays;
31 import java.util.List;
32 import org.onap.clamp.clds.model.CldsEvent;
33 import org.onap.clamp.clds.util.JsonUtils;
34
35 /**
36  * Interface for actions that the user can do according to the last event.
37  *
38  *
39  */
40 public interface ActionsHandler {
41
42     enum ModelType {
43         SIMPLE_MODEL("simpleModel"), POLICY_MODEL("policyModel");
44         private final String type;
45
46         ModelType(String type) {
47             this.type = type;
48         }
49
50         public final String getType() {
51             return this.type;
52         }
53     }
54
55     EELFLogger getLogger();
56
57     /**
58      * This method determines a list of actions that the user can do according to
59      * the last event.
60      *
61      * @param event
62      *        The last event
63      * @param propText
64      *        The Json properties string
65      * @return A list of actions
66      */
67     default List<String> determinePermittedActionsOnLastEvent(CldsEvent event, String propText) {
68         List<String> permittedActions;
69         String actionCd = getCurrentActionCd(event);
70         switch (actionCd) {
71             case CldsEvent.ACTION_CREATE:
72                 permittedActions = Arrays.asList(CldsEvent.ACTION_SUBMIT, CldsEvent.ACTION_TEST,
73                         CldsEvent.ACTION_DELETE);
74                 if (isTypeModel(propText, ModelType.SIMPLE_MODEL)) {
75                     permittedActions = Arrays.asList(CldsEvent.ACTION_SUBMITDCAE, CldsEvent.ACTION_SUBMITPOLICY,
76                             CldsEvent.ACTION_TEST, CldsEvent.ACTION_DELETE);
77                 }
78                 break;
79             case CldsEvent.ACTION_SUBMIT:
80             case CldsEvent.ACTION_RESUBMIT:
81             case CldsEvent.ACTION_DISTRIBUTE:
82                 permittedActions = Arrays.asList(CldsEvent.ACTION_DEPLOY, CldsEvent.ACTION_RESUBMIT,
83                         CldsEvent.ACTION_DELETE);
84                 if (isTypeModel(propText, ModelType.SIMPLE_MODEL)) {
85                     permittedActions = Arrays.asList(CldsEvent.ACTION_DEPLOY, CldsEvent.ACTION_SUBMITDCAE,
86                             CldsEvent.ACTION_DELETE);
87                 }
88                 break;
89             case CldsEvent.ACTION_SUBMITDCAE:
90                 permittedActions = Arrays.asList(CldsEvent.ACTION_SUBMITDCAE, CldsEvent.ACTION_DELETE);
91                 break;
92             case CldsEvent.ACTION_SUBMITPOLICY:
93                 permittedActions = Arrays.asList(CldsEvent.ACTION_UPDATE, CldsEvent.ACTION_STOP);
94                 break;
95             case CldsEvent.ACTION_UNDEPLOY:
96                 permittedActions = Arrays.asList(CldsEvent.ACTION_UPDATE, CldsEvent.ACTION_DEPLOY,
97                         CldsEvent.ACTION_RESUBMIT, CldsEvent.ACTION_DELETE);
98                 if (isTypeModel(propText, ModelType.SIMPLE_MODEL)) {
99                     permittedActions = Arrays.asList(CldsEvent.ACTION_UPDATE, CldsEvent.ACTION_DEPLOY,
100                             CldsEvent.ACTION_SUBMITDCAE, CldsEvent.ACTION_DELETE);
101                 }
102                 break;
103             case CldsEvent.ACTION_DEPLOY:
104                 permittedActions = Arrays.asList(CldsEvent.ACTION_UNDEPLOY, CldsEvent.ACTION_UPDATE,
105                         CldsEvent.ACTION_STOP);
106                 break;
107             case CldsEvent.ACTION_RESTART:
108             case CldsEvent.ACTION_UPDATE:
109                 permittedActions = Arrays.asList(CldsEvent.ACTION_DEPLOY, CldsEvent.ACTION_UPDATE,
110                         CldsEvent.ACTION_STOP, CldsEvent.ACTION_UNDEPLOY);
111                 if (isTypeModel(propText, ModelType.POLICY_MODEL)) {
112                     permittedActions = Arrays.asList(CldsEvent.ACTION_UPDATE, CldsEvent.ACTION_STOP);
113                 }
114                 break;
115             case CldsEvent.ACTION_STOP:
116                 permittedActions = Arrays.asList(CldsEvent.ACTION_UPDATE, CldsEvent.ACTION_RESTART,
117                         CldsEvent.ACTION_UNDEPLOY);
118                 if (isTypeModel(propText, ModelType.POLICY_MODEL)) {
119                     permittedActions = Arrays.asList(CldsEvent.ACTION_UPDATE, CldsEvent.ACTION_RESTART,
120                             CldsEvent.ACTION_DELETE);
121                 }
122                 break;
123             default:
124                 getLogger().warn("Invalid current actionCd: " + actionCd);
125                 permittedActions = Arrays.asList();
126         }
127         return permittedActions;
128     }
129
130     /**
131      * This returns the action of the event or a default one if not found.
132      *
133      * @param event The last event
134      * @return The action
135      */
136     default String getCurrentActionCd(CldsEvent event) {
137         // current default actionCd is CREATE
138         String actionCd = CldsEvent.ACTION_CREATE;
139         if (event != null && event.getActionCd() != null) {
140             actionCd = event.getActionCd();
141         }
142         return actionCd;
143     }
144
145     /**
146      * Check whether the text properties is of specified type ModelType.
147      *
148      * @param propText
149      *        The Clamp Json properties
150      * @param key
151      *        The model type
152      * @return True if matches the right type specified
153      */
154     default boolean isTypeModel(String propText, ModelType key) {
155         boolean result = false;
156         try {
157             if (propText != null) {
158                 JsonObject modelJson = JsonUtils.GSON.fromJson(propText, JsonObject.class);
159                 JsonElement modelJsonOfType = modelJson.get(key.getType());
160                 if (modelJsonOfType != null
161                         && modelJsonOfType.isJsonPrimitive()
162                         && modelJsonOfType.getAsJsonPrimitive().getAsBoolean()) {
163                     result = true;
164                 }
165             }
166         } catch (JsonParseException e) {
167             getLogger().error("Error while parsing propText json", e);
168         }
169         return result;
170     }
171 }