BUG-956 deadlock by rpc invocation - phase2
[openflowplugin.git] / openflowplugin / src / main / java / org / opendaylight / openflowplugin / openflow / md / core / sal / OFRpcFutureResultTransformFactory.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.sal;
9
10 import java.util.Collection;
11
12 import org.opendaylight.controller.sal.common.util.Rpcs;
13 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.AddFlowOutput;
14 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.AddFlowOutputBuilder;
15 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.UpdateFlowOutput;
16 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.AddGroupOutput;
17 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.AddGroupOutputBuilder;
18 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.UpdateGroupOutput;
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.AddMeterOutput;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.AddMeterOutputBuilder;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.UpdateMeterOutput;
22 import org.opendaylight.yangtools.yang.common.RpcError;
23 import org.opendaylight.yangtools.yang.common.RpcResult;
24 import org.slf4j.Logger;
25 import org.slf4j.LoggerFactory;
26
27 import com.google.common.base.Function;
28
29 /**
30  * collection of transformation functions dedicated to rpc future results  
31  */
32 public abstract class OFRpcFutureResultTransformFactory {
33     
34     protected static Logger LOG = LoggerFactory
35             .getLogger(OFRpcFutureResultTransformFactory.class);
36
37     /**
38      * @param input
39      * @param result
40      * @return
41      */
42     protected static <E> RpcResult<E> assembleRpcResult(RpcResult<?> input, E result) {
43         Collection<RpcError> errors = input.getErrors();
44         RpcResult<E> rpcResult = Rpcs.getRpcResult(input.isSuccessful(), result, errors);
45         return rpcResult;
46     }
47
48     /**
49      * @return translator from {@link UpdateFlowOutput} to {@link AddFlowOutput}
50      */
51     public static Function<RpcResult<UpdateFlowOutput>,RpcResult<AddFlowOutput>> createForAddFlowOutput() {
52         return new Function<RpcResult<UpdateFlowOutput>,RpcResult<AddFlowOutput>>() {
53
54             @Override
55             public RpcResult<AddFlowOutput> apply(RpcResult<UpdateFlowOutput> input) {
56
57                 UpdateFlowOutput updateFlowOutput = input.getResult();
58
59                 AddFlowOutputBuilder addFlowOutput = new AddFlowOutputBuilder();
60                 addFlowOutput.setTransactionId(updateFlowOutput.getTransactionId());
61                 AddFlowOutput result = addFlowOutput.build();
62
63                 RpcResult<AddFlowOutput> rpcResult = assembleRpcResult(input, result);
64                 LOG.debug("Returning the Add Flow RPC result to MD-SAL");
65                 return rpcResult;
66             }
67
68         };
69     }
70     
71     /**
72      * @return translator from {@link UpdateGroupOutput} to {@link AddGroupOutput}
73      */
74     public static Function<RpcResult<UpdateGroupOutput>, RpcResult<AddGroupOutput>> createForAddGroupOutput() {
75         return new Function<RpcResult<UpdateGroupOutput>,RpcResult<AddGroupOutput>>() {
76
77             @Override
78             public RpcResult<AddGroupOutput> apply(RpcResult<UpdateGroupOutput> input) {
79                 UpdateGroupOutput updateGroupOutput = input.getResult();
80                 
81                 AddGroupOutputBuilder addGroupOutput = new AddGroupOutputBuilder();
82                 addGroupOutput.setTransactionId(updateGroupOutput.getTransactionId());
83                 AddGroupOutput result = addGroupOutput.build();
84
85                 RpcResult<AddGroupOutput> rpcResult = assembleRpcResult(input, result);
86                 LOG.debug("Returning the Add Group RPC result to MD-SAL");
87                 return rpcResult;
88             }
89         };
90     }
91     
92     /**
93      * @return translator from {@link UpdateGroupOutput} to {@link AddGroupOutput}
94      */
95     public static Function<RpcResult<UpdateMeterOutput>, RpcResult<AddMeterOutput>> createForAddMeterOutput() {
96         return new Function<RpcResult<UpdateMeterOutput>,RpcResult<AddMeterOutput>>() {
97
98             @Override
99             public RpcResult<AddMeterOutput> apply(final RpcResult<UpdateMeterOutput> input) {
100                 UpdateMeterOutput updateMeterOutput = input.getResult();
101                 
102                 AddMeterOutputBuilder addMeterOutput = new AddMeterOutputBuilder();
103                 addMeterOutput.setTransactionId(updateMeterOutput.getTransactionId());
104                 AddMeterOutput result = addMeterOutput.build();
105
106                 RpcResult<AddMeterOutput> rpcResult = assembleRpcResult(input, result);
107                 LOG.debug("Returning the Add Meter RPC result to MD-SAL");
108                 return rpcResult;
109             }
110         };
111     }
112     
113     
114     
115     
116 }