32c83e742d889f5167ec2ec79fb0ca88043a8680
[openflowplugin.git] / openflowplugin-impl / src / main / java / org / opendaylight / openflowplugin / impl / common / MultipartRequestInputFactory.java
1 /**
2  * Copyright (c) 2015 Cisco Systems, Inc. and others.  All rights reserved.
3  *
4  * This program and the accompanying materials are made available under the
5  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6  * and is available at http://www.eclipse.org/legal/epl-v10.html
7  */
8
9 package org.opendaylight.openflowplugin.impl.common;
10
11 import com.google.common.base.Preconditions;
12 import java.math.BigInteger;
13 import javax.annotation.CheckForNull;
14 import javax.annotation.Nonnull;
15 import org.opendaylight.openflowplugin.api.OFConstants;
16 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.GroupId;
17 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MeterId;
18 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MultipartRequestFlags;
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MultipartType;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.OxmMatchType;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.grouping.MatchBuilder;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MultipartRequestInput;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MultipartRequestInputBuilder;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.MultipartRequestBody;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestAggregateCase;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestAggregateCaseBuilder;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestDescCase;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestDescCaseBuilder;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestExperimenterCase;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestExperimenterCaseBuilder;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestFlowCase;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestFlowCaseBuilder;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestGroupCase;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestGroupCaseBuilder;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestGroupDescCase;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestGroupDescCaseBuilder;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestGroupFeaturesCase;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestGroupFeaturesCaseBuilder;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestMeterCase;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestMeterCaseBuilder;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestMeterConfigCase;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestMeterConfigCaseBuilder;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestMeterFeaturesCase;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestMeterFeaturesCaseBuilder;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestPortDescCase;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestPortDescCaseBuilder;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestPortStatsCase;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestPortStatsCaseBuilder;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestQueueCase;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestQueueCaseBuilder;
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestTableCase;
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestTableCaseBuilder;
53 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestTableFeaturesCase;
54 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestTableFeaturesCaseBuilder;
55 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.flow._case.MultipartRequestFlowBuilder;
56 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.group._case.MultipartRequestGroupBuilder;
57 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.meter._case.MultipartRequestMeterBuilder;
58 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.port.stats._case.MultipartRequestPortStatsBuilder;
59 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.queue._case.MultipartRequestQueueBuilder;
60 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.table.features._case.MultipartRequestTableFeaturesBuilder;
61
62 /**
63  * openflowplugin-impl
64  * org.opendaylight.openflowplugin.impl.common
65  * <p/>
66  * Factory class is designed for easy producing a MultipartRequestInput. Class should help
67  * to understand a relationship between {@link MultipartType} and {@link MultipartRequestInput}
68  * without touch OF specification 1.3.2  - a section 7.3.5. Multipart Messages
69  * {@see https://www.opennetworking.org/images/stories/downloads/sdn-resources/onf-specifications/openflow/openflow-spec-v1.3.2.pdf}
70  *
71  * @author <a href="mailto:vdemcak@cisco.com">Vaclav Demcak</a>
72  *         <p/>
73  *         Created: Mar 27, 2015
74  */
75 public final class MultipartRequestInputFactory {
76
77     private MultipartRequestInputFactory() {
78         throw new UnsupportedOperationException("Factory class");
79     }
80
81     /**
82      * Method validate input and makes {@link MultipartRequestInput} from input values. Method set
83      * a moreRequest marker to false and it creates default empty {@link MultipartRequestBody}
84      * by {@link MultipartType}
85      *
86      * @param xid
87      * @param type
88      * @param ofVersion
89      * @return
90      */
91     public static MultipartRequestInput makeMultipartRequestInput(final long xid, final short ofVersion,
92                                                                   @Nonnull final MultipartType type) {
93         return maker(xid, type, ofVersion, false, makeDefaultEmptyRequestBody(type));
94     }
95
96     /**
97      * Method validate input values and makes {@link MultipartRequestInput} from input values. Method set
98      * a moreRequest marker to false.
99      *
100      * @param xid
101      * @param type
102      * @param ofVersion
103      * @param body
104      * @return
105      */
106     public static MultipartRequestInput makeMultipartRequestInput(final long xid, final short ofVersion,
107                                                                   @Nonnull final MultipartType type, @Nonnull final MultipartRequestBody body) {
108         Preconditions.checkArgument(validationOfMultipartTypeAndRequestBody(type, body));
109         return maker(xid, type, ofVersion, false, body);
110     }
111
112     /**
113      * Method validates input and makes {@link MultipartRequestInput} from input values. Method creates
114      * default empty {@link MultipartRequestBody} by {@link MultipartType}
115      *
116      * @param xid
117      * @param type
118      * @param ofVersion
119      * @param moreRequests
120      * @return
121      */
122     public static MultipartRequestInput makeMultipartRequestInput(final long xid, final short ofVersion,
123                                                                   @Nonnull final MultipartType type, final boolean moreRequests) {
124         return maker(xid, type, ofVersion, moreRequests, makeDefaultEmptyRequestBody(type));
125     }
126
127     /**
128      * Method validates input values and makes {@link MultipartRequestInput} from input values.
129      *
130      * @param xid
131      * @param type
132      * @param ofVersion
133      * @param moreRequests
134      * @param body
135      * @return
136      */
137     public static MultipartRequestInput makeMultipartRequestInput(final long xid, final short ofVersion,
138                                                                   @Nonnull final MultipartType type, final boolean moreRequests,
139                                                                   @Nonnull final MultipartRequestBody body) {
140         Preconditions.checkArgument(validationOfMultipartTypeAndRequestBody(type, body));
141         return maker(xid, type, ofVersion, moreRequests, body);
142     }
143
144     /**
145      * Method build {@link MultipartRequestInput} from input values. It is private because we would like
146      * to validate only what is really need to be validate.
147      *
148      * @param xid
149      * @param type
150      * @param ofVersion
151      * @param moreRequests
152      * @param body
153      * @return
154      */
155     private static MultipartRequestInput maker(final long xid, final MultipartType type,
156                                                final short ofVersion, final boolean moreRequests, final MultipartRequestBody body) {
157         final MultipartRequestInputBuilder builder = new MultipartRequestInputBuilder();
158         builder.setFlags(new MultipartRequestFlags(moreRequests));
159         builder.setMultipartRequestBody(body);
160         builder.setVersion(ofVersion);
161         builder.setType(type);
162         builder.setXid(xid);
163         return builder.build();
164     }
165
166     private static MultipartRequestBody makeDefaultEmptyRequestBody(@CheckForNull final MultipartType type) {
167         Preconditions.checkArgument(type != null, "Multipart Request can not by build without type!");
168         switch (type) {
169             case OFPMPDESC:
170                 return new MultipartRequestDescCaseBuilder().build();
171             case OFPMPFLOW:
172                 MultipartRequestFlowCaseBuilder multipartRequestFlowCaseBuilder = new MultipartRequestFlowCaseBuilder();
173                 MultipartRequestFlowBuilder multipartRequestFlowBuilder = new MultipartRequestFlowBuilder();
174                 multipartRequestFlowBuilder.setTableId(OFConstants.OFPTT_ALL);
175                 multipartRequestFlowBuilder.setOutPort(OFConstants.OFPP_ANY);
176                 multipartRequestFlowBuilder.setOutGroup(OFConstants.OFPG_ANY);
177                 multipartRequestFlowBuilder.setCookie(BigInteger.ZERO);
178                 multipartRequestFlowBuilder.setCookieMask(BigInteger.ZERO);
179                 multipartRequestFlowBuilder.setMatch(new MatchBuilder().setType(OxmMatchType.class).build());
180                 multipartRequestFlowCaseBuilder.setMultipartRequestFlow(multipartRequestFlowBuilder.build());
181                 return multipartRequestFlowCaseBuilder.build();
182             case OFPMPAGGREGATE:
183                 return new MultipartRequestAggregateCaseBuilder().build();
184             case OFPMPTABLE:
185                 return new MultipartRequestTableCaseBuilder().build();
186             case OFPMPPORTSTATS:
187                 MultipartRequestPortStatsCaseBuilder multipartRequestPortStatsCaseBuilder = new MultipartRequestPortStatsCaseBuilder();
188                 MultipartRequestPortStatsBuilder multipartRequestPortStatsBuilder = new MultipartRequestPortStatsBuilder();
189                 multipartRequestPortStatsBuilder.setPortNo(OFConstants.OFPP_ANY);
190                 multipartRequestPortStatsCaseBuilder.setMultipartRequestPortStats(multipartRequestPortStatsBuilder.build());
191                 return multipartRequestPortStatsCaseBuilder.build();
192             case OFPMPQUEUE:
193                 MultipartRequestQueueCaseBuilder multipartRequestQueueCaseBuilder = new MultipartRequestQueueCaseBuilder();
194                 MultipartRequestQueueBuilder multipartRequestQueueBuilder = new MultipartRequestQueueBuilder();
195                 multipartRequestQueueBuilder.setPortNo(OFConstants.OFPP_ANY);
196                 multipartRequestQueueBuilder.setQueueId(OFConstants.OFPQ_ALL);
197                 multipartRequestQueueCaseBuilder.setMultipartRequestQueue(multipartRequestQueueBuilder.build());
198                 return multipartRequestQueueCaseBuilder.build();
199             case OFPMPGROUP:
200                 MultipartRequestGroupCaseBuilder multipartRequestGroupCaseBuilder = new MultipartRequestGroupCaseBuilder();
201                 MultipartRequestGroupBuilder multipartRequestGroupBuilder = new MultipartRequestGroupBuilder();
202                 GroupId groupId = new GroupId(OFConstants.OFPG_ANY);
203                 multipartRequestGroupBuilder.setGroupId(groupId);
204                 multipartRequestGroupCaseBuilder.setMultipartRequestGroup(multipartRequestGroupBuilder.build());
205                 return multipartRequestGroupCaseBuilder.build();
206             case OFPMPGROUPDESC:
207                 return new MultipartRequestGroupDescCaseBuilder().build();
208             case OFPMPGROUPFEATURES:
209                 return new MultipartRequestGroupFeaturesCaseBuilder().build();
210             case OFPMPMETER:
211                 MultipartRequestMeterCaseBuilder multipartRequestMeterCaseBuilder = new MultipartRequestMeterCaseBuilder();
212                 MultipartRequestMeterBuilder multipartRequestMeterBuilder = new MultipartRequestMeterBuilder();
213                 MeterId meterId = new MeterId(OFConstants.OFPP_ANY);
214                 multipartRequestMeterBuilder.setMeterId(meterId);
215                 multipartRequestMeterCaseBuilder.setMultipartRequestMeter(multipartRequestMeterBuilder.build());
216                 return multipartRequestMeterCaseBuilder.build();
217             case OFPMPMETERCONFIG:
218                 return new MultipartRequestMeterConfigCaseBuilder().build();
219             case OFPMPMETERFEATURES:
220                 return new MultipartRequestMeterFeaturesCaseBuilder().build();
221             case OFPMPTABLEFEATURES:
222                 MultipartRequestTableFeaturesCaseBuilder tableFeaturesCaseBuilder = new MultipartRequestTableFeaturesCaseBuilder();
223                 tableFeaturesCaseBuilder.setMultipartRequestTableFeatures(new MultipartRequestTableFeaturesBuilder().build());
224                 return tableFeaturesCaseBuilder.build();
225             case OFPMPPORTDESC:
226                 return new MultipartRequestPortDescCaseBuilder().build();
227             case OFPMPEXPERIMENTER:
228                 return new MultipartRequestExperimenterCaseBuilder().build();
229             default:
230                 throw new IllegalArgumentException("Unknown MultipartType " + type);
231         }
232     }
233
234     private static boolean validationOfMultipartTypeAndRequestBody(@CheckForNull final MultipartType type,
235                                                                    @CheckForNull final MultipartRequestBody body) {
236         Preconditions.checkArgument(type != null, "Multipart Request can not by build without type!");
237         Preconditions.checkArgument(body != null, "Multipart Request can not by build without body!");
238         switch (type) {
239             case OFPMPDESC:
240                 return body instanceof MultipartRequestDescCase;
241             case OFPMPFLOW:
242                 return body instanceof MultipartRequestFlowCase;
243             case OFPMPAGGREGATE:
244                 return body instanceof MultipartRequestAggregateCase;
245             case OFPMPTABLE:
246                 return body instanceof MultipartRequestTableCase;
247             case OFPMPPORTSTATS:
248                 return body instanceof MultipartRequestPortStatsCase;
249             case OFPMPQUEUE:
250                 return body instanceof MultipartRequestQueueCase;
251             case OFPMPGROUP:
252                 return body instanceof MultipartRequestGroupCase;
253             case OFPMPGROUPDESC:
254                 return body instanceof MultipartRequestGroupDescCase;
255             case OFPMPGROUPFEATURES:
256                 return body instanceof MultipartRequestGroupFeaturesCase;
257             case OFPMPMETER:
258                 return body instanceof MultipartRequestMeterCase;
259             case OFPMPMETERCONFIG:
260                 return body instanceof MultipartRequestMeterConfigCase;
261             case OFPMPMETERFEATURES:
262                 return body instanceof MultipartRequestMeterFeaturesCase;
263             case OFPMPTABLEFEATURES:
264                 return body instanceof MultipartRequestTableFeaturesCase;
265             case OFPMPPORTDESC:
266                 return body instanceof MultipartRequestPortDescCase;
267             case OFPMPEXPERIMENTER:
268                 return body instanceof MultipartRequestExperimenterCase;
269             default:
270                 throw new IllegalArgumentException("Unknown MultipartType " + type);
271         }
272     }
273 }