--- /dev/null
+package org.opendaylight.controller.sal.compability;
+
+import com.google.common.net.InetAddresses
+import java.math.BigInteger
+import java.net.Inet4Address
+import java.net.Inet6Address
+import java.util.ArrayList
+import java.util.List
+import org.opendaylight.controller.sal.action.Controller
+import org.opendaylight.controller.sal.action.Drop
+import org.opendaylight.controller.sal.action.Flood
+import org.opendaylight.controller.sal.action.FloodAll
+import org.opendaylight.controller.sal.action.HwPath
+import org.opendaylight.controller.sal.action.Loopback
+import org.opendaylight.controller.sal.action.Output
+import org.opendaylight.controller.sal.action.PopVlan
+import org.opendaylight.controller.sal.action.PushVlan
+import org.opendaylight.controller.sal.action.SetDlDst
+import org.opendaylight.controller.sal.action.SetDlSrc
+import org.opendaylight.controller.sal.action.SetDlType
+import org.opendaylight.controller.sal.action.SetNextHop
+import org.opendaylight.controller.sal.action.SetNwDst
+import org.opendaylight.controller.sal.action.SetNwSrc
+import org.opendaylight.controller.sal.action.SetNwTos
+import org.opendaylight.controller.sal.action.SetTpDst
+import org.opendaylight.controller.sal.action.SetTpSrc
+import org.opendaylight.controller.sal.action.SetVlanCfi
+import org.opendaylight.controller.sal.action.SetVlanId
+import org.opendaylight.controller.sal.action.SetVlanPcp
+import org.opendaylight.controller.sal.action.SwPath
+import org.opendaylight.controller.sal.core.Node
+import org.opendaylight.controller.sal.core.NodeConnector
+import org.opendaylight.controller.sal.flowprogrammer.Flow
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Prefix
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv6Prefix
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.PortNumber
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Uri
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev100924.MacAddress
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.AddFlowInputBuilder
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.FlowAddedBuilder
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.RemoveFlowInputBuilder
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.UpdateFlowInputBuilder
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.GetFlowStatisticsInputBuilder
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev130819.VlanCfi
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev130819.action.action.ControllerActionBuilder
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev130819.action.action.DropActionBuilder
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev130819.action.action.FloodActionBuilder
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev130819.action.action.FloodAllActionBuilder
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev130819.action.action.HwPathActionBuilder
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev130819.action.action.LoopbackActionBuilder
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev130819.action.action.OutputActionBuilder
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev130819.action.action.PopVlanActionBuilder
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev130819.action.action.PushVlanActionBuilder
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev130819.action.action.SetDlDstActionBuilder
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev130819.action.action.SetDlSrcActionBuilder
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev130819.action.action.SetDlTypeActionBuilder
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev130819.action.action.SetNextHopActionBuilder
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev130819.action.action.SetNwDstActionBuilder
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev130819.action.action.SetNwSrcActionBuilder
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev130819.action.action.SetNwTosActionBuilder
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev130819.action.action.SetTpDstActionBuilder
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev130819.action.action.SetTpSrcActionBuilder
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev130819.action.action.SetVlanCfiActionBuilder
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev130819.action.action.SetVlanIdActionBuilder
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev130819.action.action.SetVlanPcpActionBuilder
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev130819.action.action.SwPathActionBuilder
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev130819.address.Address
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev130819.address.address.Ipv4Builder
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev130819.address.address.Ipv6Builder
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev130819.flow.Action
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev130819.flow.ActionBuilder
+import org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.EtherType
+import org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.VlanId
+import org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.VlanPcp
+
+import static extension org.opendaylight.controller.sal.compability.FromSalConversionsUtils.*
+import static extension org.opendaylight.controller.sal.compability.NodeMapping.*
+
+public class MDFlowMapping {
+
+ private new() {
+ throw new UnsupportedOperationException()
+ }
+
+ public static def flowAdded(Flow sourceFlow) {
+ if (sourceFlow == null)
+ throw new IllegalArgumentException();
+ val it = new FlowAddedBuilder();
+
+ hardTimeout = sourceFlow.hardTimeout as int
+ idleTimeout = sourceFlow.idleTimeout as int
+ cookie = BigInteger.valueOf(sourceFlow.id)
+ priority = sourceFlow.priority as int
+
+ val sourceActions = sourceFlow.actions;
+ val targetActions = new ArrayList<Action>();
+ for (sourceAction : sourceActions) {
+ targetActions.add(sourceAction.toAction());
+ }
+ action = targetActions;
+ match = sourceFlow.match.toMatch();
+ return it.build();
+
+ }
+
+ public static def flowStatisticsInput(Node sourceNode, Flow sourceFlow) {
+ val it = new GetFlowStatisticsInputBuilder();
+ val source = flowAdded(sourceFlow);
+ cookie = (source.getCookie());
+ action = (source.getAction());
+ action = (source.getAction());
+ cookie = (source.getCookie());
+ hardTimeout = (source.getHardTimeout());
+ match = (source.getMatch());
+ priority = (source.getPriority());
+ node = sourceNode.toNodeRef();
+ return it.build();
+ }
+
+ public static def removeFlowInput(Node sourceNode, Flow sourceFlow) {
+ val it = new RemoveFlowInputBuilder();
+ val source = flowAdded(sourceFlow);
+ action = (source.getAction());
+ cookie = (source.getCookie());
+ action = (source.getAction());
+ cookie = (source.getCookie());
+ hardTimeout = (source.getHardTimeout());
+ match = (source.getMatch());
+ priority = (source.getPriority());
+ node = sourceNode.toNodeRef();
+ return it.build();
+ }
+
+ public static def addFlowInput(Node sourceNode, Flow sourceFlow) {
+ val it = new AddFlowInputBuilder();
+ val source = flowAdded(sourceFlow);
+ action = (source.getAction());
+ cookie = (source.getCookie());
+ action = (source.getAction());
+ cookie = (source.getCookie());
+ hardTimeout = (source.getHardTimeout());
+ match = (source.getMatch());
+ priority = (source.getPriority());
+ node = sourceNode.toNodeRef()
+ return it.build();
+ }
+
+ public static def updateFlowInput(Node sourceNode, Flow oldFlow, Flow newFlow) {
+ val it = new UpdateFlowInputBuilder();
+ val source = flowAdded(newFlow);
+ action = (source.getAction());
+ cookie = (source.getCookie());
+ action = (source.getAction());
+ cookie = (source.getCookie());
+ hardTimeout = (source.getHardTimeout());
+ match = (source.getMatch());
+ priority = (source.getPriority());
+ node = sourceNode.toNodeRef()
+ return it.build();
+ }
+
+ public static dispatch def toAction(Controller sourceAction) {
+ val actionBuilder = new ActionBuilder();
+ actionBuilder.action = new ControllerActionBuilder().build();
+ return actionBuilder.build();
+ }
+
+ public static dispatch def toAction(Drop sourceAction) {
+ val actionBuilder = new ActionBuilder();
+ actionBuilder.action = new DropActionBuilder().build();
+ return actionBuilder.build();
+ }
+
+ public static dispatch def toAction(Flood sourceAction) {
+ val actionBuilder = new ActionBuilder();
+ actionBuilder.action = new FloodActionBuilder().build();
+ return actionBuilder.build();
+ }
+
+ public static dispatch def toAction(FloodAll sourceAction) {
+ val actionBuilder = new ActionBuilder();
+ actionBuilder.action = new FloodAllActionBuilder().build();
+ return actionBuilder.build();
+ }
+
+ public static dispatch def toAction(HwPath sourceAction) {
+ val actionBuilder = new ActionBuilder();
+ actionBuilder.action = new HwPathActionBuilder().build();
+ return actionBuilder.build();
+ }
+
+ public static dispatch def toAction(Loopback sourceAction) {
+ val actionBuilder = new ActionBuilder();
+ actionBuilder.action = new LoopbackActionBuilder().build();
+ return actionBuilder.build();
+ }
+
+ public static dispatch def toAction(Output sourceAction) {
+ val actionBuilder = new ActionBuilder();
+ val it = new OutputActionBuilder();
+ outputNodeConnector = sourceAction.port.toUriList;
+ actionBuilder.action = it.build();
+ return actionBuilder.build();
+
+ }
+
+
+
+ public static dispatch def toAction(PopVlan sourceAction) {
+ val actionBuilder = new ActionBuilder();
+ actionBuilder.action = new PopVlanActionBuilder().build();
+ return actionBuilder.build();
+ }
+
+ public static dispatch def toAction(PushVlan sourceAction) {
+ val actionBuilder = new ActionBuilder();
+ val it = new PushVlanActionBuilder();
+ cfi = new VlanCfi(sourceAction.cfi);
+ vlanId = new VlanId(sourceAction.vlanId);
+ pcp = sourceAction.pcp;
+ tag = sourceAction.tag;
+ actionBuilder.action = it.build();
+ return actionBuilder.build();
+ }
+
+ public static dispatch def toAction(SetDlDst sourceAction) {
+ val actionBuilder = new ActionBuilder();
+ val it = new SetDlDstActionBuilder();
+ address = sourceAction.dlAddress.toMacAddress();
+ actionBuilder.action = it.build();
+ return actionBuilder.build();
+ }
+
+ public static dispatch def toAction(SetDlSrc sourceAction) {
+ val actionBuilder = new ActionBuilder();
+ val it = new SetDlSrcActionBuilder();
+ address = sourceAction.dlAddress.toMacAddress;
+ actionBuilder.action = it.build();
+ return actionBuilder.build();
+ }
+
+ public static dispatch def toAction(SetDlType sourceAction) {
+ val actionBuilder = new ActionBuilder();
+ val it = new SetDlTypeActionBuilder();
+ dlType = new EtherType(sourceAction.dlType as long);
+ actionBuilder.action = it.build();
+ return actionBuilder.build();
+ }
+
+ public static dispatch def toAction(SetNextHop sourceAction) {
+ val actionBuilder = new ActionBuilder();
+ val it = new SetNextHopActionBuilder();
+ val inetAddress = sourceAction.address;
+ address = inetAddress.toInetAddress;
+ actionBuilder.action = it.build();
+ return actionBuilder.build();
+ }
+
+ public static dispatch def toAction(SetNwDst sourceAction) {
+ val actionBuilder = new ActionBuilder();
+ val it = new SetNwDstActionBuilder();
+ val inetAddress = sourceAction.address;
+ address = inetAddress.toInetAddress;
+ actionBuilder.action = it.build();
+ return actionBuilder.build();
+ }
+
+ public static dispatch def toAction(SetNwSrc sourceAction) {
+ val actionBuilder = new ActionBuilder();
+ val it = new SetNwSrcActionBuilder();
+ val inetAddress = sourceAction.address;
+ address = inetAddress.toInetAddress;
+ actionBuilder.action = it.build();
+ return actionBuilder.build();
+ }
+
+ public static dispatch def toAction(SetNwTos sourceAction) {
+ val actionBuilder = new ActionBuilder();
+ val it = new SetNwTosActionBuilder();
+ tos = sourceAction.nwTos;
+ actionBuilder.action = it.build();
+ return actionBuilder.build();
+ }
+
+ public static dispatch def toAction(SetTpDst sourceAction) {
+ val actionBuilder = new ActionBuilder();
+ val it = new SetTpDstActionBuilder();
+ port = new PortNumber(sourceAction.port);
+ actionBuilder.action = it.build();
+ return actionBuilder.build();
+ }
+
+ public static dispatch def toAction(SetTpSrc sourceAction) {
+ val actionBuilder = new ActionBuilder();
+ val it = new SetTpSrcActionBuilder();
+ port = new PortNumber(sourceAction.port);
+ actionBuilder.action = it.build();
+ return actionBuilder.build();
+ }
+
+ public static dispatch def toAction(SetVlanCfi sourceAction) {
+ val actionBuilder = new ActionBuilder();
+ val it = new SetVlanCfiActionBuilder();
+ vlanCfi = new VlanCfi(sourceAction.cfi);
+ actionBuilder.action = it.build();
+ return actionBuilder.build();
+ }
+
+ public static dispatch def toAction(SetVlanId sourceAction) {
+ val actionBuilder = new ActionBuilder();
+
+ val it = new SetVlanIdActionBuilder();
+ vlanId = new VlanId(sourceAction.vlanId);
+ actionBuilder.action = it.build();
+ return actionBuilder.build();
+ }
+
+ public static dispatch def toAction(SetVlanPcp sourceAction) {
+ val actionBuilder = new ActionBuilder();
+ val it = new SetVlanPcpActionBuilder();
+ vlanPcp = new VlanPcp(sourceAction.pcp as short);
+ actionBuilder.action = it.build();
+ return actionBuilder.build();
+ }
+
+ public static dispatch def toAction(SwPath sourceAction) {
+ val actionBuilder = new ActionBuilder();
+ actionBuilder.action = new SwPathActionBuilder().build();
+ return actionBuilder.build();
+ }
+
+ public static def dispatch Address toInetAddress(Inet4Address address) {
+ val it = new Ipv4Builder
+ ipv4Address = new Ipv4Prefix(InetAddresses.toAddrString(address))
+ return it.build()
+ }
+
+ public static def dispatch Address toInetAddress(Inet6Address address) {
+ val it = new Ipv6Builder
+ ipv6Address = new Ipv6Prefix(InetAddresses.toAddrString(address))
+ return it.build()
+ }
+
+ public static def List<Uri> toUriList(NodeConnector connector) {
+ throw new UnsupportedOperationException("TODO: auto-generated method stub")
+ }
+
+ public static def MacAddress toMacAddress(byte[] bytes) {
+ val sb = new StringBuilder(18);
+ for (byte b : bytes) {
+ if (sb.length() > 0)
+ sb.append(':');
+ sb.append(String.format("%02x", b));
+ }
+ return new MacAddress(sb.toString());
+ }
+}