2 * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved.
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
9 package org.opendaylight.openflowplugin.impl.common;
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;
52 * org.opendaylight.openflowplugin.impl.common
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}
59 * @author <a href="mailto:vdemcak@cisco.com">Vaclav Demcak</a>
61 * Created: Mar 27, 2015
63 public final class MultipartRequestInputFactory {
65 private MultipartRequestInputFactory () {
66 throw new UnsupportedOperationException("Factory class");
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}
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));
85 * Method validate input values and makes {@link MultipartRequestInput} from input values. Method set
86 * a moreRequest marker to false.
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);
101 * Method validates input and makes {@link MultipartRequestInput} from input values. Method creates
102 * default empty {@link MultipartRequestBody} by {@link MultipartType}
107 * @param moreRequests
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));
116 * Method validates input values and makes {@link MultipartRequestInput} from input values.
121 * @param moreRequests
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);
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.
139 * @param moreRequests
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);
151 return builder.build();
154 private static MultipartRequestBody makeDefaultEmptyRequestBody(@CheckForNull final MultipartType type) {
155 Preconditions.checkArgument(type != null, "Multipart Request can not by build without type!");
158 return new MultipartRequestDescCaseBuilder().build();
160 return new MultipartRequestFlowCaseBuilder().build();
162 return new MultipartRequestAggregateCaseBuilder().build();
164 return new MultipartRequestTableCaseBuilder().build();
166 return new MultipartRequestPortStatsCaseBuilder().build();
168 return new MultipartRequestQueueCaseBuilder().build();
170 return new MultipartRequestGroupCaseBuilder().build();
172 return new MultipartRequestGroupDescCaseBuilder().build();
173 case OFPMPGROUPFEATURES:
174 return new MultipartRequestGroupFeaturesCaseBuilder().build();
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();
184 return new MultipartRequestPortDescCaseBuilder().build();
185 case OFPMPEXPERIMENTER:
186 return new MultipartRequestExperimenterCaseBuilder().build();
188 throw new IllegalArgumentException("Unknown MultipartType " + type);
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!");
198 return body instanceof MultipartRequestDescCase;
200 return body instanceof MultipartRequestFlowCase;
202 return body instanceof MultipartRequestAggregateCase;
204 return body instanceof MultipartRequestTableCase;
206 return body instanceof MultipartRequestPortStatsCase;
208 return body instanceof MultipartRequestQueueCase;
210 return body instanceof MultipartRequestGroupCase;
212 return body instanceof MultipartRequestGroupDescCase;
213 case OFPMPGROUPFEATURES:
214 return body instanceof MultipartRequestGroupFeaturesCase;
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;
224 return body instanceof MultipartRequestPortDescCase;
225 case OFPMPEXPERIMENTER:
226 return body instanceof MultipartRequestExperimenterCase;
228 throw new IllegalArgumentException("Unknown MultipartType " + type);