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