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 java.math.BigInteger;
13 import javax.annotation.CheckForNull;
14 import javax.annotation.Nonnull;
15 import org.opendaylight.openflowjava.protocol.api.util.BinContent;
16 import org.opendaylight.openflowplugin.api.OFConstants;
17 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.GroupId;
18 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MeterId;
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MultipartRequestFlags;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MultipartType;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.OxmMatchType;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.grouping.MatchBuilder;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MultipartRequestInput;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MultipartRequestInputBuilder;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.MultipartRequestBody;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestAggregateCase;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestAggregateCaseBuilder;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestDescCase;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestDescCaseBuilder;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestExperimenterCase;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestExperimenterCaseBuilder;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestFlowCase;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestFlowCaseBuilder;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestGroupCase;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestGroupCaseBuilder;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestGroupDescCase;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestGroupDescCaseBuilder;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestGroupFeaturesCase;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestGroupFeaturesCaseBuilder;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestMeterCase;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestMeterCaseBuilder;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestMeterConfigCase;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestMeterConfigCaseBuilder;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestMeterFeaturesCase;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestMeterFeaturesCaseBuilder;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestPortDescCase;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestPortDescCaseBuilder;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestPortStatsCase;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestPortStatsCaseBuilder;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestQueueCase;
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestQueueCaseBuilder;
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestTableCase;
53 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestTableCaseBuilder;
54 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestTableFeaturesCase;
55 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestTableFeaturesCaseBuilder;
56 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.flow._case.MultipartRequestFlowBuilder;
57 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.group._case.MultipartRequestGroupBuilder;
58 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.meter._case.MultipartRequestMeterBuilder;
59 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.port.stats._case.MultipartRequestPortStatsBuilder;
60 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.queue._case.MultipartRequestQueueBuilder;
61 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.table.features._case.MultipartRequestTableFeaturesBuilder;
65 * org.opendaylight.openflowplugin.impl.common
67 * Factory class is designed for easy producing a MultipartRequestInput. Class should help
68 * to understand a relationship between {@link MultipartType} and {@link MultipartRequestInput}
69 * without touch OF specification 1.3.2 - a section 7.3.5. Multipart Messages
70 * {@see https://www.opennetworking.org/images/stories/downloads/sdn-resources/onf-specifications/openflow/openflow-spec-v1.3.2.pdf}
72 * @author <a href="mailto:vdemcak@cisco.com">Vaclav Demcak</a>
74 * Created: Mar 27, 2015
76 public final class MultipartRequestInputFactory {
78 private MultipartRequestInputFactory() {
79 throw new UnsupportedOperationException("Factory class");
83 * Method validate input and makes {@link MultipartRequestInput} from input values. Method set
84 * a moreRequest marker to false and it creates default empty {@link MultipartRequestBody}
85 * by {@link MultipartType}
92 public static MultipartRequestInput makeMultipartRequestInput(final long xid, final short ofVersion,
93 @Nonnull final MultipartType type) {
94 return maker(xid, type, ofVersion, false, makeDefaultEmptyRequestBody(type));
98 * Method validate input values and makes {@link MultipartRequestInput} from input values. Method set
99 * a moreRequest marker to false.
107 public static MultipartRequestInput makeMultipartRequestInput(final long xid, final short ofVersion,
108 @Nonnull final MultipartType type, @Nonnull final MultipartRequestBody body) {
109 Preconditions.checkArgument(validationOfMultipartTypeAndRequestBody(type, body));
110 return maker(xid, type, ofVersion, false, body);
114 * Method validates input and makes {@link MultipartRequestInput} from input values. Method creates
115 * default empty {@link MultipartRequestBody} by {@link MultipartType}
120 * @param moreRequests
123 public static MultipartRequestInput makeMultipartRequestInput(final long xid, final short ofVersion,
124 @Nonnull final MultipartType type, final boolean moreRequests) {
125 return maker(xid, type, ofVersion, moreRequests, makeDefaultEmptyRequestBody(type));
129 * Method validates input values and makes {@link MultipartRequestInput} from input values.
134 * @param moreRequests
138 public static MultipartRequestInput makeMultipartRequestInput(final long xid, final short ofVersion,
139 @Nonnull final MultipartType type, final boolean moreRequests,
140 @Nonnull final MultipartRequestBody body) {
141 Preconditions.checkArgument(validationOfMultipartTypeAndRequestBody(type, body));
142 return maker(xid, type, ofVersion, moreRequests, body);
146 * Method build {@link MultipartRequestInput} from input values. It is private because we would like
147 * to validate only what is really need to be validate.
152 * @param moreRequests
156 private static MultipartRequestInput maker(final long xid, final MultipartType type,
157 final short ofVersion, final boolean moreRequests, final MultipartRequestBody body) {
158 final MultipartRequestInputBuilder builder = new MultipartRequestInputBuilder();
159 builder.setFlags(new MultipartRequestFlags(moreRequests));
160 builder.setMultipartRequestBody(body);
161 builder.setVersion(ofVersion);
162 builder.setType(type);
164 return builder.build();
167 private static MultipartRequestBody makeDefaultEmptyRequestBody(@CheckForNull final MultipartType type) {
168 Preconditions.checkArgument(type != null, "Multipart Request can not by build without type!");
171 return new MultipartRequestDescCaseBuilder().build();
173 MultipartRequestFlowCaseBuilder multipartRequestFlowCaseBuilder = new MultipartRequestFlowCaseBuilder();
174 MultipartRequestFlowBuilder multipartRequestFlowBuilder = new MultipartRequestFlowBuilder();
175 multipartRequestFlowBuilder.setTableId(OFConstants.OFPTT_ALL);
176 multipartRequestFlowBuilder.setOutPort(OFConstants.OFPP_ANY);
177 multipartRequestFlowBuilder.setOutGroup(OFConstants.OFPG_ANY);
178 multipartRequestFlowBuilder.setCookie(BigInteger.ZERO);
179 multipartRequestFlowBuilder.setCookieMask(BigInteger.ZERO);
180 multipartRequestFlowBuilder.setMatch(new MatchBuilder().setType(OxmMatchType.class).build());
181 multipartRequestFlowCaseBuilder.setMultipartRequestFlow(multipartRequestFlowBuilder.build());
182 return multipartRequestFlowCaseBuilder.build();
184 return new MultipartRequestAggregateCaseBuilder().build();
186 return new MultipartRequestTableCaseBuilder().build();
188 MultipartRequestPortStatsCaseBuilder multipartRequestPortStatsCaseBuilder = new MultipartRequestPortStatsCaseBuilder();
189 MultipartRequestPortStatsBuilder multipartRequestPortStatsBuilder = new MultipartRequestPortStatsBuilder();
190 multipartRequestPortStatsBuilder.setPortNo(OFConstants.OFPP_ANY);
191 multipartRequestPortStatsCaseBuilder.setMultipartRequestPortStats(multipartRequestPortStatsBuilder.build());
192 return multipartRequestPortStatsCaseBuilder.build();
194 MultipartRequestQueueCaseBuilder multipartRequestQueueCaseBuilder = new MultipartRequestQueueCaseBuilder();
195 MultipartRequestQueueBuilder multipartRequestQueueBuilder = new MultipartRequestQueueBuilder();
196 multipartRequestQueueBuilder.setPortNo(OFConstants.OFPP_ANY);
197 multipartRequestQueueBuilder.setQueueId(OFConstants.OFPQ_ALL);
198 multipartRequestQueueCaseBuilder.setMultipartRequestQueue(multipartRequestQueueBuilder.build());
199 return multipartRequestQueueCaseBuilder.build();
201 MultipartRequestGroupCaseBuilder multipartRequestGroupCaseBuilder = new MultipartRequestGroupCaseBuilder();
202 MultipartRequestGroupBuilder multipartRequestGroupBuilder = new MultipartRequestGroupBuilder();
203 GroupId groupId = new GroupId(OFConstants.OFPG_ALL);
204 multipartRequestGroupBuilder.setGroupId(groupId);
205 multipartRequestGroupCaseBuilder.setMultipartRequestGroup(multipartRequestGroupBuilder.build());
206 return multipartRequestGroupCaseBuilder.build();
208 return new MultipartRequestGroupDescCaseBuilder().build();
209 case OFPMPGROUPFEATURES:
210 return new MultipartRequestGroupFeaturesCaseBuilder().build();
212 MultipartRequestMeterCaseBuilder multipartRequestMeterCaseBuilder = new MultipartRequestMeterCaseBuilder();
213 MultipartRequestMeterBuilder multipartRequestMeterBuilder = new MultipartRequestMeterBuilder();
214 MeterId meterId = new MeterId(OFConstants.OFPP_ANY);
215 multipartRequestMeterBuilder.setMeterId(meterId);
216 multipartRequestMeterCaseBuilder.setMultipartRequestMeter(multipartRequestMeterBuilder.build());
217 return multipartRequestMeterCaseBuilder.build();
218 case OFPMPMETERCONFIG:
219 return new MultipartRequestMeterConfigCaseBuilder().build();
220 case OFPMPMETERFEATURES:
221 return new MultipartRequestMeterFeaturesCaseBuilder().build();
222 case OFPMPTABLEFEATURES:
223 MultipartRequestTableFeaturesCaseBuilder tableFeaturesCaseBuilder = new MultipartRequestTableFeaturesCaseBuilder();
224 tableFeaturesCaseBuilder.setMultipartRequestTableFeatures(new MultipartRequestTableFeaturesBuilder().build());
225 return tableFeaturesCaseBuilder.build();
227 return new MultipartRequestPortDescCaseBuilder().build();
228 case OFPMPEXPERIMENTER:
229 return new MultipartRequestExperimenterCaseBuilder().build();
231 throw new IllegalArgumentException("Unknown MultipartType " + type);
235 private static boolean validationOfMultipartTypeAndRequestBody(@CheckForNull final MultipartType type,
236 @CheckForNull final MultipartRequestBody body) {
237 Preconditions.checkArgument(type != null, "Multipart Request can not by build without type!");
238 Preconditions.checkArgument(body != null, "Multipart Request can not by build without body!");
241 return body instanceof MultipartRequestDescCase;
243 return body instanceof MultipartRequestFlowCase;
245 return body instanceof MultipartRequestAggregateCase;
247 return body instanceof MultipartRequestTableCase;
249 return body instanceof MultipartRequestPortStatsCase;
251 return body instanceof MultipartRequestQueueCase;
253 return body instanceof MultipartRequestGroupCase;
255 return body instanceof MultipartRequestGroupDescCase;
256 case OFPMPGROUPFEATURES:
257 return body instanceof MultipartRequestGroupFeaturesCase;
259 return body instanceof MultipartRequestMeterCase;
260 case OFPMPMETERCONFIG:
261 return body instanceof MultipartRequestMeterConfigCase;
262 case OFPMPMETERFEATURES:
263 return body instanceof MultipartRequestMeterFeaturesCase;
264 case OFPMPTABLEFEATURES:
265 return body instanceof MultipartRequestTableFeaturesCase;
267 return body instanceof MultipartRequestPortDescCase;
268 case OFPMPEXPERIMENTER:
269 return body instanceof MultipartRequestExperimenterCase;
271 throw new IllegalArgumentException("Unknown MultipartType " + type);