MultipartRequestInputFactory
[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 javax.annotation.CheckForNull;
13 import javax.annotation.Nonnull;
14 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MultipartRequestFlags;
15 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MultipartType;
16 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MultipartRequestInput;
17 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MultipartRequestInputBuilder;
18 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.MultipartRequestBody;
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestAggregateCase;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestAggregateCaseBuilder;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestDescCase;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestDescCaseBuilder;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestExperimenterCase;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestExperimenterCaseBuilder;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestFlowCase;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestFlowCaseBuilder;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestGroupCase;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestGroupCaseBuilder;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestGroupDescCase;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestGroupDescCaseBuilder;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestGroupFeaturesCase;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestGroupFeaturesCaseBuilder;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestMeterCase;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestMeterCaseBuilder;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestMeterConfigCase;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestMeterConfigCaseBuilder;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestMeterFeaturesCase;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestMeterFeaturesCaseBuilder;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestPortDescCase;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestPortDescCaseBuilder;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestPortStatsCase;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestPortStatsCaseBuilder;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestQueueCase;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestQueueCaseBuilder;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestTableCase;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestTableCaseBuilder;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestTableFeaturesCase;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestTableFeaturesCaseBuilder;
49
50 /**
51  * openflowplugin-impl
52  * org.opendaylight.openflowplugin.impl.common
53  *
54  * Factory class is designed for easy producing a MultipartRequestInput. Class should help
55  * to understand a relationship between {@link MultipartType} and {@link MultipartRequestInput}
56  * without touch OF specification 1.3.2  - a section 7.3.5. Multipart Messages
57  * {@see https://www.opennetworking.org/images/stories/downloads/sdn-resources/onf-specifications/openflow/openflow-spec-v1.3.2.pdf}
58  *
59  * @author <a href="mailto:vdemcak@cisco.com">Vaclav Demcak</a>
60  *
61  * Created: Mar 27, 2015
62  */
63 public final class MultipartRequestInputFactory {
64
65     private MultipartRequestInputFactory () {
66         throw new UnsupportedOperationException("Factory class");
67     }
68
69     /**
70      * Method validate input and makes {@link MultipartRequestInput} from input values. Method set
71      * a moreRequest marker to false and it creates default empty {@link MultipartRequestBody}
72      * by {@link MultipartType}
73      *
74      * @param xid
75      * @param type
76      * @param ofVersion
77      * @return
78      */
79     public static MultipartRequestInput makeMultipartRequestInput(final long xid, final short ofVersion,
80             @Nonnull final MultipartType type) {
81         return maker(xid, type, ofVersion, false, makeDefaultEmptyRequestBody(type));
82     }
83
84     /**
85      * Method validate input values and makes {@link MultipartRequestInput} from input values. Method set
86      * a moreRequest marker to false.
87      *
88      * @param xid
89      * @param type
90      * @param ofVersion
91      * @param body
92      * @return
93      */
94     public static MultipartRequestInput makeMultipartRequestInput(final long xid, final short ofVersion,
95             @Nonnull final MultipartType type, @Nonnull final MultipartRequestBody body) {
96         Preconditions.checkArgument(validationOfMultipartTypeAndRequestBody(type, body));
97         return maker(xid, type, ofVersion, false, body);
98     }
99
100     /**
101      * Method validates input and makes {@link MultipartRequestInput} from input values. Method creates
102      * default empty {@link MultipartRequestBody} by {@link MultipartType}
103      *
104      * @param xid
105      * @param type
106      * @param ofVersion
107      * @param moreRequests
108      * @return
109      */
110     public static MultipartRequestInput makeMultipartRequestInput(final long xid, final short ofVersion,
111             @Nonnull final MultipartType type, final boolean moreRequests) {
112         return maker(xid, type, ofVersion, moreRequests, makeDefaultEmptyRequestBody(type));
113     }
114
115     /**
116      * Method validates input values and makes {@link MultipartRequestInput} from input values.
117      *
118      * @param xid
119      * @param type
120      * @param ofVersion
121      * @param moreRequests
122      * @param body
123      * @return
124      */
125     public static MultipartRequestInput makeMultipartRequestInput(final long xid, final short ofVersion,
126             @Nonnull final MultipartType type, final boolean moreRequests,
127             @Nonnull final MultipartRequestBody body) {
128         Preconditions.checkArgument(validationOfMultipartTypeAndRequestBody(type, body));
129         return maker(xid, type, ofVersion, moreRequests, body);
130     }
131
132     /**
133      * Method build {@link MultipartRequestInput} from input values. It is private because we would like
134      * to validate only what is really need to be validate.
135      *
136      * @param xid
137      * @param type
138      * @param ofVersion
139      * @param moreRequests
140      * @param body
141      * @return
142      */
143     private static MultipartRequestInput maker(final long xid, final MultipartType type,
144             final short ofVersion, final boolean moreRequests, final MultipartRequestBody body) {
145         final MultipartRequestInputBuilder builder = new MultipartRequestInputBuilder();
146         builder.setFlags(new MultipartRequestFlags(moreRequests));
147         builder.setMultipartRequestBody(body);
148         builder.setVersion(ofVersion);
149         builder.setType(type);
150         builder.setXid(xid);
151         return builder.build();
152     }
153
154     private static MultipartRequestBody makeDefaultEmptyRequestBody(@CheckForNull final MultipartType type) {
155         Preconditions.checkArgument(type != null, "Multipart Request can not by build without type!");
156         switch (type) {
157         case OFPMPDESC:
158             return new MultipartRequestDescCaseBuilder().build();
159         case OFPMPFLOW:
160             return new MultipartRequestFlowCaseBuilder().build();
161         case OFPMPAGGREGATE:
162             return new MultipartRequestAggregateCaseBuilder().build();
163         case OFPMPTABLE:
164             return new MultipartRequestTableCaseBuilder().build();
165         case OFPMPPORTSTATS:
166             return new MultipartRequestPortStatsCaseBuilder().build();
167         case OFPMPQUEUE:
168             return new MultipartRequestQueueCaseBuilder().build();
169         case OFPMPGROUP:
170             return new MultipartRequestGroupCaseBuilder().build();
171         case OFPMPGROUPDESC:
172             return new MultipartRequestGroupDescCaseBuilder().build();
173         case OFPMPGROUPFEATURES:
174             return new MultipartRequestGroupFeaturesCaseBuilder().build();
175         case OFPMPMETER:
176             return new MultipartRequestMeterCaseBuilder().build();
177         case OFPMPMETERCONFIG:
178             return new MultipartRequestMeterConfigCaseBuilder().build();
179         case OFPMPMETERFEATURES:
180             return new MultipartRequestMeterFeaturesCaseBuilder().build();
181         case OFPMPTABLEFEATURES:
182             return new MultipartRequestTableFeaturesCaseBuilder().build();
183         case OFPMPPORTDESC:
184             return new MultipartRequestPortDescCaseBuilder().build();
185         case OFPMPEXPERIMENTER:
186             return new MultipartRequestExperimenterCaseBuilder().build();
187         default:
188             throw new IllegalArgumentException("Unknown MultipartType " + type);
189         }
190     }
191
192     private static boolean validationOfMultipartTypeAndRequestBody(@CheckForNull final MultipartType type,
193             @CheckForNull final MultipartRequestBody body) {
194         Preconditions.checkArgument(type != null, "Multipart Request can not by build without type!");
195         Preconditions.checkArgument(body != null, "Multipart Request can not by build without body!");
196         switch (type) {
197         case OFPMPDESC:
198             return body instanceof MultipartRequestDescCase;
199         case OFPMPFLOW:
200             return body instanceof MultipartRequestFlowCase;
201         case OFPMPAGGREGATE:
202             return body instanceof MultipartRequestAggregateCase;
203         case OFPMPTABLE:
204             return body instanceof MultipartRequestTableCase;
205         case OFPMPPORTSTATS:
206             return body instanceof MultipartRequestPortStatsCase;
207         case OFPMPQUEUE:
208             return body instanceof MultipartRequestQueueCase;
209         case OFPMPGROUP:
210             return body instanceof MultipartRequestGroupCase;
211         case OFPMPGROUPDESC:
212             return body instanceof MultipartRequestGroupDescCase;
213         case OFPMPGROUPFEATURES:
214             return body instanceof MultipartRequestGroupFeaturesCase;
215         case OFPMPMETER:
216             return body instanceof MultipartRequestMeterCase;
217         case OFPMPMETERCONFIG:
218             return body instanceof MultipartRequestMeterConfigCase;
219         case OFPMPMETERFEATURES:
220             return body instanceof MultipartRequestMeterFeaturesCase;
221         case OFPMPTABLEFEATURES:
222             return body instanceof MultipartRequestTableFeaturesCase;
223         case OFPMPPORTDESC:
224             return body instanceof MultipartRequestPortDescCase;
225         case OFPMPEXPERIMENTER:
226             return body instanceof MultipartRequestExperimenterCase;
227         default:
228             throw new IllegalArgumentException("Unknown MultipartType " + type);
229         }
230     }
231 }