Skip to content

Commit

Permalink
Wrap config in an O2WConfig class
Browse files Browse the repository at this point in the history
  • Loading branch information
tordanik committed Feb 4, 2025
1 parent 373869c commit 8e9a7e1
Show file tree
Hide file tree
Showing 44 changed files with 372 additions and 239 deletions.
29 changes: 14 additions & 15 deletions core/src/main/java/org/osm2world/core/ConversionFacade.java
Original file line number Diff line number Diff line change
Expand Up @@ -19,9 +19,9 @@

import javax.annotation.Nullable;

import org.apache.commons.configuration.BaseConfiguration;
import org.apache.commons.configuration.Configuration;
import org.osm2world.core.conversion.ConfigUtil;
import org.osm2world.core.conversion.ConversionLog;
import org.osm2world.core.conversion.O2WConfig;
import org.osm2world.core.map_data.creation.OSMToMapDataConverter;
import org.osm2world.core.map_data.data.MapData;
import org.osm2world.core.map_data.data.MapMetadata;
Expand All @@ -41,7 +41,6 @@
import org.osm2world.core.target.TargetUtil;
import org.osm2world.core.target.common.material.Materials;
import org.osm2world.core.target.common.model.Models;
import org.osm2world.core.util.ConfigUtil;
import org.osm2world.core.util.FaultTolerantIterationUtil;
import org.osm2world.core.util.functions.Factory;
import org.osm2world.core.world.attachment.AttachmentConnector;
Expand Down Expand Up @@ -96,7 +95,7 @@ public TerrainElevationData getEleData() {
/**
* generates a default list of modules for the conversion
*/
static final List<WorldModule> createDefaultModuleList(Configuration config) {
static final List<WorldModule> createDefaultModuleList(O2WConfig config) {

List<String> excludedModules = config.getList("excludeWorldModule")
.stream().map(m -> m.toString()).toList();
Expand Down Expand Up @@ -173,7 +172,7 @@ public void setTerrainEleInterpolatorFactory(@Nullable Factory<? extends Terrain
* you want to handle the returned results yourself
*/
public Results createRepresentations(File osmFile, @Nullable MapMetadata metadata,
List<? extends WorldModule> worldModules, Configuration config,
List<? extends WorldModule> worldModules, O2WConfig config,
List<? extends Target> targets)
throws IOException {

Expand All @@ -188,7 +187,7 @@ public Results createRepresentations(File osmFile, @Nullable MapMetadata metadat
}

/**
* variant of {@link #createRepresentations(File, MapMetadata, List, Configuration, List)}
* variant of {@link #createRepresentations(File, MapMetadata, List, O2WConfig, List)}
* that accepts {@link OSMData} instead of a file.
* Use this when all data is already
* in memory, for example with editor applications.
Expand All @@ -204,7 +203,7 @@ public Results createRepresentations(File osmFile, @Nullable MapMetadata metadat
* you want to handle the returned results yourself
*/
public Results createRepresentations(OSMData osmData, @Nullable MapMetadata metadata,
List<? extends WorldModule> worldModules, Configuration config,
List<? extends WorldModule> worldModules, O2WConfig config,
List<? extends Target> targets)
throws IOException {

Expand Down Expand Up @@ -234,14 +233,14 @@ public Results createRepresentations(OSMData osmData, @Nullable MapMetadata meta
}

/**
* variant of {@link #createRepresentations(OSMData, MapMetadata, List, Configuration, List)}
* variant of {@link #createRepresentations(OSMData, MapMetadata, List, O2WConfig, List)}
* that takes {@link MapData} instead of {@link OSMData}
*
* @param mapProjection projection for converting between {@link LatLon} and local coordinates in {@link MapData}.
* May be null, but that prevents accessing additional data sources such as {@link SRTMData}.
*/
public Results createRepresentations(@Nullable MapProjection mapProjection, MapData mapData,
@Nullable List<? extends WorldModule> worldModules, @Nullable Configuration config,
@Nullable List<? extends WorldModule> worldModules, @Nullable O2WConfig config,
@Nullable List<? extends Target> targets) {

/* check the inputs */
Expand All @@ -251,7 +250,7 @@ public Results createRepresentations(@Nullable MapProjection mapProjection, MapD
}

if (config == null) {
config = new BaseConfiguration();
config = new O2WConfig();
}

/* apply world modules */
Expand All @@ -261,13 +260,13 @@ public Results createRepresentations(@Nullable MapProjection mapProjection, MapD
worldModules = createDefaultModuleList(config);
}

ConfigUtil.parseFonts(config);
Materials.configureMaterials(config);
Models.configureModels(config);
//this will cause problems if multiple conversions are run
//at the same time, because global variables are being modified

WorldCreator moduleManager =
new WorldCreator(config, worldModules);
WorldCreator moduleManager = new WorldCreator(config, worldModules);
moduleManager.addRepresentationsTo(mapData);

/* determine elevations */
Expand Down Expand Up @@ -402,7 +401,7 @@ protected static void attachConnectorIfValid(AttachmentConnector connector, Atta
* {@link WorldObject}s
*/
private void calculateElevations(MapData mapData,
TerrainElevationData eleData, Configuration config) {
TerrainElevationData eleData, O2WConfig config) {

TerrainInterpolator interpolator = createTerrainInterpolator(config);

Expand Down Expand Up @@ -448,7 +447,7 @@ private void calculateElevations(MapData mapData,

}

private EleCalculator createEleCalculator(Configuration config) {
private EleCalculator createEleCalculator(O2WConfig config) {

if (eleCalculatorFactory != null) {
return eleCalculatorFactory.get();
Expand All @@ -463,7 +462,7 @@ private EleCalculator createEleCalculator(Configuration config) {

}

private TerrainInterpolator createTerrainInterpolator(Configuration config) {
private TerrainInterpolator createTerrainInterpolator(O2WConfig config) {

if (terrainEleInterpolatorFactory != null) {
return terrainEleInterpolatorFactory.get();
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package org.osm2world.core.util;
package org.osm2world.core.conversion;

import static org.osm2world.core.target.common.mesh.LevelOfDetail.*;

Expand All @@ -11,7 +11,6 @@

import javax.annotation.Nullable;

import org.apache.commons.configuration.Configuration;
import org.apache.commons.configuration.FileConfiguration;
import org.osm2world.core.target.common.mesh.LevelOfDetail;

Expand All @@ -27,7 +26,7 @@ private ConfigUtil() { }
public static final String CANVAS_LIMIT_KEY = "canvasLimit";

/** reads and parses the value of the lod property */
public static LevelOfDetail readLOD(Configuration config) {
public static LevelOfDetail readLOD(O2WConfig config) {
return switch (config.getInt("lod", 4)) {
case 0 -> LOD0;
case 1 -> LOD1;
Expand Down Expand Up @@ -106,7 +105,7 @@ public static final Color parseColorTuple(String colorString) {
* by the "fontDirectory" key in the configuration file.
* The respective fonts can then be used in Font object constructors.
*/
public static void parseFonts(Configuration config) {
public static void parseFonts(O2WConfig config) {

if(!config.containsKey("fontDirectory")) return;

Expand All @@ -132,7 +131,7 @@ public static void parseFonts(Configuration config) {
}
}

public static <T extends Enum<T>> @Nullable T readEnum(Class<T> enumClass, Configuration config, String key) {
public static <T extends Enum<T>> @Nullable T readEnum(Class<T> enumClass, O2WConfig config, String key) {
String value = config.getString(key);
if (value != null) {
try {
Expand All @@ -146,7 +145,7 @@ public static void parseFonts(Configuration config) {
* If config references some files by path e.g. textures
* resolve file paths relative to config location
*/
public static File resolveFileConfigProperty(Configuration config, String fileName) {
public static File resolveFileConfigProperty(O2WConfig config, String fileName) {
if (fileName == null) {
return null;
}
Expand Down
148 changes: 148 additions & 0 deletions core/src/main/java/org/osm2world/core/conversion/O2WConfig.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,148 @@
package org.osm2world.core.conversion;

import java.io.File;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import javax.annotation.Nullable;

import org.apache.commons.configuration.ConfigurationException;
import org.apache.commons.configuration.MapConfiguration;
import org.apache.commons.configuration.PropertiesConfiguration;
import org.osm2world.core.target.common.mesh.LevelOfDetail;

/**
* a set of configuration options for OSM2World.
* Includes models, materials and settings which control the visual appearance of the scene.
*/
public class O2WConfig {

private final PropertiesConfiguration config;

private O2WConfig(PropertiesConfiguration config) {
this.config = config;
}

/**
* constructs a configuration with all options at their default values.
*/
public O2WConfig() {
this(Map.of());
}

/**
* constructs a configuration from a {@link Map} containing key-value options for OSM2World.
*/
public O2WConfig(@Nullable Map<String, ?> properties) {
this(properties, new File[0]);
}

/**
* constructs a configuration from a {@link Map} containing key-value options for OSM2World
* and one or more config files. Config files use the .properties format.
* For keys which are present multiple times, values from the map take precedence over values from the config files.
* Among configFiles, those later in the list take precedence.
*/
public O2WConfig(@Nullable Map<String, ?> properties, File... configFiles) {
try {
var mapConfig = new MapConfiguration(properties == null ? Map.of() : properties);
PropertiesConfiguration loadedConfig = loadConfigFiles(configFiles);
loadedConfig.copy(mapConfig);
this.config = loadedConfig;
} catch (ConfigurationException e) {
throw new RuntimeException(e);
}
}

/**
* returns a modified copy of this config that has one key set to a new value.
* @param value the new value; can be set to null to delete an existing property
*/
public O2WConfig withProperty(String key, @Nullable Object value) {
PropertiesConfiguration newConfig = (PropertiesConfiguration) config.clone();
newConfig.clearProperty(key);
if (value != null) {
newConfig.addProperty(key, value);
}
return new O2WConfig(newConfig);
}

public Iterator<String> getKeys() {
return config.getKeys();
}

public boolean containsKey(String key) {
return config.containsKey(key);
}

public String getString(String key) {
return config.getString(key);
}

public String getString(String key, String defaultValue) {
return config.getString(key, defaultValue);
}

public boolean getBoolean(String key) {
return config.getBoolean(key);
}

public boolean getBoolean(String key, boolean defaultValue) {
return config.getBoolean(key, defaultValue);
}

public int getInt(String key, int defaultValue) {
return config.getInt(key, defaultValue);
}

public Integer getInteger(String key, Integer defaultValue) {
return config.getInteger(key, defaultValue);
}

public float getFloat(String key, float defaultValue) {
return config.getFloat(key, defaultValue);
}

public Float getFloat(String key, Float defaultValue) {
return config.getFloat(key, defaultValue);
}

public double getDouble(String key, double defaultValue) {
return config.getDouble(key, defaultValue);
}

public Double getDouble(String key, Double defaultValue) {
return config.getDouble(key, defaultValue);
}

public List<Object> getList(String key) {
return config.getList(key);
}

public LevelOfDetail getLod() {
return ConfigUtil.readLOD(this);
}

private static PropertiesConfiguration loadConfigFiles(File... configFiles) throws ConfigurationException {

PropertiesConfiguration config = new PropertiesConfiguration();
config.setListDelimiter(';');

for (File it : configFiles) {
config.load(it);
}

Arrays.stream(configFiles)
.filter(File::exists)
.findFirst()
.ifPresent(f -> {
config.addProperty("configPath", f.getAbsoluteFile().getParent());
});

return config;

}

}
9 changes: 4 additions & 5 deletions core/src/main/java/org/osm2world/core/target/Target.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,24 +2,23 @@

import javax.annotation.Nullable;

import org.apache.commons.configuration.Configuration;
import org.osm2world.core.conversion.O2WConfig;
import org.osm2world.core.target.common.MeshTarget;
import org.osm2world.core.target.common.mesh.LevelOfDetail;
import org.osm2world.core.target.common.mesh.Mesh;
import org.osm2world.core.target.common.mesh.TriangleGeometry;
import org.osm2world.core.util.ConfigUtil;
import org.osm2world.core.world.data.WorldObject;

/**
* A sink for rendering/writing {@link WorldObject}s to.
*/
public interface Target extends CommonTarget {

void setConfiguration(Configuration config);
Configuration getConfiguration();
void setConfiguration(O2WConfig config);
O2WConfig getConfiguration();

default LevelOfDetail getLod() {
return ConfigUtil.readLOD(getConfiguration());
return getConfiguration().getLod();
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,7 @@

import javax.annotation.Nonnull;

import org.apache.commons.configuration.Configuration;
import org.apache.commons.configuration.PropertiesConfiguration;
import org.osm2world.core.conversion.O2WConfig;
import org.osm2world.core.target.Target;

/**
Expand All @@ -13,19 +12,19 @@
*/
public abstract class AbstractTarget implements Target {

protected @Nonnull Configuration config = new PropertiesConfiguration();
protected @Nonnull O2WConfig config = new O2WConfig();

@Override
public Configuration getConfiguration() {
public O2WConfig getConfiguration() {
return config;
}

@Override
public void setConfiguration(Configuration config) {
public void setConfiguration(O2WConfig config) {
if (config != null) {
this.config = config;
} else {
this.config = new PropertiesConfiguration();
this.config = new O2WConfig();
}
}

Expand Down
Loading

0 comments on commit 8e9a7e1

Please sign in to comment.