Merge "Bug 3328: Set icmpv4-match into OF10 match."
[openflowplugin.git] / openflowplugin-impl / src / main / java / org / opendaylight / openflowplugin / impl / common / MultipartRequestInputFactory.java
index 5b166866c417705fcba8e067c12fc011d5c8e631..4db037f0d6264f4a121af2bfef4e5a7203b82808 100644 (file)
@@ -9,10 +9,18 @@
 package org.opendaylight.openflowplugin.impl.common;
 
 import com.google.common.base.Preconditions;
+import java.math.BigInteger;
 import javax.annotation.CheckForNull;
 import javax.annotation.Nonnull;
+import org.opendaylight.openflowplugin.api.OFConstants;
+import org.opendaylight.openflowplugin.impl.util.MatchUtil;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.GroupId;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MeterId;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MultipartRequestFlags;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MultipartType;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.OxmMatchType;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.grouping.MatchBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.v10.grouping.MatchV10Builder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MultipartRequestInput;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MultipartRequestInputBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.MultipartRequestBody;
@@ -46,23 +54,30 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestTableCaseBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestTableFeaturesCase;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestTableFeaturesCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.flow._case.MultipartRequestFlowBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.group._case.MultipartRequestGroupBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.meter._case.MultipartRequestMeterBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.meter.config._case.MultipartRequestMeterConfigBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.port.stats._case.MultipartRequestPortStatsBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.queue._case.MultipartRequestQueueBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.table.features._case.MultipartRequestTableFeaturesBuilder;
 
 /**
  * openflowplugin-impl
  * org.opendaylight.openflowplugin.impl.common
- *
+ * <p>
  * Factory class is designed for easy producing a MultipartRequestInput. Class should help
  * to understand a relationship between {@link MultipartType} and {@link MultipartRequestInput}
  * without touch OF specification 1.3.2  - a section 7.3.5. Multipart Messages
- * {@see https://www.opennetworking.org/images/stories/downloads/sdn-resources/onf-specifications/openflow/openflow-spec-v1.3.2.pdf}
+ * see also <a href="https://www.opennetworking.org/images/stories/downloads/sdn-resources/onf-specifications/openflow/openflow-spec-v1.3.2.pdf">OpenFlow 1.3.2</a>
  *
  * @author <a href="mailto:vdemcak@cisco.com">Vaclav Demcak</a>
- *
- * Created: Mar 27, 2015
+ *         <p>
+ *         Created: Mar 27, 2015
  */
 public final class MultipartRequestInputFactory {
 
-    private MultipartRequestInputFactory () {
+    private MultipartRequestInputFactory() {
         throw new UnsupportedOperationException("Factory class");
     }
 
@@ -77,57 +92,11 @@ public final class MultipartRequestInputFactory {
      * @return
      */
     public static MultipartRequestInput makeMultipartRequestInput(final long xid, final short ofVersion,
-            @Nonnull final MultipartType type) {
-        return maker(xid, type, ofVersion, false, makeDefaultEmptyRequestBody(type));
+                                                                  @Nonnull final MultipartType type) {
+        return maker(xid, type, ofVersion, false, makeDefaultEmptyRequestBody(type, ofVersion));
     }
 
-    /**
-     * Method validate input values and makes {@link MultipartRequestInput} from input values. Method set
-     * a moreRequest marker to false.
-     *
-     * @param xid
-     * @param type
-     * @param ofVersion
-     * @param body
-     * @return
-     */
-    public static MultipartRequestInput makeMultipartRequestInput(final long xid, final short ofVersion,
-            @Nonnull final MultipartType type, @Nonnull final MultipartRequestBody body) {
-        Preconditions.checkArgument(validationOfMultipartTypeAndRequestBody(type, body));
-        return maker(xid, type, ofVersion, false, body);
-    }
-
-    /**
-     * Method validates input and makes {@link MultipartRequestInput} from input values. Method creates
-     * default empty {@link MultipartRequestBody} by {@link MultipartType}
-     *
-     * @param xid
-     * @param type
-     * @param ofVersion
-     * @param moreRequests
-     * @return
-     */
-    public static MultipartRequestInput makeMultipartRequestInput(final long xid, final short ofVersion,
-            @Nonnull final MultipartType type, final boolean moreRequests) {
-        return maker(xid, type, ofVersion, moreRequests, makeDefaultEmptyRequestBody(type));
-    }
 
-    /**
-     * Method validates input values and makes {@link MultipartRequestInput} from input values.
-     *
-     * @param xid
-     * @param type
-     * @param ofVersion
-     * @param moreRequests
-     * @param body
-     * @return
-     */
-    public static MultipartRequestInput makeMultipartRequestInput(final long xid, final short ofVersion,
-            @Nonnull final MultipartType type, final boolean moreRequests,
-            @Nonnull final MultipartRequestBody body) {
-        Preconditions.checkArgument(validationOfMultipartTypeAndRequestBody(type, body));
-        return maker(xid, type, ofVersion, moreRequests, body);
-    }
 
     /**
      * Method build {@link MultipartRequestInput} from input values. It is private because we would like
@@ -141,7 +110,7 @@ public final class MultipartRequestInputFactory {
      * @return
      */
     private static MultipartRequestInput maker(final long xid, final MultipartType type,
-            final short ofVersion, final boolean moreRequests, final MultipartRequestBody body) {
+                                               final short ofVersion, final boolean moreRequests, final MultipartRequestBody body) {
         final MultipartRequestInputBuilder builder = new MultipartRequestInputBuilder();
         builder.setFlags(new MultipartRequestFlags(moreRequests));
         builder.setMultipartRequestBody(body);
@@ -151,81 +120,124 @@ public final class MultipartRequestInputFactory {
         return builder.build();
     }
 
-    private static MultipartRequestBody makeDefaultEmptyRequestBody(@CheckForNull final MultipartType type) {
+    private static MultipartRequestBody makeDefaultEmptyRequestBody(@CheckForNull final MultipartType type, @CheckForNull final short version) {
         Preconditions.checkArgument(type != null, "Multipart Request can not by build without type!");
         switch (type) {
-        case OFPMPDESC:
-            return new MultipartRequestDescCaseBuilder().build();
-        case OFPMPFLOW:
-            return new MultipartRequestFlowCaseBuilder().build();
-        case OFPMPAGGREGATE:
-            return new MultipartRequestAggregateCaseBuilder().build();
-        case OFPMPTABLE:
-            return new MultipartRequestTableCaseBuilder().build();
-        case OFPMPPORTSTATS:
-            return new MultipartRequestPortStatsCaseBuilder().build();
-        case OFPMPQUEUE:
-            return new MultipartRequestQueueCaseBuilder().build();
-        case OFPMPGROUP:
-            return new MultipartRequestGroupCaseBuilder().build();
-        case OFPMPGROUPDESC:
-            return new MultipartRequestGroupDescCaseBuilder().build();
-        case OFPMPGROUPFEATURES:
-            return new MultipartRequestGroupFeaturesCaseBuilder().build();
-        case OFPMPMETER:
-            return new MultipartRequestMeterCaseBuilder().build();
-        case OFPMPMETERCONFIG:
-            return new MultipartRequestMeterConfigCaseBuilder().build();
-        case OFPMPMETERFEATURES:
-            return new MultipartRequestMeterFeaturesCaseBuilder().build();
-        case OFPMPTABLEFEATURES:
-            return new MultipartRequestTableFeaturesCaseBuilder().build();
-        case OFPMPPORTDESC:
-            return new MultipartRequestPortDescCaseBuilder().build();
-        case OFPMPEXPERIMENTER:
-            return new MultipartRequestExperimenterCaseBuilder().build();
-        default:
-            throw new IllegalArgumentException("Unknown MultipartType " + type);
+            case OFPMPDESC:
+                return new MultipartRequestDescCaseBuilder().build();
+            case OFPMPFLOW:
+                MultipartRequestFlowCaseBuilder multipartRequestFlowCaseBuilder = new MultipartRequestFlowCaseBuilder();
+                MultipartRequestFlowBuilder multipartRequestFlowBuilder = new MultipartRequestFlowBuilder();
+                multipartRequestFlowBuilder.setTableId(OFConstants.OFPTT_ALL);
+                multipartRequestFlowBuilder.setOutPort(OFConstants.OFPP_ANY);
+                multipartRequestFlowBuilder.setOutGroup(OFConstants.OFPG_ANY);
+                multipartRequestFlowBuilder.setCookie(BigInteger.ZERO);
+                multipartRequestFlowBuilder.setCookieMask(BigInteger.ZERO);
+                switch (version) {
+                    case OFConstants.OFP_VERSION_1_0:
+                        MatchV10Builder matchV10Builder = MatchUtil.createEmptyV10Match();
+                        multipartRequestFlowBuilder.setMatchV10(matchV10Builder.build());
+                        break;
+                    case OFConstants.OFP_VERSION_1_3:
+                        multipartRequestFlowBuilder.setMatch(new MatchBuilder().setType(OxmMatchType.class).build());
+                        break;
+                }
+                multipartRequestFlowCaseBuilder.setMultipartRequestFlow(multipartRequestFlowBuilder.build());
+                return multipartRequestFlowCaseBuilder.build();
+            case OFPMPAGGREGATE:
+                return new MultipartRequestAggregateCaseBuilder().build();
+            case OFPMPTABLE:
+                return new MultipartRequestTableCaseBuilder().build();
+            case OFPMPPORTSTATS:
+                MultipartRequestPortStatsCaseBuilder multipartRequestPortStatsCaseBuilder = new MultipartRequestPortStatsCaseBuilder();
+                MultipartRequestPortStatsBuilder multipartRequestPortStatsBuilder = new MultipartRequestPortStatsBuilder();
+                multipartRequestPortStatsBuilder.setPortNo(OFConstants.OFPP_ANY);
+                multipartRequestPortStatsCaseBuilder.setMultipartRequestPortStats(multipartRequestPortStatsBuilder.build());
+                return multipartRequestPortStatsCaseBuilder.build();
+            case OFPMPQUEUE:
+                MultipartRequestQueueCaseBuilder multipartRequestQueueCaseBuilder = new MultipartRequestQueueCaseBuilder();
+                MultipartRequestQueueBuilder multipartRequestQueueBuilder = new MultipartRequestQueueBuilder();
+                multipartRequestQueueBuilder.setPortNo(OFConstants.OFPP_ANY);
+                multipartRequestQueueBuilder.setQueueId(OFConstants.OFPQ_ALL);
+                multipartRequestQueueCaseBuilder.setMultipartRequestQueue(multipartRequestQueueBuilder.build());
+                return multipartRequestQueueCaseBuilder.build();
+            case OFPMPGROUP:
+                MultipartRequestGroupCaseBuilder multipartRequestGroupCaseBuilder = new MultipartRequestGroupCaseBuilder();
+                MultipartRequestGroupBuilder multipartRequestGroupBuilder = new MultipartRequestGroupBuilder();
+                GroupId groupId = new GroupId(OFConstants.OFPG_ALL);
+                multipartRequestGroupBuilder.setGroupId(groupId);
+                multipartRequestGroupCaseBuilder.setMultipartRequestGroup(multipartRequestGroupBuilder.build());
+                return multipartRequestGroupCaseBuilder.build();
+            case OFPMPGROUPDESC:
+                return new MultipartRequestGroupDescCaseBuilder().build();
+            case OFPMPGROUPFEATURES:
+                return new MultipartRequestGroupFeaturesCaseBuilder().build();
+            case OFPMPMETER:
+                MultipartRequestMeterCaseBuilder multipartRequestMeterCaseBuilder = new MultipartRequestMeterCaseBuilder();
+                MultipartRequestMeterBuilder multipartRequestMeterBuilder = new MultipartRequestMeterBuilder();
+                MeterId meterId = new MeterId(OFConstants.OFPP_ANY);
+                multipartRequestMeterBuilder.setMeterId(meterId);
+                multipartRequestMeterCaseBuilder.setMultipartRequestMeter(multipartRequestMeterBuilder.build());
+                return multipartRequestMeterCaseBuilder.build();
+            case OFPMPMETERCONFIG:
+                MultipartRequestMeterConfigCaseBuilder multipartRequestMeterConfigCaseBuilder = new MultipartRequestMeterConfigCaseBuilder();
+                MultipartRequestMeterConfigBuilder multipartRequestMeterConfigBuilder = new MultipartRequestMeterConfigBuilder();
+                MeterId configMeterId = new MeterId(OFConstants.OFPP_ANY);
+                multipartRequestMeterConfigBuilder.setMeterId(configMeterId);
+                multipartRequestMeterConfigCaseBuilder.setMultipartRequestMeterConfig(multipartRequestMeterConfigBuilder.build());
+                return multipartRequestMeterConfigCaseBuilder.build();
+            case OFPMPMETERFEATURES:
+                return new MultipartRequestMeterFeaturesCaseBuilder().build();
+            case OFPMPTABLEFEATURES:
+                MultipartRequestTableFeaturesCaseBuilder tableFeaturesCaseBuilder = new MultipartRequestTableFeaturesCaseBuilder();
+                tableFeaturesCaseBuilder.setMultipartRequestTableFeatures(new MultipartRequestTableFeaturesBuilder().build());
+                return tableFeaturesCaseBuilder.build();
+            case OFPMPPORTDESC:
+                return new MultipartRequestPortDescCaseBuilder().build();
+            case OFPMPEXPERIMENTER:
+                return new MultipartRequestExperimenterCaseBuilder().build();
+            default:
+                throw new IllegalArgumentException("Unknown MultipartType " + type);
         }
     }
 
     private static boolean validationOfMultipartTypeAndRequestBody(@CheckForNull final MultipartType type,
-            @CheckForNull final MultipartRequestBody body) {
+                                                                   @CheckForNull final MultipartRequestBody body) {
         Preconditions.checkArgument(type != null, "Multipart Request can not by build without type!");
         Preconditions.checkArgument(body != null, "Multipart Request can not by build without body!");
         switch (type) {
-        case OFPMPDESC:
-            return body instanceof MultipartRequestDescCase;
-        case OFPMPFLOW:
-            return body instanceof MultipartRequestFlowCase;
-        case OFPMPAGGREGATE:
-            return body instanceof MultipartRequestAggregateCase;
-        case OFPMPTABLE:
-            return body instanceof MultipartRequestTableCase;
-        case OFPMPPORTSTATS:
-            return body instanceof MultipartRequestPortStatsCase;
-        case OFPMPQUEUE:
-            return body instanceof MultipartRequestQueueCase;
-        case OFPMPGROUP:
-            return body instanceof MultipartRequestGroupCase;
-        case OFPMPGROUPDESC:
-            return body instanceof MultipartRequestGroupDescCase;
-        case OFPMPGROUPFEATURES:
-            return body instanceof MultipartRequestGroupFeaturesCase;
-        case OFPMPMETER:
-            return body instanceof MultipartRequestMeterCase;
-        case OFPMPMETERCONFIG:
-            return body instanceof MultipartRequestMeterConfigCase;
-        case OFPMPMETERFEATURES:
-            return body instanceof MultipartRequestMeterFeaturesCase;
-        case OFPMPTABLEFEATURES:
-            return body instanceof MultipartRequestTableFeaturesCase;
-        case OFPMPPORTDESC:
-            return body instanceof MultipartRequestPortDescCase;
-        case OFPMPEXPERIMENTER:
-            return body instanceof MultipartRequestExperimenterCase;
-        default:
-            throw new IllegalArgumentException("Unknown MultipartType " + type);
+            case OFPMPDESC:
+                return body instanceof MultipartRequestDescCase;
+            case OFPMPFLOW:
+                return body instanceof MultipartRequestFlowCase;
+            case OFPMPAGGREGATE:
+                return body instanceof MultipartRequestAggregateCase;
+            case OFPMPTABLE:
+                return body instanceof MultipartRequestTableCase;
+            case OFPMPPORTSTATS:
+                return body instanceof MultipartRequestPortStatsCase;
+            case OFPMPQUEUE:
+                return body instanceof MultipartRequestQueueCase;
+            case OFPMPGROUP:
+                return body instanceof MultipartRequestGroupCase;
+            case OFPMPGROUPDESC:
+                return body instanceof MultipartRequestGroupDescCase;
+            case OFPMPGROUPFEATURES:
+                return body instanceof MultipartRequestGroupFeaturesCase;
+            case OFPMPMETER:
+                return body instanceof MultipartRequestMeterCase;
+            case OFPMPMETERCONFIG:
+                return body instanceof MultipartRequestMeterConfigCase;
+            case OFPMPMETERFEATURES:
+                return body instanceof MultipartRequestMeterFeaturesCase;
+            case OFPMPTABLEFEATURES:
+                return body instanceof MultipartRequestTableFeaturesCase;
+            case OFPMPPORTDESC:
+                return body instanceof MultipartRequestPortDescCase;
+            case OFPMPEXPERIMENTER:
+                return body instanceof MultipartRequestExperimenterCase;
+            default:
+                throw new IllegalArgumentException("Unknown MultipartType " + type);
         }
     }
 }