001///////////////////////////////////////////////////////////////////////////////////////////////
002// checkstyle: Checks Java source code and other text files for adherence to a set of rules.
003// Copyright (C) 2001-2025 the original author or authors.
004//
005// This library is free software; you can redistribute it and/or
006// modify it under the terms of the GNU Lesser General Public
007// License as published by the Free Software Foundation; either
008// version 2.1 of the License, or (at your option) any later version.
009//
010// This library is distributed in the hope that it will be useful,
011// but WITHOUT ANY WARRANTY; without even the implied warranty of
012// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
013// Lesser General Public License for more details.
014//
015// You should have received a copy of the GNU Lesser General Public
016// License along with this library; if not, write to the Free Software
017// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
018///////////////////////////////////////////////////////////////////////////////////////////////
019
020package com.puppycrawl.tools.checkstyle;
021
022import java.io.Serial;
023import java.util.ArrayList;
024import java.util.HashMap;
025import java.util.List;
026import java.util.Map;
027import java.util.Set;
028
029import com.puppycrawl.tools.checkstyle.api.CheckstyleException;
030import com.puppycrawl.tools.checkstyle.api.Configuration;
031import com.puppycrawl.tools.checkstyle.utils.CommonUtil;
032
033/**
034 * Default implementation of the Configuration interface.
035 */
036public final class DefaultConfiguration implements Configuration {
037
038 /** A unique serial version identifier. */
039 @Serial
040 private static final long serialVersionUID = 1157875385356127169L;
041
042 /** Constant for optimization. */
043 private static final Configuration[] EMPTY_CONFIGURATION_ARRAY = new Configuration[0];
044
045 /** The name of this configuration. */
046 private final String name;
047
048 /** The list of child Configurations. */
049 private final List<Configuration> children = new ArrayList<>();
050
051 /** The map from property names to property values. */
052 private final Map<String, String> propertyMap = new HashMap<>();
053
054 /** The map containing custom messages. */
055 private final Map<String, String> messages = new HashMap<>();
056
057 /** The thread mode configuration. */
058 private final ThreadModeSettings threadModeSettings;
059
060 /**
061 * Instantiates a DefaultConfiguration.
062 *
063 * @param name the name for this DefaultConfiguration.
064 */
065 public DefaultConfiguration(String name) {
066 this(name, ThreadModeSettings.SINGLE_THREAD_MODE_INSTANCE);
067 }
068
069 /**
070 * Instantiates a DefaultConfiguration.
071 *
072 * @param name the name for this DefaultConfiguration.
073 * @param threadModeSettings the thread mode configuration.
074 */
075 public DefaultConfiguration(String name,
076 ThreadModeSettings threadModeSettings) {
077 this.name = name;
078 this.threadModeSettings = threadModeSettings;
079 }
080
081 @Override
082 public String[] getAttributeNames() {
083 return getPropertyNames();
084 }
085
086 @Override
087 public String getAttribute(String attributeName) throws CheckstyleException {
088 return getProperty(attributeName);
089 }
090
091 @Override
092 public String[] getPropertyNames() {
093 final Set<String> keySet = propertyMap.keySet();
094 return keySet.toArray(CommonUtil.EMPTY_STRING_ARRAY);
095 }
096
097 @Override
098 public String getProperty(String propertyName) throws CheckstyleException {
099 if (!propertyMap.containsKey(propertyName)) {
100 throw new CheckstyleException(
101 "missing key '" + propertyName + "' in " + name);
102 }
103 return propertyMap.get(propertyName);
104 }
105
106 @Override
107 public Configuration[] getChildren() {
108 return children.toArray(
109 EMPTY_CONFIGURATION_ARRAY);
110 }
111
112 @Override
113 public String getName() {
114 return name;
115 }
116
117 /**
118 * Makes a configuration a child of this configuration.
119 *
120 * @param configuration the child configuration.
121 */
122 public void addChild(Configuration configuration) {
123 children.add(configuration);
124 }
125
126 /**
127 * Removes a child of this configuration.
128 *
129 * @param configuration the child configuration to remove.
130 */
131 public void removeChild(final Configuration configuration) {
132 children.remove(configuration);
133 }
134
135 /**
136 * Adds n property to this configuration.
137 *
138 * @param attributeName the name of the property.
139 * @param value the value of the property.
140 * @deprecated This shall be removed in future releases. Please use
141 * {@code addProperty(String propertyName, String value)} instead.
142 */
143 @Deprecated(since = "8.45")
144 public void addAttribute(String attributeName, String value) {
145 addProperty(attributeName, value);
146 }
147
148 /**
149 * Adds n property to this configuration.
150 *
151 * @param propertyName the name of the property.
152 * @param value the value of the property.
153 */
154 public void addProperty(String propertyName, String value) {
155 final String current = propertyMap.get(propertyName);
156 final String newValue;
157 if (current == null) {
158 newValue = value;
159 }
160 else {
161 newValue = current + "," + value;
162 }
163 propertyMap.put(propertyName, newValue);
164 }
165
166 /**
167 * Adds a custom message to this configuration.
168 *
169 * @param key the message key
170 * @param value the custom message pattern
171 */
172 public void addMessage(String key, String value) {
173 messages.put(key, value);
174 }
175
176 /**
177 * Returns an unmodifiable map instance containing the custom messages
178 * for this configuration.
179 *
180 * @return unmodifiable map containing custom messages
181 */
182 @Override
183 public Map<String, String> getMessages() {
184 return new HashMap<>(messages);
185 }
186
187 /**
188 * Gets the thread mode configuration.
189 *
190 * @return the thread mode configuration.
191 */
192 public ThreadModeSettings getThreadModeSettings() {
193 return threadModeSettings;
194 }
195
196}