Adding nemo engine.
[nemo.git] / nemo-impl / src / main / java / org / opendaylight / nemo / user / vnspacemanager / syntaxcheck / OperationDefinitionCheck.java
1 /*\r
2  * Copyright (c) 2015 Huawei, Inc. and others. All rights reserved.\r
3  *\r
4  * This program and the accompanying materials are made available under the\r
5  * terms of the Eclipse Public License v1.0 which accompanies this distribution,\r
6  * and is available at http://www.eclipse.org/legal/epl-v10.html\r
7  */\r
8 package org.opendaylight.nemo.user.vnspacemanager.syntaxcheck;\r
9 \r
10 import com.google.common.base.Optional;\r
11 import com.google.common.util.concurrent.FutureCallback;\r
12 import com.google.common.util.concurrent.Futures;\r
13 import com.google.common.util.concurrent.ListenableFuture;\r
14 import org.opendaylight.controller.md.sal.binding.api.DataBroker;\r
15 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;\r
16 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.common.rev151010.ParameterName;\r
17 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.intent.rev151010.user.intent.operations.Operation;\r
18 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.operation.rev151010.ActionDefinitions;\r
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.operation.rev151010.ConditionParameterDefinitions;\r
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.operation.rev151010.action.definitions.ActionDefinition;\r
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.operation.rev151010.action.instance.ParameterValues;\r
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.operation.rev151010.condition.instance.ConditionSegment;\r
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.operation.rev151010.condition.instance.condition.segment.ConditionParameterTargetValue;\r
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.operation.rev151010.condition.parameter.definitions.ConditionParameterDefinition;\r
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.operation.rev151010.condition.parameter.definitions.condition.parameter.definition.ParameterMatchPatterns;\r
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.operation.rev151010.operation.instance.Action;\r
27 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;\r
28 import org.slf4j.Logger;\r
29 import org.slf4j.LoggerFactory;\r
30 \r
31 import java.util.List;\r
32 \r
33 /**\r
34  * Created by z00293636 on 2015/9/2.\r
35  */\r
36 public class OperationDefinitionCheck {\r
37 \r
38     private DataBroker dataBroker;\r
39     private List<ActionDefinition> actionDefinitionList;\r
40     private List<ConditionParameterDefinition> conditionParameterDefinitionList;\r
41     private static final Logger LOG = LoggerFactory.getLogger(OperationDefinitionCheck.class);\r
42     public OperationDefinitionCheck(DataBroker dataBroker)\r
43     {\r
44         this.dataBroker = dataBroker;\r
45         actionDefinitionList = null;\r
46         conditionParameterDefinitionList = null;\r
47     }\r
48 \r
49     public String CheckDefinition(Operation operation)\r
50     {\r
51         fetchActionDefinitions();\r
52         fetchConditionParaDefinitions();\r
53         String errorInfo = null;\r
54 \r
55         if (operation.getAction() != null )\r
56         {\r
57            errorInfo = checkAction(operation);\r
58         }\r
59         if (errorInfo == null && operation.getConditionSegment() != null)\r
60         {\r
61             errorInfo = checkCondition(operation);\r
62         }\r
63         return errorInfo;\r
64     }\r
65 \r
66     private String checkAction(Operation operation)\r
67     {\r
68         String errorInfo = null;\r
69         Boolean actionHasDefine = false;\r
70 \r
71         if ( actionDefinitionList == null)\r
72         {\r
73             errorInfo = "There are no actions has been defined in the data store.";\r
74         }\r
75         else {\r
76             for (Action action : operation.getAction()) {\r
77                 for (ActionDefinition actionDefinition : actionDefinitionList) {\r
78                     if (actionDefinition.getActionName().equals(action.getActionName())) {\r
79                         actionHasDefine = true;\r
80 \r
81                         ParameterValues parameterValues = action.getParameterValues();\r
82                         ActionDefinition.ParameterValueType parameterValueType = actionDefinition.getParameterValueType();\r
83 \r
84                         if (parameterValues != null && parameterValueType != null)\r
85                         {\r
86                             if (parameterValueType.getIntValue() == 0 && !(parameterValues.getIntValue() == null && parameterValues.getStringValue() != null && parameterValues.getRangeValue() == null)) {\r
87                                 errorInfo = "The value type of" + action.getActionName().toString() + "should be string.";\r
88                                 break;\r
89                             }\r
90                             if (parameterValueType.getIntValue() == 1 && !(parameterValues.getIntValue() != null && parameterValues.getStringValue() == null && parameterValues.getRangeValue() == null)) {\r
91                                 errorInfo = "The value type of" + action.getActionName().toString() + "should be integer.";\r
92                                 break;\r
93                             }\r
94                             if (parameterValueType.getIntValue() == 2 && !(parameterValues.getIntValue() == null && parameterValues.getStringValue() == null && parameterValues.getRangeValue() != null)) {\r
95                                 errorInfo = "The value type of" + action.getActionName().toString() + "should be range.";\r
96                                 break;\r
97                             }\r
98                         }\r
99                     }\r
100 \r
101                 }\r
102             }\r
103             if (!actionHasDefine) {\r
104                 errorInfo = "The action type has not been defined.";\r
105             }\r
106         }\r
107         return errorInfo;\r
108     }\r
109 \r
110     private String checkCondition(Operation operation)\r
111     {\r
112         String errorInfo = null;\r
113         Boolean conditionHasDefined = false;\r
114 \r
115         if (conditionParameterDefinitionList != null)\r
116         {\r
117             if (operation.getConditionSegment() != null)\r
118             {\r
119                 for (ConditionSegment conditionSegment :operation.getConditionSegment())\r
120                 {\r
121                     for (ConditionParameterDefinition conditionParameterDefinition : conditionParameterDefinitionList)\r
122                     {\r
123                         if (conditionParameterDefinition.getParameterName().getValue().equals(conditionSegment.getConditionParameterName().getValue()))\r
124                         {\r
125                             conditionHasDefined = true;\r
126                             if (conditionSegment.getConditionParameterMatchPattern() != null)\r
127                             {\r
128                                 if (conditionParameterDefinition.getParameterMatchPatterns() != null)\r
129                                 {\r
130                                     List<ParameterMatchPatterns.ParameterMatchPattern> conditionParameterMatchPatterns = conditionParameterDefinition.getParameterMatchPatterns().getParameterMatchPattern();\r
131                                     if (conditionParameterMatchPatterns != null)\r
132                                     {\r
133                                         Boolean matchpatternexist = false;\r
134                                         for (ParameterMatchPatterns.ParameterMatchPattern parameterMatchPattern : conditionParameterMatchPatterns)\r
135                                         {\r
136                                             if (parameterMatchPattern.getIntValue() == conditionSegment.getConditionParameterMatchPattern().getIntValue())\r
137                                             {\r
138                                                 matchpatternexist = true;\r
139                                                 break;\r
140                                             }\r
141                                         }\r
142                                         if (!matchpatternexist)\r
143                                         {\r
144                                             errorInfo = "The match pattern has not defined in the condition.";\r
145                                         }\r
146                                     }\r
147                                     else\r
148                                     {\r
149                                         errorInfo = "There are no match pattern in match pattrn list.";\r
150                                         break;\r
151                                     }\r
152                                 }\r
153                                 else\r
154                                 {\r
155                                     errorInfo = "No match patterns have been defined in data store.";\r
156                                     break;\r
157                                 }\r
158                             }\r
159                             if (conditionSegment.getConditionParameterTargetValue() != null)\r
160                             {\r
161                                 if (conditionParameterDefinition.getParameterValueType() != null)\r
162                                 {\r
163                                     ConditionParameterTargetValue conditionParameterTargetValue = conditionSegment.getConditionParameterTargetValue();\r
164                                     ConditionParameterDefinition.ParameterValueType  parameterValueType = conditionParameterDefinition.getParameterValueType();\r
165 \r
166                                     if (parameterValueType.getIntValue() == 0 && !(conditionParameterTargetValue.getIntValue() == null && conditionParameterTargetValue.getStringValue() != null && conditionParameterTargetValue.getRangeValue() == null)) {\r
167                                         errorInfo = "The value type of" + conditionSegment.getConditionParameterName().toString() + "should be string.";\r
168                                         break;\r
169                                     }\r
170                                     if (parameterValueType.getIntValue() == 1 && !(conditionParameterTargetValue.getIntValue() != null && conditionParameterTargetValue.getStringValue() == null && conditionParameterTargetValue.getRangeValue() == null)) {\r
171                                         errorInfo = "The value type of" + conditionSegment.getConditionParameterName().toString() + "should be integer.";\r
172                                         break;\r
173                                     }\r
174                                     if (parameterValueType.getIntValue() == 2 && !(conditionParameterTargetValue.getIntValue() == null && conditionParameterTargetValue.getStringValue() == null && conditionParameterTargetValue.getRangeValue() != null)) {\r
175                                         errorInfo = "The value type of" + conditionSegment.getConditionParameterName().toString() + "should be range.";\r
176                                         break;\r
177                                     }\r
178 \r
179                                 }\r
180                             }\r
181                         }\r
182                     }\r
183                 }\r
184             }\r
185         }\r
186 \r
187         if (!conditionHasDefined)\r
188         {\r
189             errorInfo = "This condition has not been defined in data store.";\r
190         }\r
191         return errorInfo;\r
192     }\r
193 \r
194     private void fetchActionDefinitions()\r
195     {\r
196         InstanceIdentifier<ActionDefinitions> actiondefinitionId = InstanceIdentifier.builder(ActionDefinitions.class).build();\r
197         ListenableFuture<Optional<ActionDefinitions>> actiondefinitionFuture = dataBroker.newReadOnlyTransaction().read(LogicalDatastoreType.CONFIGURATION, actiondefinitionId);\r
198         Futures.addCallback(actiondefinitionFuture, new FutureCallback<Optional<ActionDefinitions>>() {\r
199             @Override\r
200             public void onSuccess(Optional<ActionDefinitions> result) {\r
201                 setActionDefinitionList( result.get().getActionDefinition());\r
202                 return;\r
203             }\r
204 \r
205             @Override\r
206             public void onFailure(Throwable t) {\r
207                 LOG.error("Can not read action definition information.", t);\r
208 \r
209                 return;\r
210             }\r
211         });\r
212         return ;\r
213     }\r
214 \r
215     private void fetchConditionParaDefinitions()\r
216     {\r
217         InstanceIdentifier<ConditionParameterDefinitions> conditionparadefinitionId = InstanceIdentifier.builder(ConditionParameterDefinitions.class).build();\r
218         ListenableFuture<Optional<ConditionParameterDefinitions>> conditionparadefinitionFuture = dataBroker.newReadOnlyTransaction().read(LogicalDatastoreType.CONFIGURATION, conditionparadefinitionId);\r
219         Futures.addCallback(conditionparadefinitionFuture, new FutureCallback<Optional<ConditionParameterDefinitions>>() {\r
220             @Override\r
221             public void onSuccess(Optional<ConditionParameterDefinitions> result) {\r
222                 setConditionParameterDefinitionList( result.get().getConditionParameterDefinition());\r
223                 return;\r
224             }\r
225 \r
226             @Override\r
227             public void onFailure(Throwable t) {\r
228                 LOG.error("Can not read condition parameter definition information.", t);\r
229                 return;\r
230             }\r
231         });\r
232         return ;\r
233     }\r
234 \r
235     private void setActionDefinitionList(List<ActionDefinition> actionDefinitionList)\r
236     {\r
237         this.actionDefinitionList = actionDefinitionList;\r
238     }\r
239 \r
240     private void setConditionParameterDefinitionList(List<ConditionParameterDefinition> conditionParameterDefinitionList)\r
241     {\r
242         this.conditionParameterDefinitionList = conditionParameterDefinitionList;\r
243     }\r
244 }\r