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