1   /*
2    * Copyright 2025 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  package com.linecorp.centraldogma.server.internal;
17  
18  import java.io.File;
19  import java.io.IOException;
20  import java.nio.file.Path;
21  import java.util.ArrayList;
22  import java.util.Collections;
23  import java.util.List;
24  import java.util.Set;
25  import java.util.concurrent.TimeUnit;
26  
27  import javax.annotation.Nullable;
28  
29  import org.eclipse.jgit.storage.file.FileBasedConfig;
30  import org.eclipse.jgit.transport.RefSpec;
31  import org.eclipse.jgit.util.FS;
32  
33  public final class EmptyGitConfig extends FileBasedConfig {
34  
35      private static final String[] EMPTY_STRING_ARRAY = {};
36  
37      public static final FileBasedConfig INSTANCE = new EmptyGitConfig();
38  
39      private EmptyGitConfig() {
40          super(null, null, null);
41      }
42  
43      @Override
44      public void load() {
45          // Do nothing because we don't want to load anything from external sources.
46      }
47  
48      @Override
49      public void save() throws IOException {
50          // Do nothing.
51      }
52  
53      @Override
54      public boolean isOutdated() {
55          return false;
56      }
57  
58      @Override
59      public int getInt(String section, String name, int defaultValue) {
60          return defaultValue;
61      }
62  
63      @Override
64      public int getInt(String section, String subsection, String name, int defaultValue) {
65          return defaultValue;
66      }
67  
68      @Override
69      public long getLong(String section, String name, long defaultValue) {
70          return defaultValue;
71      }
72  
73      @Override
74      public long getLong(String section, String subsection, String name, long defaultValue) {
75          return defaultValue;
76      }
77  
78      @Override
79      public boolean getBoolean(String section, String name, boolean defaultValue) {
80          return defaultValue;
81      }
82  
83      @Override
84      public boolean getBoolean(String section, String subsection, String name, boolean defaultValue) {
85          return defaultValue;
86      }
87  
88      @Override
89      public <T extends Enum<?>> T getEnum(String section, String subsection, String name, T defaultValue) {
90          return defaultValue;
91      }
92  
93      @Override
94      public <T extends Enum<?>> T getEnum(T[] all, String section, String subsection, String name,
95                                           T defaultValue) {
96          return defaultValue;
97      }
98  
99      @Override
100     @Nullable
101     public String getString(String section, String subsection, String name) {
102         return null;
103     }
104 
105     @Override
106     public String[] getStringList(String section, String subsection, String name) {
107         return EMPTY_STRING_ARRAY;
108     }
109 
110     @Override
111     public long getTimeUnit(String section, String subsection, String name, long defaultValue,
112                             TimeUnit wantUnit) {
113         return defaultValue;
114     }
115 
116     @Override
117     public Path getPath(String section, String subsection, String name, FS fs, File resolveAgainst,
118                         Path defaultValue) {
119         return defaultValue;
120     }
121 
122     @Override
123     public List<RefSpec> getRefSpecs(String section, String subsection, String name) {
124         // We return a mutable list to match the original behavior.
125         return new ArrayList<>();
126     }
127 
128     @Override
129     public Set<String> getSubsections(String section) {
130         return Collections.emptySet();
131     }
132 
133     @Override
134     public Set<String> getSections() {
135         return Collections.emptySet();
136     }
137 
138     @Override
139     public Set<String> getNames(String section) {
140         return Collections.emptySet();
141     }
142 
143     @Override
144     public Set<String> getNames(String section, String subsection) {
145         return Collections.emptySet();
146     }
147 
148     @Override
149     public Set<String> getNames(String section, boolean recursive) {
150         return Collections.emptySet();
151     }
152 
153     @Override
154     public Set<String> getNames(String section, String subsection, boolean recursive) {
155         return Collections.emptySet();
156     }
157 
158     @Override
159     public <T> T get(SectionParser<T> parser) {
160         return parser.parse(this);
161     }
162 
163     @Override
164     public String toText() {
165         return "";
166     }
167 
168     @Override
169     public String toString() {
170         // super.toString() triggers a NullPointerException because it assumes getFile() returns non-null,
171         // which is not the case for us.
172         return getClass().getSimpleName();
173     }
174 }