Implement nemo language style RPC.
[nemo.git] / nemo-impl / src / main / java / org / opendaylight / nemo / user / vnspacemanager / languagestyle / updateintentlang / UpdateNodeLang.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.languagestyle.NEMOParse.NEMOparser;\r
14 import org.opendaylight.nemo.user.vnspacemanager.structurestyle.updateintent.UpdateNode;\r
15 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.common.rev151010.*;\r
16 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.intent.rev151010.user.intent.objects.Node;\r
17 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.intent.rev151010.user.intent.objects.NodeBuilder;\r
18 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.intent.rev151010.user.intent.objects.NodeKey;\r
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.intent.rev151010.users.User;\r
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.object.rev151010.node.instance.*;\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/10/31.\r
28  */\r
29 public class UpdateNodeLang {\r
30     private TenantManage tenantManage;\r
31     private UpdateNode updateNode;\r
32     private Node node;\r
33 \r
34     public UpdateNodeLang(DataBroker dataBroker, TenantManage tenantManage){\r
35         this.tenantManage = tenantManage;\r
36         updateNode = new UpdateNode(dataBroker,tenantManage);\r
37     }\r
38 \r
39     public String NodeHandling(UserId userId,String nodename, String nodetype, List<String> subnodes, LinkedHashMap<String, LinkedHashMap<String,String>> propertyList){\r
40         String errorInfo = null;\r
41         if (nodetype.equals(NEMOConstants.host)&&!subnodes.isEmpty()){\r
42             errorInfo = "the node "+nodename+ " is a " + NEMOConstants.host +", it could not contain other nodes.";\r
43             return errorInfo;\r
44         }\r
45         if (!propertyList.isEmpty()){\r
46             errorInfo = checkProperty(propertyList);\r
47         }\r
48         if (errorInfo==null){\r
49             errorInfo = createNode(userId, nodename, nodetype, subnodes, propertyList);\r
50             if (errorInfo == null){\r
51                 return updateNode.NodeHandling(userId,this.node);\r
52             }\r
53         }\r
54         return errorInfo;\r
55     }\r
56 \r
57     private String checkProperty(LinkedHashMap<String, LinkedHashMap<String,String>> propertyList){\r
58         String errorInfo = null;\r
59        for (String propertyName : propertyList.keySet()) {\r
60            LinkedHashMap<String, String> propertyValues = propertyList.get(propertyName);\r
61            Iterator<String> iterator = propertyValues.values().iterator();\r
62            String valueType = iterator.next();\r
63 \r
64            while (iterator.hasNext()) {\r
65                if (valueType.equals(NEMOConstants.range)) {\r
66                    errorInfo = "The property should just has one range value.";\r
67                    return errorInfo;\r
68                }\r
69                else if (valueType.equals(NEMOConstants.string)){\r
70                    if (!iterator.next().equals(NEMOConstants.string)){\r
71                        return "The property " + propertyValues.get(iterator.next()) + " should be string.";\r
72                    }\r
73                }\r
74                else if (valueType.equals(NEMOConstants.integer)){\r
75                    if (!iterator.next().equals(NEMOConstants.integer)){\r
76                        return "The property " + propertyValues.get(iterator.next()) + " should be int.";\r
77                    }\r
78                }\r
79            }\r
80        }\r
81         return errorInfo;\r
82     }\r
83 \r
84     private String createNode(UserId userId, String nodename, String nodetype, List<String> subnodes, LinkedHashMap<String, LinkedHashMap<String,String>> propertyList){\r
85         String errorInfo = null;\r
86         tenantManage.fetchVNSpace(userId);\r
87         User user =tenantManage.getUser();\r
88         List<Node> nodeList = new ArrayList<Node>();\r
89         if (user.getObjects()!=null)\r
90         {\r
91             if (user.getObjects().getNode()!=null)\r
92             {\r
93                 nodeList = user.getObjects().getNode();\r
94             }\r
95         }\r
96         NodeBuilder nodeBuilder = new NodeBuilder();\r
97         Boolean NodeExist = false;\r
98         if (!nodeList.isEmpty())\r
99         {\r
100             for (Node node1:nodeList)\r
101             {\r
102                 if (node1.getNodeName().getValue().equals(nodename))\r
103                 {\r
104                     NodeExist = true;\r
105                     nodeBuilder.setKey(node1.getKey());\r
106                     nodeBuilder.setNodeId(node1.getNodeId());\r
107                 }\r
108             }\r
109         }\r
110         if (!NodeExist)\r
111         {\r
112             NodeId nodeId = new NodeId(UUID.randomUUID().toString());\r
113             nodeBuilder.setKey(new NodeKey(nodeId));\r
114             nodeBuilder.setNodeId(nodeId);\r
115         }\r
116 \r
117         nodeBuilder.setNodeName(new NodeName(nodename));\r
118         nodeBuilder.setNodeType(new NodeType(nodetype));\r
119 \r
120         List<SubNode> subNodeList = new ArrayList<SubNode>();\r
121         Boolean subnodeexist = false;\r
122         if (errorInfo==null && !subnodes.isEmpty())\r
123         {\r
124             for (String subnodename : subnodes)\r
125             {\r
126                 int order = 0;\r
127                 if (!nodeList.isEmpty())\r
128                 {\r
129                     for (Node node : nodeList)\r
130                     {\r
131                         if (node.getNodeName().getValue().equals(subnodename))\r
132                         {\r
133                             subnodeexist = true;\r
134                             SubNodeBuilder subNodeBuilder = new SubNodeBuilder();\r
135                             subNodeBuilder.setKey(new SubNodeKey(node.getNodeId()));\r
136                             subNodeBuilder.setNodeId(node.getNodeId());\r
137                             subNodeBuilder.setOrder((long)order);\r
138                             subNodeList.add(subNodeBuilder.build());\r
139                         }\r
140                     }\r
141                     if (!subnodeexist)\r
142                     {\r
143                         errorInfo = "The subnode is not exist.";\r
144                         return errorInfo;\r
145                     }\r
146                 }\r
147                 else\r
148                 {\r
149                     errorInfo = "The subnode is not exist.";\r
150                     return errorInfo;\r
151                 }\r
152                 order ++;\r
153             }\r
154             nodeBuilder.setSubNode(subNodeList);\r
155         }\r
156 \r
157         if (errorInfo==null && !propertyList.isEmpty())\r
158         {\r
159             PropertyBuilder propertyBuilder = new PropertyBuilder();\r
160             List<Property> nodeproperty = new ArrayList<Property>();\r
161             for (String propertyname : propertyList.keySet())\r
162             {\r
163                 propertyBuilder.setKey(new PropertyKey(new PropertyName(propertyname)));\r
164                 propertyBuilder.setPropertyName(new PropertyName(propertyname));\r
165 \r
166                 PropertyValuesBuilder propertyValuesBuilder = new PropertyValuesBuilder();\r
167                 LinkedHashMap<String, String> valuetype = propertyList.get(propertyname);\r
168                 List<IntValue> intValueList = new ArrayList<IntValue>();\r
169                 List<StringValue> stringValueList = new ArrayList<StringValue>();\r
170                 RangeValue RangeValue = null;\r
171 \r
172                 int order = 0;\r
173                 for (String value : valuetype.keySet())\r
174                 {\r
175 //                    if ((valuetype.get(value).equals(NEMOConstants.string))||valuetype.get(value).equals(NEMOConstants.ipv4addr)||valuetype.get(value).equals(NEMOConstants.ipv4pref)\r
176 //                        ||valuetype.get(value).equals(NEMOConstants.ethaddr))\r
177                     if (valuetype.get(value).equals(NEMOConstants.string))\r
178                     {\r
179                         StringValueBuilder stringValueBuilder = new StringValueBuilder();\r
180                         stringValueBuilder.setKey(new StringValueKey((long)order,value));\r
181                         stringValueBuilder.setValue(value);\r
182                         stringValueBuilder.setOrder((long)order);\r
183                         stringValueList.add(stringValueBuilder.build());\r
184                     }\r
185                     if (valuetype.get(value).equals(NEMOConstants.integer))\r
186                     {\r
187                         IntValueBuilder intValueBuilder = new IntValueBuilder();\r
188                         intValueBuilder.setKey(new IntValueKey((long)order,Long.parseLong(value)));\r
189                         intValueBuilder.setValue(Long.parseLong(value));\r
190                         intValueBuilder.setOrder((long)order);\r
191                         intValueList.add(intValueBuilder.build());\r
192                     }\r
193                     if (valuetype.get(value).equals(NEMOConstants.range))\r
194                     {\r
195                         String[] rangevalue = new String[2];\r
196                         rangevalue = value.split(",");\r
197                         RangeValueBuilder rangeValueBuilder = new RangeValueBuilder();\r
198                         if (Long.parseLong(rangevalue[0])<Long.parseLong(rangevalue[1]))\r
199                         {\r
200                             rangeValueBuilder.setMin(Long.parseLong(rangevalue[0]));\r
201                             rangeValueBuilder.setMax(Long.parseLong(rangevalue[1]));\r
202                         }\r
203                        else\r
204                         {\r
205                             rangeValueBuilder.setMin(Long.parseLong(rangevalue[1]));\r
206                             rangeValueBuilder.setMax(Long.parseLong(rangevalue[0]));\r
207                         }\r
208                         RangeValue = rangeValueBuilder.build();\r
209                         propertyValuesBuilder.setRangeValue(RangeValue);\r
210                     }\r
211                     order++;\r
212                 }\r
213                 if (intValueList.isEmpty())\r
214                 {\r
215                     intValueList = null;\r
216                     propertyValuesBuilder.setIntValue(intValueList);\r
217                 }\r
218                 if (stringValueList.isEmpty())\r
219                 {\r
220                     stringValueList = null;\r
221                     propertyValuesBuilder.setStringValue(stringValueList);\r
222                 }\r
223 \r
224                 propertyValuesBuilder.setIntValue(intValueList).setStringValue(stringValueList).setRangeValue(RangeValue);\r
225                 propertyBuilder.setPropertyValues(propertyValuesBuilder.build());\r
226                 nodeproperty.add(propertyBuilder.build());\r
227             }\r
228             nodeBuilder.setProperty(nodeproperty);\r
229         }\r
230         this.node = nodeBuilder.build();\r
231         return errorInfo;\r
232     }\r
233 }\r