update deprecated transform and addCallback methods
[groupbasedpolicy.git] / sxp-integration / sxp-ep-provider / src / main / java / org / opendaylight / groupbasedpolicy / sxp / ep / provider / impl / util / EPTemplateUtil.java
1 /*
2  * Copyright (c) 2016 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.groupbasedpolicy.sxp.ep.provider.impl.util;
9
10 import com.google.common.base.Function;
11 import com.google.common.base.MoreObjects;
12 import com.google.common.base.Optional;
13 import com.google.common.collect.Ordering;
14 import com.google.common.util.concurrent.Futures;
15 import com.google.common.util.concurrent.ListenableFuture;
16 import com.google.common.util.concurrent.MoreExecutors;
17
18 import java.util.ArrayList;
19 import java.util.List;
20 import javax.annotation.Nonnull;
21 import javax.annotation.Nullable;
22 import org.apache.commons.lang3.tuple.MutablePair;
23 import org.apache.commons.lang3.tuple.Pair;
24 import org.apache.commons.net.util.SubnetUtils;
25 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpPrefix;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.ConditionName;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.EndpointGroupId;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.groupbasedpolicy.sxp.integration.sxp.ep.provider.model.rev160302.sxp.ep.mapper.EndpointForwardingTemplateBySubnet;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.groupbasedpolicy.sxp.integration.sxp.ep.provider.model.rev160302.sxp.ep.mapper.EndpointPolicyTemplateBySgt;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.sxp.database.rev160308.Sgt;
31
32 /**
33  * Purpose: util methods for {@link EndpointForwardingTemplateBySubnet} and {@link EndpointPolicyTemplateBySgt}
34  */
35 public final class EPTemplateUtil {
36
37     public static final String FULL_IPV4_MASK_SUFFIX = "/32";
38     private static final Comparable EMPTY_COMPARABLE = "";
39
40     private EPTemplateUtil() {
41         throw new IllegalAccessError("constructing util class");
42     }
43
44     public static boolean isPlain(final IpPrefix key) {
45         return key.getIpv4Prefix().getValue().endsWith(FULL_IPV4_MASK_SUFFIX);
46     }
47
48     public static SubnetInfoKeyDecorator buildSubnetInfoKey(@Nonnull final IpPrefix value) {
49         return new SubnetInfoKeyDecorator(new SubnetUtils(value.getIpv4Prefix().getValue()).getInfo());
50     }
51
52     public static <L, R> ListenableFuture<OptionalMutablePair<L, R>> compositeRead(
53             final ListenableFuture<Optional<L>> leftRead, final ListenableFuture<Optional<R>> rightRead) {
54
55         final OptionalMutablePair<L, R> compositeResult = new OptionalMutablePair<>();
56         final List<ListenableFuture<?>> results = new ArrayList<>(2);
57
58         results.add(Futures.transform(leftRead, new Function<Optional<L>, OptionalMutablePair<L, R>>() {
59             @Nullable
60             @Override
61             public OptionalMutablePair<L, R> apply(@Nullable final Optional<L> input) {
62                 compositeResult.setLeft(input);
63                 return compositeResult;
64             }
65         }, MoreExecutors.directExecutor()));
66
67         results.add(Futures.transform(rightRead, new Function<Optional<R>, OptionalMutablePair<L, R>>() {
68             @Nullable
69             @Override
70             public OptionalMutablePair<L, R> apply(@Nullable final Optional<R> input) {
71                 compositeResult.setRight(input);
72                 return compositeResult;
73             }
74         }, MoreExecutors.directExecutor()));
75
76         return Futures.transform(Futures.successfulAsList(results),
77                 new Function<List<?>, OptionalMutablePair<L, R>>() {
78                     @Nullable
79                     @Override
80                     public OptionalMutablePair<L, R> apply(@Nullable final List<?> input) {
81                         return compositeResult;
82                     }
83                 }, MoreExecutors.directExecutor());
84     }
85
86     public static <K, V> ListenableFuture<Pair<K, V>> wrapToPair(
87             final K keyItem,
88             final ListenableFuture<Optional<V>> valueFromRead) {
89         return Futures.transform(valueFromRead, new Function<Optional<V>, Pair<K, V>>() {
90             @Nullable
91             @Override
92             public Pair<K, V> apply(@Nullable final Optional<V> input) {
93                 return new MutablePair<>(keyItem, input.orNull());
94             }
95         }, MoreExecutors.directExecutor());
96     }
97
98     public static <V> ListenableFuture<Optional<V>> wrapToOptional(final ListenableFuture<V> value) {
99         return Futures.transform(value, new Function<V, Optional<V>>() {
100             @Nullable
101             @Override
102             public Optional<V> apply(@Nullable final V input) {
103                 return Optional.fromNullable(input);
104             }
105         }, MoreExecutors.directExecutor());
106     }
107
108     public static Ordering<EndpointGroupId> createEndpointGroupIdOrdering() {
109         return Ordering.natural().onResultOf(new Function<EndpointGroupId, Comparable>() {
110             @Nullable
111             @Override
112             public Comparable apply(@Nullable final EndpointGroupId input) {
113                 if (input == null) {
114                     return EMPTY_COMPARABLE;
115                 }
116                 return MoreObjects.firstNonNull(input.getValue(), EMPTY_COMPARABLE);
117             }
118         });
119     }
120
121     public static Ordering<ConditionName> createConditionNameOrdering() {
122         return Ordering.natural().onResultOf(new Function<ConditionName, Comparable>() {
123             @Nullable
124             @Override
125             public Comparable apply(@Nullable final ConditionName input) {
126                 if (input == null) {
127                     return EMPTY_COMPARABLE;
128                 }
129                 return MoreObjects.firstNonNull(input.getValue(), EMPTY_COMPARABLE);
130             }
131         });
132     }
133
134     public static Ordering<Sgt> createSgtOrdering() {
135         return Ordering.natural().onResultOf(new Function<Sgt, Comparable>() {
136             @Nullable
137             @Override
138             public Comparable apply(@Nullable final Sgt input) {
139                 if (input == null) {
140                     return EMPTY_COMPARABLE;
141                 }
142                 return MoreObjects.firstNonNull(input.getValue(), EMPTY_COMPARABLE);
143             }
144         });
145     }
146
147     public static class OptionalMutablePair<L, R> extends MutablePair<Optional<L>, Optional<R>> {
148         public OptionalMutablePair() {
149             super(Optional.absent(), Optional.absent());
150         }
151     }
152 }