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.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;
64 * org.opendaylight.openflowplugin.impl.common
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}
71 * @author <a href="mailto:vdemcak@cisco.com">Vaclav Demcak</a>
73 * Created: Mar 27, 2015
75 public final class MultipartRequestInputFactory {
77 private MultipartRequestInputFactory() {
78 throw new UnsupportedOperationException("Factory class");
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}
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));
97 * Method validate input values and makes {@link MultipartRequestInput} from input values. Method set
98 * a moreRequest marker to false.
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);
113 * Method validates input and makes {@link MultipartRequestInput} from input values. Method creates
114 * default empty {@link MultipartRequestBody} by {@link MultipartType}
119 * @param moreRequests
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));
128 * Method validates input values and makes {@link MultipartRequestInput} from input values.
133 * @param moreRequests
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);
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.
151 * @param moreRequests
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);
163 return builder.build();
166 private static MultipartRequestBody makeDefaultEmptyRequestBody(@CheckForNull final MultipartType type) {
167 Preconditions.checkArgument(type != null, "Multipart Request can not by build without type!");
170 return new MultipartRequestDescCaseBuilder().build();
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();
183 return new MultipartRequestAggregateCaseBuilder().build();
185 return new MultipartRequestTableCaseBuilder().build();
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();
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();
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();
207 return new MultipartRequestGroupDescCaseBuilder().build();
208 case OFPMPGROUPFEATURES:
209 return new MultipartRequestGroupFeaturesCaseBuilder().build();
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();
226 return new MultipartRequestPortDescCaseBuilder().build();
227 case OFPMPEXPERIMENTER:
228 return new MultipartRequestExperimenterCaseBuilder().build();
230 throw new IllegalArgumentException("Unknown MultipartType " + type);
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!");
240 return body instanceof MultipartRequestDescCase;
242 return body instanceof MultipartRequestFlowCase;
244 return body instanceof MultipartRequestAggregateCase;
246 return body instanceof MultipartRequestTableCase;
248 return body instanceof MultipartRequestPortStatsCase;
250 return body instanceof MultipartRequestQueueCase;
252 return body instanceof MultipartRequestGroupCase;
254 return body instanceof MultipartRequestGroupDescCase;
255 case OFPMPGROUPFEATURES:
256 return body instanceof MultipartRequestGroupFeaturesCase;
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;
266 return body instanceof MultipartRequestPortDescCase;
267 case OFPMPEXPERIMENTER:
268 return body instanceof MultipartRequestExperimenterCase;
270 throw new IllegalArgumentException("Unknown MultipartType " + type);