Remove utility class constructor exceptions
[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 package org.opendaylight.openflowplugin.impl.common;
9
10 import org.eclipse.jdt.annotation.NonNull;
11 import org.opendaylight.openflowplugin.api.OFConstants;
12 import org.opendaylight.openflowplugin.impl.util.MatchUtil;
13 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.multipart.request.multipart.request.body.MultipartRequestDescBuilder;
14 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.table.statistics.rev131215.multipart.request.multipart.request.body.MultipartRequestFlowTableStatsBuilder;
15 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.port.rev130925.multipart.request.multipart.request.body.MultipartRequestPortDescBuilder;
16 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.multipart.request.multipart.request.body.MultipartRequestFlowAggregateStatsBuilder;
17 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.multipart.request.multipart.request.body.MultipartRequestFlowStatsBuilder;
18 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.multipart.request.multipart.request.body.multipart.request.flow.stats.FlowStatsBuilder;
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.multipart.request.multipart.request.body.MultipartRequestGroupDescBuilder;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.multipart.request.multipart.request.body.MultipartRequestGroupFeaturesBuilder;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.multipart.request.multipart.request.body.MultipartRequestGroupStatsBuilder;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.multipart.request.multipart.request.body.MultipartRequestMeterFeaturesBuilder;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.multipart.request.multipart.request.body.MultipartRequestMeterStatsBuilder;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.multipart.types.rev170112.MultipartRequestBuilder;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.GroupId;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MeterId;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MultipartRequestFlags;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MultipartType;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.OxmMatchType;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.grouping.MatchBuilder;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MultipartRequestInput;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MultipartRequestInputBuilder;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.OfHeader;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.MultipartRequestBody;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestAggregateCaseBuilder;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestDescCaseBuilder;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestExperimenterCaseBuilder;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestFlowCaseBuilder;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestGroupCaseBuilder;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestGroupDescCaseBuilder;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestGroupFeaturesCaseBuilder;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestMeterCaseBuilder;
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.MultipartRequestMeterFeaturesCaseBuilder;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestPortDescCaseBuilder;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestPortStatsCaseBuilder;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestQueueCaseBuilder;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestTableCaseBuilder;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestTableFeaturesCaseBuilder;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.flow._case.MultipartRequestFlowBuilder;
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.group._case.MultipartRequestGroupBuilder;
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.meter._case.MultipartRequestMeterBuilder;
53 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.meter.config._case.MultipartRequestMeterConfigBuilder;
54 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.port.stats._case.MultipartRequestPortStatsBuilder;
55 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.queue._case.MultipartRequestQueueBuilder;
56 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.table.features._case.MultipartRequestTableFeaturesBuilder;
57 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.experimenter.types.rev151020.multipart.request.multipart.request.body.MultipartRequestExperimenterBuilder;
58 import org.opendaylight.yang.gen.v1.urn.opendaylight.queue.statistics.rev131216.multipart.request.multipart.request.body.MultipartRequestQueueStatsBuilder;
59 import org.opendaylight.yangtools.yang.common.Uint32;
60 import org.opendaylight.yangtools.yang.common.Uint8;
61
62 /**
63  * openflowplugin-impl
64  * org.opendaylight.openflowplugin.impl.common
65  * Factory class is designed for easy producing a MultipartRequestInput. Class should help
66  * to understand a relationship between {@link MultipartType} and {@link MultipartRequestInput}
67  * without touch OF specification 1.3.2  - a section 7.3.5. Multipart Messages
68  */
69 public final class MultipartRequestInputFactory {
70     private MultipartRequestInputFactory() {
71         // Hidden on purpose
72     }
73
74     /**
75      * Method validate input and makes
76      * {@link org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.OfHeader}
77      * from input values. Method set a moreRequest marker to false and it creates default empty multipart request body
78      * by {@link MultipartType}
79      *
80      * @param xid xid
81      * @param version OpenFlow version
82      * @param type multipart type
83      * @param canUseSingleLayer can use single layer serialization
84      * @return multipart request
85      */
86     public static OfHeader makeMultipartRequest(final Uint32 xid,
87                                                 final Uint8 version,
88                                                 @NonNull final MultipartType type,
89                                                 final boolean canUseSingleLayer) {
90         return canUseSingleLayer
91                 ? new MultipartRequestBuilder()
92                     .setRequestMore(false)
93                     .setVersion(version)
94                     .setXid(xid)
95                     .setMultipartRequestBody(makeDefaultSingleLayerBody(type))
96                     .build()
97                 : new MultipartRequestInputBuilder()
98                     .setFlags(new MultipartRequestFlags(false))
99                     .setMultipartRequestBody(makeDefaultMultiLayerBody(type, version))
100                     .setVersion(version)
101                     .setType(type)
102                     .setXid(xid)
103                     .build();
104     }
105
106     private static org.opendaylight.yang.gen.v1.urn.opendaylight.multipart.types.rev170112.multipart.request
107         .MultipartRequestBody makeDefaultSingleLayerBody(final MultipartType type) {
108         switch (type) {
109             case OFPMPDESC: return new MultipartRequestDescBuilder().build();
110             case OFPMPFLOW: return new MultipartRequestFlowStatsBuilder().setFlowStats(new FlowStatsBuilder()
111                 .setMatch(new org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow
112                     .MatchBuilder().build()).build()).build();
113             case OFPMPAGGREGATE: return new MultipartRequestFlowAggregateStatsBuilder().build();
114             case OFPMPTABLE: return new MultipartRequestFlowTableStatsBuilder().build();
115             case OFPMPPORTSTATS: return new org.opendaylight.yang.gen.v1.urn.opendaylight.port.statistics
116                     .rev131214.multipart.request.multipart.request.body.MultipartRequestPortStatsBuilder().build();
117             case OFPMPQUEUE: return new MultipartRequestQueueStatsBuilder().build();
118             case OFPMPGROUP: return new MultipartRequestGroupStatsBuilder().build();
119             case OFPMPGROUPDESC: return new MultipartRequestGroupDescBuilder().build();
120             case OFPMPGROUPFEATURES: return new MultipartRequestGroupFeaturesBuilder().build();
121             case OFPMPMETER: return new MultipartRequestMeterStatsBuilder().build();
122             case OFPMPMETERCONFIG: return new org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics
123                     .rev131111.multipart.request.multipart.request.body.MultipartRequestMeterConfigBuilder().build();
124             case OFPMPMETERFEATURES: return new MultipartRequestMeterFeaturesBuilder().build();
125             case OFPMPTABLEFEATURES: return new org.opendaylight.yang.gen.v1.urn.opendaylight.table.types
126                     .rev131026.multipart.request.multipart.request.body.MultipartRequestTableFeaturesBuilder().build();
127             case OFPMPPORTDESC: return new MultipartRequestPortDescBuilder().build();
128             case OFPMPEXPERIMENTER: return new MultipartRequestExperimenterBuilder().build();
129             default:throw new IllegalArgumentException("Unknown MultipartType " + type);
130         }
131     }
132
133     private static MultipartRequestBody makeDefaultMultiLayerBody(final @NonNull MultipartType type,
134                                                                   final Uint8 version) {
135         switch (type) {
136             case OFPMPDESC:
137                 return new MultipartRequestDescCaseBuilder().build();
138             case OFPMPFLOW:
139                 final MultipartRequestFlowCaseBuilder multipartRequestFlowCaseBuilder
140                         = new MultipartRequestFlowCaseBuilder();
141                 MultipartRequestFlowBuilder multipartRequestFlowBuilder = new MultipartRequestFlowBuilder();
142                 multipartRequestFlowBuilder.setTableId(OFConstants.OFPTT_ALL);
143                 multipartRequestFlowBuilder.setOutPort(OFConstants.OFPP_ANY);
144                 multipartRequestFlowBuilder.setOutGroup(OFConstants.OFPG_ANY);
145                 multipartRequestFlowBuilder.setCookie(OFConstants.DEFAULT_COOKIE);
146                 multipartRequestFlowBuilder.setCookieMask(OFConstants.DEFAULT_COOKIE_MASK);
147
148                 if (OFConstants.OFP_VERSION_1_0.equals(version)) {
149                     multipartRequestFlowBuilder.setMatchV10(MatchUtil.createEmptyV10Match().build());
150                 } else if (OFConstants.OFP_VERSION_1_3.equals(version)) {
151                     multipartRequestFlowBuilder.setMatch(new MatchBuilder().setType(OxmMatchType.class).build());
152                 } else {
153                     throw new IllegalArgumentException("Unknown version " + version);
154                 }
155
156                 multipartRequestFlowCaseBuilder.setMultipartRequestFlow(multipartRequestFlowBuilder.build());
157                 return multipartRequestFlowCaseBuilder.build();
158             case OFPMPAGGREGATE:
159                 return new MultipartRequestAggregateCaseBuilder().build();
160             case OFPMPTABLE:
161                 return new MultipartRequestTableCaseBuilder().build();
162             case OFPMPPORTSTATS:
163                 MultipartRequestPortStatsCaseBuilder multipartRequestPortStatsCaseBuilder
164                         = new MultipartRequestPortStatsCaseBuilder();
165                 MultipartRequestPortStatsBuilder multipartRequestPortStatsBuilder
166                         = new MultipartRequestPortStatsBuilder();
167                 multipartRequestPortStatsBuilder.setPortNo(OFConstants.OFPP_ANY);
168                 multipartRequestPortStatsCaseBuilder
169                         .setMultipartRequestPortStats(multipartRequestPortStatsBuilder.build());
170                 return multipartRequestPortStatsCaseBuilder.build();
171             case OFPMPQUEUE:
172                 MultipartRequestQueueCaseBuilder multipartRequestQueueCaseBuilder
173                         = new MultipartRequestQueueCaseBuilder();
174                 MultipartRequestQueueBuilder multipartRequestQueueBuilder = new MultipartRequestQueueBuilder();
175                 multipartRequestQueueBuilder.setPortNo(OFConstants.OFPP_ANY);
176                 multipartRequestQueueBuilder.setQueueId(OFConstants.OFPQ_ALL);
177                 multipartRequestQueueCaseBuilder.setMultipartRequestQueue(multipartRequestQueueBuilder.build());
178                 return multipartRequestQueueCaseBuilder.build();
179             case OFPMPGROUP:
180                 MultipartRequestGroupCaseBuilder multipartRequestGroupCaseBuilder
181                         = new MultipartRequestGroupCaseBuilder();
182                 MultipartRequestGroupBuilder multipartRequestGroupBuilder = new MultipartRequestGroupBuilder();
183                 GroupId groupId = new GroupId(OFConstants.OFPG_ALL);
184                 multipartRequestGroupBuilder.setGroupId(groupId);
185                 multipartRequestGroupCaseBuilder.setMultipartRequestGroup(multipartRequestGroupBuilder.build());
186                 return multipartRequestGroupCaseBuilder.build();
187             case OFPMPGROUPDESC:
188                 return new MultipartRequestGroupDescCaseBuilder().build();
189             case OFPMPGROUPFEATURES:
190                 return new MultipartRequestGroupFeaturesCaseBuilder().build();
191             case OFPMPMETER:
192                 MultipartRequestMeterCaseBuilder multipartRequestMeterCaseBuilder
193                         = new MultipartRequestMeterCaseBuilder();
194                 MultipartRequestMeterBuilder multipartRequestMeterBuilder = new MultipartRequestMeterBuilder();
195                 MeterId meterId = new MeterId(OFConstants.OFPM_ALL);
196                 multipartRequestMeterBuilder.setMeterId(meterId);
197                 multipartRequestMeterCaseBuilder.setMultipartRequestMeter(multipartRequestMeterBuilder.build());
198                 return multipartRequestMeterCaseBuilder.build();
199             case OFPMPMETERCONFIG:
200                 MultipartRequestMeterConfigCaseBuilder multipartRequestMeterConfigCaseBuilder
201                         = new MultipartRequestMeterConfigCaseBuilder();
202                 MultipartRequestMeterConfigBuilder multipartRequestMeterConfigBuilder
203                         = new MultipartRequestMeterConfigBuilder();
204                 MeterId configMeterId = new MeterId(OFConstants.OFPM_ALL);
205                 multipartRequestMeterConfigBuilder.setMeterId(configMeterId);
206                 multipartRequestMeterConfigCaseBuilder
207                         .setMultipartRequestMeterConfig(multipartRequestMeterConfigBuilder.build());
208                 return multipartRequestMeterConfigCaseBuilder.build();
209             case OFPMPMETERFEATURES:
210                 return new MultipartRequestMeterFeaturesCaseBuilder().build();
211             case OFPMPTABLEFEATURES:
212                 MultipartRequestTableFeaturesCaseBuilder tableFeaturesCaseBuilder
213                         = new MultipartRequestTableFeaturesCaseBuilder();
214                 tableFeaturesCaseBuilder.setMultipartRequestTableFeatures(
215                         new MultipartRequestTableFeaturesBuilder().build()
216                 );
217                 return tableFeaturesCaseBuilder.build();
218             case OFPMPPORTDESC:
219                 return new MultipartRequestPortDescCaseBuilder().build();
220             case OFPMPEXPERIMENTER:
221                 return new MultipartRequestExperimenterCaseBuilder().build();
222             default:
223                 throw new IllegalArgumentException("Unknown MultipartType " + type);
224         }
225     }
226 }