2 * Copyright (c) 2015 Huawei, Inc. and others. All rights reserved.
\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
8 package org.opendaylight.nemo.user.vnspacemanager.languagestyle.updateintentlang;
\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
27 * Created by z00293636 on 2015/11/5.
\r
29 public class UpdateFlowLang {
\r
30 private TenantManage tenantManage;
\r
31 private UpdateFlow updateFlow;
\r
34 public UpdateFlowLang(DataBroker dataBroker, TenantManage tenantManage){
\r
35 this.tenantManage = tenantManage;
\r
36 updateFlow = new UpdateFlow(dataBroker,tenantManage);
\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
44 if (errorInfo==null){
\r
45 errorInfo = createFlow(userId,flowname,flowmatch,propertyList);
\r
46 if (errorInfo==null)
\r
48 return updateFlow.FlowHandling(userId,this.flow);
\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
61 while (iterator.hasNext()){
\r
62 if (valueType.equals(NEMOConstants.range)) {
\r
63 errorInfo = "The property should just has one range value.";
\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
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
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
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
90 else if (tenantManage.getFlowDataStore(userId).containsKey(flowId)){
\r
91 flow1 = tenantManage.getFlowDataStore(userId).get(flowId);
\r
95 FlowId flowId = new FlowId(UUID.randomUUID().toString());
\r
96 flowBuilder.setKey(new FlowKey(flowId))
\r
100 flowBuilder.setKey(flow1.getKey())
\r
101 .setFlowId(flow1.getFlowId());
\r
104 flowBuilder.setFlowName(new FlowName(flowname));
\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
117 if (matchvalue.get(value).equals(NEMOConstants.integer)){
\r
118 matchItemValueBuilder.setIntValue(Long.parseLong(value));
\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
129 rangeValueBuilder.setMin(Long.parseLong(rangevalue[1]));
\r
130 rangeValueBuilder.setMax(Long.parseLong(rangevalue[0]));
\r
132 matchItemValueBuilder.setRangeValue(rangeValueBuilder.build());
\r
135 matchItemBuilder.setMatchItemValue(matchItemValueBuilder.build());
\r
136 matchItemList.add(matchItemBuilder.build());
\r
138 if (matchItemList.isEmpty()){
\r
139 matchItemList=null;
\r
140 flowBuilder.setMatchItem(matchItemList);
\r
142 flowBuilder.setMatchItem(matchItemList);
\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
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
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
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
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
183 rangeValueBuilder.setMin(Long.parseLong(rangevalue[1]));
\r
184 rangeValueBuilder.setMax(Long.parseLong(rangevalue[0]));
\r
186 Rangevalue = rangeValueBuilder.build();
\r
187 propertyValuesBuilder.setRangeValue(Rangevalue);
\r
191 if (intValueList.isEmpty()){
\r
192 intValueList = null;
\r
193 propertyValuesBuilder.setIntValue(intValueList);
\r
195 if (stringValueList.isEmpty()){
\r
196 stringValueList = null;
\r
197 propertyValuesBuilder.setStringValue(stringValueList);
\r
199 propertyValuesBuilder.setIntValue(intValueList).setStringValue(stringValueList).setRangeValue(Rangevalue);
\r
200 propertyBuilder.setPropertyValues(propertyValuesBuilder.build());
\r
201 flowproperty.add(propertyBuilder.build());
\r
203 flowBuilder.setProperty(flowproperty);
\r
205 this.flow = flowBuilder.build();
\r