2 * Copyright (c) 2016 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.openflow.md.core.sal.convertor.match;
11 import java.util.HashMap;
12 import java.util.List;
14 import java.util.Optional;
15 import org.opendaylight.openflowjava.protocol.api.util.EncodeConstants;
16 import org.opendaylight.openflowplugin.api.OFConstants;
17 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.common.ConvertorKey;
18 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.common.ResultInjector;
19 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.flow.FlowConvertor;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.set.field._case.SetFieldActionBuilder;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entries.grouping.MatchEntry;
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.oxm.rev150225.match.v10.grouping.MatchV10;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.FlowModInputBuilder;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.aggregate._case.MultipartRequestAggregateBuilder;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.flow._case.MultipartRequestFlowBuilder;
28 public class MatchInjector {
29 @SuppressWarnings("unchecked")
30 public static <FROM, TO> void inject(Optional<FROM> source, TO target, short version) {
32 if (source.isPresent()) {
33 sourceResult = source.get();
34 } else if (version == EncodeConstants.OF10_VERSION_ID) {
35 sourceResult = (FROM) MatchV10Convertor.defaultResult();
37 sourceResult = (FROM) MatchConvertor.defaultResult();
40 final Map<ConvertorKey, ResultInjector<?, ?>> injectorMap = new HashMap<>();
41 addInjectors(injectorMap);
43 final ResultInjector<FROM, TO> injection = (ResultInjector<FROM, TO>) injectorMap
44 .get(new ConvertorKey(version, target.getClass()));
46 injection.inject(sourceResult, target);
49 private static void addInjectors(final Map<ConvertorKey, ResultInjector<?, ?>> injectionMapping) {
50 // OF-1.3|List<MatchEntries> --> FlowModInputBuilder
51 injectionMapping.put(new ConvertorKey(OFConstants.OFP_VERSION_1_3, FlowModInputBuilder.class),
52 new ResultInjector<List<MatchEntry>, FlowModInputBuilder>() {
54 public void inject(final List<MatchEntry> value,
55 final FlowModInputBuilder target) {
56 target.setMatch(wrapMatchV13(value).build());
60 // OF-1.3|List<MatchEntries> --> OxmFieldsActionBuilder
61 injectionMapping.put(new ConvertorKey(OFConstants.OFP_VERSION_1_3, SetFieldActionBuilder.class),
62 new ResultInjector<List<MatchEntry>, SetFieldActionBuilder>() {
64 public void inject(final List<MatchEntry> value,
65 final SetFieldActionBuilder target) {
66 target.setMatchEntry(value);
70 // OF-1.0|MatchV10Builder --> FlowModInputBuilder
71 injectionMapping.put(new ConvertorKey(OFConstants.OFP_VERSION_1_0, FlowModInputBuilder.class),
72 new ResultInjector<MatchV10, FlowModInputBuilder>() {
74 public void inject(final MatchV10 value,
75 final FlowModInputBuilder target) {
76 target.setMatchV10(value);
80 // OF-1.3|List<MatchEntries> --> MultipartRequestFlowBuilder
81 injectionMapping.put(new ConvertorKey(OFConstants.OFP_VERSION_1_3, MultipartRequestFlowBuilder.class),
82 new ResultInjector<List<MatchEntry>, MultipartRequestFlowBuilder>() {
84 public void inject(final List<MatchEntry> value,
85 final MultipartRequestFlowBuilder target) {
86 target.setMatch(wrapMatchV13(value).build());
90 // OF-1.0|List<MatchEntries> --> MultipartRequestFlowBuilder
91 injectionMapping.put(new ConvertorKey(OFConstants.OFP_VERSION_1_0, MultipartRequestFlowBuilder.class),
92 new ResultInjector<MatchV10, MultipartRequestFlowBuilder>() {
94 public void inject(final MatchV10 value,
95 final MultipartRequestFlowBuilder target) {
96 target.setMatchV10(value);
100 // OF-1.3|List<MatchEntries> --> MultipartRequestAggregateBuilder
101 injectionMapping.put(new ConvertorKey(OFConstants.OFP_VERSION_1_3, MultipartRequestAggregateBuilder.class),
102 new ResultInjector<List<MatchEntry>, MultipartRequestAggregateBuilder>() {
104 public void inject(final List<MatchEntry> value,
105 final MultipartRequestAggregateBuilder target) {
106 target.setMatch(wrapMatchV13(value).build());
110 // OF-1.0|List<MatchEntries> --> MultipartRequestAggregateBuilder
111 injectionMapping.put(new ConvertorKey(OFConstants.OFP_VERSION_1_0, MultipartRequestAggregateBuilder.class),
112 new ResultInjector<MatchV10, MultipartRequestAggregateBuilder>() {
114 public void inject(final MatchV10 value,
115 final MultipartRequestAggregateBuilder target) {
116 target.setMatchV10(value);
121 private static MatchBuilder wrapMatchV13(final List<MatchEntry> value) {
122 MatchBuilder matchBuilder = new MatchBuilder();
123 matchBuilder.setType(FlowConvertor.DEFAULT_MATCH_TYPE);
125 matchBuilder.setMatchEntry(FlowConvertor.DEFAULT_MATCH_ENTRIES);
127 matchBuilder.setMatchEntry(value);