Bug:5226 The sub-node has the same order
[nemo.git] / nemo-impl / src / main / java / org / opendaylight / nemo / user / vnspacemanager / languagestyle / updateintentlang / UpdateFlowLang.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.languagestyle.updateintentlang;\r
9 \r
10 import org.opendaylight.controller.md.sal.binding.api.DataBroker;\r
11 import org.opendaylight.nemo.user.tenantmanager.TenantManage;\r
12 import org.opendaylight.nemo.user.vnspacemanager.languagestyle.NEMOConstants;\r
13 import org.opendaylight.nemo.user.vnspacemanager.structurestyle.updateintent.UpdateFlow;\r
14 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.common.rev151010.*;\r
15 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.intent.rev151010.user.intent.objects.Flow;\r
16 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.intent.rev151010.user.intent.objects.FlowBuilder;\r
17 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.intent.rev151010.user.intent.objects.FlowKey;\r
18 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.object.rev151010.flow.instance.*;\r
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.object.rev151010.match.item.instance.MatchItemValueBuilder;\r
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.object.rev151010.match.item.instance.match.item.value.RangeValueBuilder;\r
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.object.rev151010.property.instance.PropertyValuesBuilder;\r
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.object.rev151010.property.instance.property.values.*;\r
23 \r
24 import java.util.*;\r
25 \r
26 /**\r
27  * Created by z00293636 on 2015/11/5.\r
28  */\r
29 public class UpdateFlowLang {\r
30     private TenantManage tenantManage;\r
31     private UpdateFlow updateFlow;\r
32     private Flow flow;\r
33 \r
34     public UpdateFlowLang(DataBroker dataBroker, TenantManage tenantManage){\r
35         this.tenantManage = tenantManage;\r
36         updateFlow = new UpdateFlow(dataBroker,tenantManage);\r
37     }\r
38 \r
39     public String FlowHandling(UserId userId, String flowname,LinkedHashMap<String,LinkedHashMap<String,String>> flowmatch,LinkedHashMap<String,LinkedHashMap<String,String>> propertyList){\r
40         String errorInfo = null;\r
41         if (!propertyList.isEmpty()){\r
42             errorInfo = checkProperty(propertyList);\r
43         }\r
44         if (errorInfo==null){\r
45             errorInfo = createFlow(userId,flowname,flowmatch,propertyList);\r
46             if (errorInfo==null)\r
47             {\r
48                 return updateFlow.FlowHandling(userId,this.flow);\r
49             }\r
50         }\r
51         return errorInfo;\r
52     }\r
53 \r
54     private String checkProperty(LinkedHashMap<String,LinkedHashMap<String,String>> flowproperty){\r
55         String errorInfo = null;\r
56         for (String propertyName : flowproperty.keySet()){\r
57             LinkedHashMap<String,String> propertyValues= flowproperty.get(propertyName);\r
58             Iterator<String> iterator = propertyValues.values().iterator();\r
59             String valueType = iterator.next();\r
60 \r
61             while (iterator.hasNext()){\r
62                 if (valueType.equals(NEMOConstants.range)) {\r
63                     errorInfo = "The property should just has one range value.";\r
64                     return errorInfo;\r
65                 }\r
66                 else if (valueType.equals(NEMOConstants.string)){\r
67                     if (!iterator.next().equals(NEMOConstants.string)){\r
68                         return "The property " + propertyValues.get(iterator.next()) + " should be string.";\r
69                     }\r
70                 }\r
71                 else if (valueType.equals(NEMOConstants.integer)){\r
72                     if (!iterator.next().equals(NEMOConstants.integer)){\r
73                         return "The property " + propertyValues.get(iterator.next()) + " should be int.";\r
74                     }\r
75                 }\r
76             }\r
77         }\r
78         return errorInfo;\r
79     }\r
80 \r
81     private String createFlow(UserId userId, String flowname,LinkedHashMap<String,LinkedHashMap<String,String>> flowmatch,LinkedHashMap<String,LinkedHashMap<String,String>> propertyList ){\r
82         String errorInfo = null;\r
83         FlowBuilder flowBuilder = new FlowBuilder();\r
84         Flow flow1 = null;\r
85         if (tenantManage.getObjectId(userId,flowname)!=null){\r
86             FlowId flowId = new FlowId(tenantManage.getObjectId(userId,flowname));\r
87             if (tenantManage.getFlow(userId).containsKey(flowId)){\r
88                 flow1 = tenantManage.getFlow(userId).get(flowId);\r
89             }\r
90             else if (tenantManage.getFlowDataStore(userId).containsKey(flowId)){\r
91                 flow1 = tenantManage.getFlowDataStore(userId).get(flowId);\r
92             }\r
93         }\r
94         if (flow1==null){\r
95             FlowId flowId = new FlowId(UUID.randomUUID().toString());\r
96             flowBuilder.setKey(new FlowKey(flowId))\r
97                        .setFlowId(flowId);\r
98         }\r
99         else {\r
100             flowBuilder.setKey(flow1.getKey())\r
101                        .setFlowId(flow1.getFlowId());\r
102         }\r
103 \r
104         flowBuilder.setFlowName(new FlowName(flowname));\r
105 \r
106         if (!flowmatch.isEmpty() && errorInfo==null){\r
107             List<MatchItem> matchItemList = new ArrayList<MatchItem>();\r
108             MatchItemBuilder matchItemBuilder = new MatchItemBuilder();\r
109             for (String matchname : flowmatch.keySet()){\r
110                 matchItemBuilder.setMatchItemName(new MatchItemName(matchname));\r
111                 LinkedHashMap<String, String> matchvalue = flowmatch.get(matchname);\r
112                 MatchItemValueBuilder matchItemValueBuilder = new MatchItemValueBuilder();\r
113                 for (String value : matchvalue.keySet()){\r
114                     if (matchvalue.get(value).equals(NEMOConstants.string)){\r
115                         matchItemValueBuilder.setStringValue(value);\r
116                     }\r
117                     if (matchvalue.get(value).equals(NEMOConstants.integer)){\r
118                         matchItemValueBuilder.setIntValue(Long.parseLong(value));\r
119                     }\r
120                     if (matchvalue.get(value).equals(NEMOConstants.range)){\r
121                         String[] rangevalue = new String[2];\r
122                         rangevalue = value.split(",");\r
123                         RangeValueBuilder rangeValueBuilder = new RangeValueBuilder();\r
124                         if (Long.parseLong(rangevalue[0])<Long.parseLong(rangevalue[1])){\r
125                             rangeValueBuilder.setMin(Long.parseLong(rangevalue[0]));\r
126                             rangeValueBuilder.setMax(Long.parseLong(rangevalue[1]));\r
127                         }\r
128                         else{\r
129                             rangeValueBuilder.setMin(Long.parseLong(rangevalue[1]));\r
130                             rangeValueBuilder.setMax(Long.parseLong(rangevalue[0]));\r
131                         }\r
132                         matchItemValueBuilder.setRangeValue(rangeValueBuilder.build());\r
133                     }\r
134                 }\r
135                 matchItemBuilder.setMatchItemValue(matchItemValueBuilder.build());\r
136                 matchItemList.add(matchItemBuilder.build());\r
137             }\r
138             if (matchItemList.isEmpty()){\r
139                 matchItemList=null;\r
140                 flowBuilder.setMatchItem(matchItemList);\r
141             }\r
142             flowBuilder.setMatchItem(matchItemList);\r
143         }\r
144 \r
145         if (errorInfo==null && ! propertyList.isEmpty()) {\r
146             PropertyBuilder propertyBuilder = new PropertyBuilder();\r
147             List<Property> flowproperty = new ArrayList<Property>();\r
148             for (String propertyname : propertyList.keySet()){\r
149                 propertyBuilder.setKey(new PropertyKey(new PropertyName(propertyname)));\r
150                 propertyBuilder.setPropertyName(new PropertyName(propertyname));\r
151 \r
152                 PropertyValuesBuilder propertyValuesBuilder = new PropertyValuesBuilder();\r
153                 LinkedHashMap<String, String> valuetype = propertyList.get(propertyname);\r
154                 List<IntValue> intValueList = new ArrayList<IntValue>();\r
155                 List<StringValue> stringValueList = new ArrayList<StringValue>();\r
156                 RangeValue Rangevalue = null;\r
157                 int order = 0;\r
158                 for (String value : valuetype.keySet()){\r
159                     if (valuetype.get(value).equals(NEMOConstants.string)){\r
160                         StringValueBuilder stringValueBuilder = new StringValueBuilder();\r
161                         stringValueBuilder.setKey(new StringValueKey((long)order,value));\r
162                         stringValueBuilder.setValue(value);\r
163                         stringValueBuilder.setOrder((long)order);\r
164                         stringValueList.add(stringValueBuilder.build());\r
165                     }\r
166                     if (valuetype.get(value).equals(NEMOConstants.integer)) {\r
167                         IntValueBuilder intValueBuilder = new IntValueBuilder();\r
168                         intValueBuilder.setKey(new IntValueKey((long)order,Long.parseLong(value)));\r
169                         intValueBuilder.setValue(Long.parseLong(value));\r
170                         intValueBuilder.setOrder((long)order);\r
171                         intValueList.add(intValueBuilder.build());\r
172                     }\r
173                     if (valuetype.get(value).equals(NEMOConstants.range)){\r
174                         String[] rangevalue = new String[2];\r
175                         rangevalue = value.split(",");\r
176                         org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.object.rev151010.property.instance.property.values.RangeValueBuilder rangeValueBuilder\r
177                                 = new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.object.rev151010.property.instance.property.values.RangeValueBuilder();\r
178                         if (Long.parseLong(rangevalue[0])<Long.parseLong(rangevalue[1])){\r
179                             rangeValueBuilder.setMin(Long.parseLong(rangevalue[0]));\r
180                             rangeValueBuilder.setMax(Long.parseLong(rangevalue[1]));\r
181                         }\r
182                         else{\r
183                             rangeValueBuilder.setMin(Long.parseLong(rangevalue[1]));\r
184                             rangeValueBuilder.setMax(Long.parseLong(rangevalue[0]));\r
185                         }\r
186                         Rangevalue = rangeValueBuilder.build();\r
187                         propertyValuesBuilder.setRangeValue(Rangevalue);\r
188                     }\r
189                     order++;\r
190                 }\r
191                 if (intValueList.isEmpty()){\r
192                     intValueList = null;\r
193                     propertyValuesBuilder.setIntValue(intValueList);\r
194                 }\r
195                 if (stringValueList.isEmpty()){\r
196                     stringValueList = null;\r
197                     propertyValuesBuilder.setStringValue(stringValueList);\r
198                 }\r
199                 propertyValuesBuilder.setIntValue(intValueList).setStringValue(stringValueList).setRangeValue(Rangevalue);\r
200                 propertyBuilder.setPropertyValues(propertyValuesBuilder.build());\r
201                 flowproperty.add(propertyBuilder.build());\r
202             }\r
203             flowBuilder.setProperty(flowproperty);\r
204         }\r
205         this.flow = flowBuilder.build();\r
206         return errorInfo;\r
207     }\r
208 }\r