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