summaryrefslogtreecommitdiffstats
path: root/java/com/google/gerrit/server/ModuleOverloader.java
blob: 7083e6d743290e9ccc0351323ca3073fdb75c115 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
// Copyright (C) 2018 The Android Open Source Project
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

package com.google.gerrit.server;

import com.google.inject.Module;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

public class ModuleOverloader {
  public static List<Module> override(List<Module> modules, List<Module> overrideCandidates) {
    if (overrideCandidates == null || overrideCandidates.isEmpty()) {
      return modules;
    }

    // group candidates by annotation existence
    Map<Boolean, List<Module>> grouped =
        overrideCandidates
            .stream()
            .collect(
                Collectors.groupingBy(m -> m.getClass().getAnnotation(ModuleImpl.class) != null));

    // add all non annotated libs to modules list
    List<Module> libs = grouped.get(Boolean.FALSE);
    if (libs != null) {
      modules.addAll(libs);
    }

    List<Module> overrides = grouped.get(Boolean.TRUE);
    if (overrides == null) {
      return modules;
    }

    // swipe cache implementation with alternative provided in lib
    return modules
        .stream()
        .map(
            m -> {
              ModuleImpl a = m.getClass().getAnnotation(ModuleImpl.class);
              if (a == null) {
                return m;
              }
              return overrides
                  .stream()
                  .filter(
                      o ->
                          o.getClass()
                              .getAnnotation(ModuleImpl.class)
                              .name()
                              .equalsIgnoreCase(a.name()))
                  .findFirst()
                  .orElse(m);
            })
        .collect(Collectors.toList());
  }

  private ModuleOverloader() {}
}