![JAR search and dependency download from the Maven repository](/logo.png)
de.gurkenlabs.litiengine.configuration.Configuration Maven / Gradle / Ivy
package de.gurkenlabs.litiengine.configuration;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
import java.util.logging.Level;
import java.util.logging.Logger;
import de.gurkenlabs.litiengine.Game;
import de.gurkenlabs.litiengine.resources.Resources;
public class Configuration {
private static final Logger log = Logger.getLogger(Configuration.class.getName());
private static final String DEFAULT_CONFIGURATION_FILE_NAME = "config.properties";
private final List configurationGroups;
private final String fileName;
/**
* Initializes a new instance of the {@code Configuration} class.
*
* @param configurationGroups
* The configuration groups managed by this instance.
*/
public Configuration(final ConfigurationGroup... configurationGroups) {
this(DEFAULT_CONFIGURATION_FILE_NAME, configurationGroups);
}
/**
* Initializes a new instance of the {@code Configuration} class.
*
* @param fileName
* The name of the file from which to load the settings.
*
* @param configurationGroups
* The configuration groups managed by this instance.
*/
public Configuration(final String fileName, final ConfigurationGroup... configurationGroups) {
this.fileName = fileName;
this.configurationGroups = new ArrayList<>();
if (configurationGroups != null && configurationGroups.length > 0) {
for (final ConfigurationGroup group : configurationGroups) {
this.configurationGroups.add(group);
}
}
}
/**
* Gets the strongly typed configuration group if it was previously added to the configuration.
*
* @param
* The type of the config group.
* @param groupClass
* The class that provides the generic type for this method.
* @return The configuration group of the specified type or null if none can be found.
*/
public T getConfigurationGroup(final Class groupClass) {
for (final ConfigurationGroup group : this.getConfigurationGroups()) {
if (group.getClass().equals(groupClass)) {
return groupClass.cast(group);
}
}
return null;
}
public ConfigurationGroup getConfigurationGroup(final String prefix) {
for (final ConfigurationGroup group : this.getConfigurationGroups()) {
final ConfigurationGroupInfo info = group.getClass().getAnnotation(ConfigurationGroupInfo.class);
if (info == null) {
continue;
}
if (info.prefix().equals(prefix)) {
return group;
}
}
return null;
}
/**
* Gets all {@code ConfigurationGroups} from the configuration.
*
* @return All config groups.
*/
public List getConfigurationGroups() {
return this.configurationGroups;
}
/**
* Adds the specified configuration group to the configuration.
*
* @param group
* The group to add.
*/
public void add(ConfigurationGroup group) {
this.getConfigurationGroups().add(group);
}
/**
* Gets the name of the file to which this configuration is saved.
*
* @return The name of the configuration file.
*
* @see #save()
*/
public String getFileName() {
return this.fileName;
}
/**
* Tries to load the configuration from file in the application folder. If none exists, it tries to load the file from
* any resource folder. If none exists, it creates a new configuration file in the application folder.
*/
public void load() {
final File settingsFile = new File(this.getFileName());
try (InputStream settingsStream = Resources.get(this.getFileName())) {
if (!settingsFile.exists() && settingsStream == null || !settingsFile.isFile()) {
try (OutputStream out = new FileOutputStream(settingsFile)) {
this.createDefaultSettingsFile(out);
}
log.log(Level.INFO, "Default configuration {0} created", this.getFileName());
return;
}
} catch (final IOException e) {
log.log(Level.SEVERE, e.getMessage(), e);
}
if (settingsFile.exists()) {
try (InputStream settingsStream = new FileInputStream(settingsFile)) {
final Properties properties = new Properties();
BufferedInputStream stream;
stream = new BufferedInputStream(settingsStream);
properties.load(stream);
stream.close();
this.initializeSettingsByProperties(properties);
log.log(Level.INFO, "Configuration {0} created", this.getFileName());
} catch (final IOException e) {
log.log(Level.SEVERE, e.getMessage(), e);
}
}
}
/**
* Saves this configuration to a file with the specified name of this instance (config.properties is the engines default
* config file).
*
* @see #getFileName()
* @see Configuration#DEFAULT_CONFIGURATION_FILE_NAME
*/
public void save() {
final File settingsFile = new File(this.getFileName());
try (OutputStream out = new FileOutputStream(settingsFile, false)) {
for (final ConfigurationGroup group : this.getConfigurationGroups()) {
if (!Game.isDebug() && group.isDebug()) {
continue;
}
storeConfigurationGroup(out, group);
}
log.log(Level.INFO, "Configuration {0} saved", this.getFileName());
} catch (final IOException e) {
log.log(Level.SEVERE, e.getMessage(), e);
}
}
private static void storeConfigurationGroup(final OutputStream out, final ConfigurationGroup group) {
try {
final Properties groupProperties = new CleanProperties();
group.storeProperties(groupProperties);
groupProperties.store(out, group.getPrefix() + "SETTINGS");
out.flush();
} catch (final IOException e) {
log.log(Level.SEVERE, e.getMessage(), e);
}
}
private void createDefaultSettingsFile(final OutputStream out) {
for (final ConfigurationGroup group : this.getConfigurationGroups()) {
storeConfigurationGroup(out, group);
}
}
private void initializeSettingsByProperties(final Properties properties) {
for (final String key : properties.stringPropertyNames()) {
for (final ConfigurationGroup group : this.getConfigurationGroups()) {
if (key.startsWith(group.getPrefix())) {
group.initializeByProperty(key, properties.getProperty(key));
}
}
}
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy