febf50e48f8994f5ba4e65f1b2fc0f64c251695f
[openflowplugin.git] / openflowplugin / src / main / java / org / opendaylight / openflowplugin / openflow / md / core / MessageFactory.java
1 /**
2  * Copyright (c) 2013 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.openflow.md.core;
9
10 import java.util.ArrayList;
11 import java.util.Collections;
12 import java.util.List;
13
14 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.HelloElementType;
15 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.BarrierInput;
16 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.BarrierInputBuilder;
17 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.HelloInput;
18 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.HelloInputBuilder;
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.hello.Elements;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.hello.ElementsBuilder;
21
22 /**
23  * @author mirehak
24  *
25  */
26 public abstract class MessageFactory {
27
28     /**
29      * @param helloVersion
30      * @param helloXid
31      * @return HelloInput without elements
32      */
33     public static HelloInput createHelloInput(short helloVersion, long helloXid) {
34         return createHelloInput(helloVersion, helloXid, null);
35     }
36
37     /**
38      * @param highestVersion
39      * @param xid
40      * @return builder with prepared header
41      */
42     private static HelloInputBuilder prepareHelloInputBuilder(
43             short highestVersion, long xid) {
44         HelloInputBuilder helloInputbuilder = new HelloInputBuilder();
45         helloInputbuilder.setVersion(highestVersion);
46         helloInputbuilder.setXid(xid);
47         return helloInputbuilder;
48     }
49     
50     /**
51      * @param helloVersion
52      * @param helloXid
53      * @param versionOrder
54      * @return HelloInput with elements (version bitmap)
55      */
56     public static HelloInput createHelloInput(short helloVersion, long helloXid, List<Short> versionOrder) {
57         HelloInputBuilder helloInputbuilder = prepareHelloInputBuilder(helloVersion, helloXid);
58         if (versionOrder != null) {
59             
60             ElementsBuilder elementsBuilder = new ElementsBuilder();
61             elementsBuilder.setType(HelloElementType.VERSIONBITMAP);
62             int resultVersionListSize = 0;
63             if (!versionOrder.isEmpty()) {
64                 resultVersionListSize = versionOrder.get(0) + 1;
65             }
66             List<Boolean> booleanList = new ArrayList<>(resultVersionListSize);
67             
68             int versionOrderIndex = versionOrder.size() - 1;
69             
70             while (versionOrderIndex >= 0) {
71                 short version = versionOrder.get(versionOrderIndex);
72                 if (version == booleanList.size()) {
73                     booleanList.add(true);
74                     versionOrderIndex--;
75                 } else {
76                     booleanList.add(false);
77                 }
78             }
79             
80             elementsBuilder.setVersionBitmap(booleanList);
81
82             List<Elements> elementList = Collections.singletonList(elementsBuilder.build());
83             helloInputbuilder.setElements(elementList);
84         }
85         return helloInputbuilder.build();
86     }
87
88     /**
89      * @param elements
90      * @return version boolean list
91      */
92     public static List<Boolean> digVersions(List<Elements> elements) {
93         List<Boolean> result = null;
94         if (elements != null && !elements.isEmpty()) {
95             for (Elements elm : elements) {
96                 if (HelloElementType.VERSIONBITMAP.equals(elm.getType())) {
97                     result = elm.getVersionBitmap();
98                 }
99             }
100         }
101         return result;
102     }
103     
104     /**
105      * @param ofVersion 
106      * @param ofXid 
107      * @return barrier message
108      */
109     public static BarrierInput createBarrier(short ofVersion, long ofXid) {
110         BarrierInputBuilder barrierInput = new BarrierInputBuilder();
111         barrierInput.setVersion(ofVersion);
112         barrierInput.setXid(ofXid);
113         return barrierInput.build();
114     }
115     
116 //    /**
117 //     * @param input
118 //     * @param cookie
119 //     * @param session
120 //     * @param messageService 
121 //     * @return barrier result
122 //     */
123 //    public static Future<RpcResult<BarrierOutput>> sendBarrier(
124 //            SwitchConnectionDistinguisher cookie, SessionContext session, 
125 //            IMessageDispatchService messageService) {
126 //        BarrierInputBuilder barrierInput = new BarrierInputBuilder();
127 //        barrierInput.setVersion(session.getFeatures().getVersion());
128 //        barrierInput.setXid(session.getNextXid());
129 //        return messageService.barrier(barrierInput.build(), cookie);
130 //    }
131 }