/* * Copyright (c) 2016 Cisco Systems, Inc. and others. All rights reserved. * * This program and the accompanying materials are made available under the * terms of the Eclipse Public License v1.0 which accompanies this distribution, * and is available at http://www.eclipse.org/legal/epl-v10.html */ package org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Optional; import org.opendaylight.openflowplugin.api.OFConstants; import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.common.ConvertorKey; import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.common.ResultInjector; import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.flow.FlowConvertor; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.set.field._case.SetFieldActionBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entries.grouping.MatchEntry; 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.MatchV10; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.FlowModInputBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.aggregate._case.MultipartRequestAggregateBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.flow._case.MultipartRequestFlowBuilder; import org.opendaylight.yangtools.yang.common.Uint8; public final class MatchInjector { private MatchInjector() { } @SuppressWarnings("unchecked") public static void inject(final Optional source, final T target, final Uint8 version) { F sourceResult; if (source.isPresent()) { sourceResult = source.orElseThrow(); } else if (OFConstants.OFP_VERSION_1_0.equals(version)) { sourceResult = (F) MatchV10Convertor.defaultResult(); } else { sourceResult = (F) MatchConvertor.defaultResult(); } final Map> injectorMap = new HashMap<>(); addInjectors(injectorMap); final ResultInjector injection = (ResultInjector) injectorMap .get(new ConvertorKey(version, target.getClass())); injection.inject(sourceResult, target); } private static void addInjectors(final Map> injectionMapping) { // OF-1.3|List --> FlowModInputBuilder injectionMapping.put(new ConvertorKey(OFConstants.OFP_VERSION_1_3, FlowModInputBuilder.class), (ResultInjector, FlowModInputBuilder>)(value, target) -> target.setMatch(wrapMatchV13(value).build())); // OF-1.3|List --> OxmFieldsActionBuilder injectionMapping.put(new ConvertorKey(OFConstants.OFP_VERSION_1_3, SetFieldActionBuilder.class), (ResultInjector, SetFieldActionBuilder>)(value, target) -> target.setMatchEntry(value)); // OF-1.0|MatchV10Builder --> FlowModInputBuilder injectionMapping.put(new ConvertorKey(OFConstants.OFP_VERSION_1_0, FlowModInputBuilder.class), (ResultInjector)(value, target) -> target.setMatchV10(value)); // OF-1.3|List --> MultipartRequestFlowBuilder injectionMapping.put(new ConvertorKey(OFConstants.OFP_VERSION_1_3, MultipartRequestFlowBuilder.class), (ResultInjector, MultipartRequestFlowBuilder>)(value, target) -> target.setMatch(wrapMatchV13(value).build())); // OF-1.0|List --> MultipartRequestFlowBuilder injectionMapping.put(new ConvertorKey(OFConstants.OFP_VERSION_1_0, MultipartRequestFlowBuilder.class), (ResultInjector)(value, target) -> target.setMatchV10(value)); // OF-1.3|List --> MultipartRequestAggregateBuilder injectionMapping.put(new ConvertorKey(OFConstants.OFP_VERSION_1_3, MultipartRequestAggregateBuilder.class), (ResultInjector, MultipartRequestAggregateBuilder>)(value, target) -> target.setMatch(wrapMatchV13(value).build())); // OF-1.0|List --> MultipartRequestAggregateBuilder injectionMapping.put(new ConvertorKey(OFConstants.OFP_VERSION_1_0, MultipartRequestAggregateBuilder.class), (ResultInjector)(value, target) -> target.setMatchV10(value)); } private static MatchBuilder wrapMatchV13(final List value) { MatchBuilder matchBuilder = new MatchBuilder(); matchBuilder.setType(FlowConvertor.DEFAULT_MATCH_TYPE); if (value == null) { matchBuilder.setMatchEntry(FlowConvertor.DEFAULT_MATCH_ENTRIES); } else { matchBuilder.setMatchEntry(value); } return matchBuilder; } }