1   /*
2    * Copyright 2018 LINE Corporation
3    *
4    * LINE Corporation licenses this file to you under the Apache License,
5    * version 2.0 (the "License"); you may not use this file except in compliance
6    * with the License. You may obtain a copy of the License at:
7    *
8    *   https://www.apache.org/licenses/LICENSE-2.0
9    *
10   * Unless required by applicable law or agreed to in writing, software
11   * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
12   * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
13   * License for the specific language governing permissions and limitations
14   * under the License.
15   */
16  
17  package com.linecorp.centraldogma.internal.thrift;
18  
19  import static com.google.common.collect.ImmutableList.toImmutableList;
20  
21  import java.util.List;
22  
23  import com.google.common.base.Converter;
24  import com.google.common.collect.ImmutableList;
25  
26  /**
27   * Provides a function converting back and forth between {@link MergeQuery} and
28   * {@link com.linecorp.centraldogma.common.MergeQuery}.
29   */
30  public final class MergeQueryConverter
31          extends Converter<com.linecorp.centraldogma.common.MergeQuery<?>, MergeQuery> {
32  
33      public static final Converter<com.linecorp.centraldogma.common.MergeQuery<?>, MergeQuery>
34              TO_DATA = new MergeQueryConverter();
35  
36      public static final Converter<MergeQuery, com.linecorp.centraldogma.common.MergeQuery<?>>
37              TO_MODEL = TO_DATA.reverse();
38  
39      @Override
40      protected MergeQuery doForward(com.linecorp.centraldogma.common.MergeQuery<?> mergeQuery) {
41          switch (mergeQuery.type()) {
42              case IDENTITY:
43                  return new MergeQuery(QueryType.IDENTITY, convertMergeSources(mergeQuery), ImmutableList.of());
44              case JSON_PATH:
45                  return new MergeQuery(QueryType.JSON_PATH, convertMergeSources(mergeQuery),
46                                        mergeQuery.expressions());
47          }
48          throw new Error();
49      }
50  
51      @Override
52      protected com.linecorp.centraldogma.common.MergeQuery<?> doBackward(MergeQuery mergeQuery) {
53          switch (mergeQuery.type) {
54              case IDENTITY:
55                  return com.linecorp.centraldogma.common.MergeQuery.ofJson(convertMergeSources(mergeQuery));
56              case JSON_PATH:
57                  return com.linecorp.centraldogma.common.MergeQuery.ofJsonPath(convertMergeSources(mergeQuery),
58                                                                                mergeQuery.expressions);
59          }
60          throw new Error();
61      }
62  
63      private static ImmutableList<MergeSource> convertMergeSources(
64              com.linecorp.centraldogma.common.MergeQuery<?> mergeQuery) {
65          return mergeQuery.mergeSources().stream()
66                           .map(mergeSource -> new MergeSource(
67                                   mergeSource.path(), mergeSource.isOptional()))
68                           .collect(toImmutableList());
69      }
70  
71      private static List<com.linecorp.centraldogma.common.MergeSource> convertMergeSources(
72              MergeQuery mergeQuery) {
73          return mergeQuery.mergeSources
74                  .stream()
75                  .map(mergeSource -> {
76                      if (mergeSource.isIsOptional()) {
77                          return com.linecorp.centraldogma.common.MergeSource.ofOptional(mergeSource.getPath());
78                      }
79                      return com.linecorp.centraldogma.common.MergeSource.ofRequired(mergeSource.getPath());
80                  })
81                  .collect(toImmutableList());
82      }
83  
84      private MergeQueryConverter() {}
85  }