Tony CHEMIT pushed to branch develop at ultreiaio / ird-observe

Commits:

9 changed files:

Changes:

  • client/configuration/src/main/java/fr/ird/observe/client/configuration/ClientConfig.java
    ... ... @@ -42,6 +42,7 @@ import fr.ird.observe.navigation.tree.selection.SelectionTreeConfig;
    42 42
     import fr.ird.observe.security.WithPermission;
    
    43 43
     import fr.ird.observe.services.ObserveServiceInitializerConfig;
    
    44 44
     import fr.ird.observe.services.service.CleanTemporaryFilesTaskConfiguration;
    
    45
    +import fr.ird.observe.spi.ConfigHelper;
    
    45 46
     import fr.ird.observe.spi.decoration.DecoratorService;
    
    46 47
     import fr.ird.observe.spi.json.DtoGsonSupplier;
    
    47 48
     import fr.ird.observe.spi.json.guava.ImmutableListAdapter;
    
    ... ... @@ -54,7 +55,6 @@ import io.ultreia.java4all.bean.definition.JavaBeanDefinition;
    54 55
     import io.ultreia.java4all.bean.definition.JavaBeanDefinitionStore;
    
    55 56
     import io.ultreia.java4all.bean.spi.GenerateJavaBeanDefinition;
    
    56 57
     import io.ultreia.java4all.config.ApplicationConfig;
    
    57
    -import io.ultreia.java4all.config.ApplicationConfigSaveException;
    
    58 58
     import io.ultreia.java4all.config.ArgumentsParserException;
    
    59 59
     import io.ultreia.java4all.config.ConfigResource;
    
    60 60
     import io.ultreia.java4all.config.spi.ApplicationConfigInit;
    
    ... ... @@ -83,7 +83,6 @@ import java.awt.RenderingHints;
    83 83
     import java.awt.image.BufferedImage;
    
    84 84
     import java.beans.PropertyChangeListener;
    
    85 85
     import java.io.BufferedReader;
    
    86
    -import java.io.BufferedWriter;
    
    87 86
     import java.io.File;
    
    88 87
     import java.io.IOException;
    
    89 88
     import java.nio.file.Files;
    
    ... ... @@ -106,7 +105,6 @@ import java.util.Properties;
    106 105
     import java.util.ServiceLoader;
    
    107 106
     import java.util.Set;
    
    108 107
     import java.util.function.Supplier;
    
    109
    -import java.util.stream.Collectors;
    
    110 108
     
    
    111 109
     import static io.ultreia.java4all.i18n.I18n.t;
    
    112 110
     import static org.nuiton.jaxx.runtime.swing.SwingUtil.ICON_PREFIX;
    
    ... ... @@ -675,36 +673,9 @@ public class ClientConfig extends GeneratedClientConfig implements TripMapConfig
    675 673
         }
    
    676 674
     
    
    677 675
         public void saveForUser() {
    
    678
    -        log.info(t("observe.ui.message.save.configuration", get().getExtraConfigFile()));
    
    679
    -        Properties propertiesToSave = get().getPropertiesToSave(false, doNotSave);
    
    680
    -        List<String> propertyNames = propertiesToSave.stringPropertyNames().stream().sorted().collect(Collectors.toList());
    
    681
    -        for (ClientConfigOption option : options()) {
    
    682
    -            String optionKey = option.getKey();
    
    683
    -            if (propertyNames.contains(optionKey)) {
    
    684
    -                String property = propertiesToSave.getProperty(optionKey);
    
    685
    -                if (Objects.equals(property, option.getDefaultValue())) {
    
    686
    -                    // use default value
    
    687
    -                    propertyNames.remove(optionKey);
    
    688
    -                }
    
    689
    -            }
    
    690
    -        }
    
    691
    -        log.info(String.format("Property names to save: %s", propertyNames));
    
    692
    -        try (BufferedWriter writer = Files.newBufferedWriter(get().getExtraConfigFile().toPath())) {
    
    693
    -            List<String> lines = ClientResources.CONFIG.readLines();
    
    694
    -            for (String line : lines) {
    
    695
    -                if (line.startsWith("#")) {
    
    696
    -                    for (String propertyName : propertyNames) {
    
    697
    -                        if (line.startsWith("#" + propertyName + "=")) {
    
    698
    -                            line = String.format("%s=%s", propertyName, propertiesToSave.getProperty(propertyName));
    
    699
    -                        }
    
    700
    -                    }
    
    701
    -                }
    
    702
    -                writer.write(line);
    
    703
    -                writer.newLine();
    
    704
    -            }
    
    705
    -        } catch (IOException e) {
    
    706
    -            throw new ApplicationConfigSaveException(e);
    
    707
    -        }
    
    676
    +        File file = get().getExtraConfigFile();
    
    677
    +        log.info(t("observe.ui.message.save.configuration", file));
    
    678
    +        ConfigHelper.save(get(), file, doNotSave, ClientResources.CONFIG, options());
    
    708 679
         }
    
    709 680
     
    
    710 681
         public Project getNavigationEditModel() {
    

  • core/api/dto/pom.xml
    ... ... @@ -69,6 +69,14 @@
    69 69
           <groupId>io.ultreia.java4all.decorator</groupId>
    
    70 70
           <artifactId>decorator-api</artifactId>
    
    71 71
         </dependency>
    
    72
    +    <dependency>
    
    73
    +      <groupId>io.ultreia.java4all.config</groupId>
    
    74
    +      <artifactId>config-api</artifactId>
    
    75
    +    </dependency>
    
    76
    +    <dependency>
    
    77
    +      <groupId>io.ultreia.java4all.config</groupId>
    
    78
    +      <artifactId>config-spi</artifactId>
    
    79
    +    </dependency>
    
    72 80
         <dependency>
    
    73 81
           <groupId>io.ultreia.java4all.decorator</groupId>
    
    74 82
           <artifactId>decorator-spi</artifactId>
    

  • core/api/dto/src/main/java/fr/ird/observe/spi/ConfigHelper.java
    1
    +package fr.ird.observe.spi;
    
    2
    +
    
    3
    +/*-
    
    4
    + * #%L
    
    5
    + * ObServe Core :: API :: Dto
    
    6
    + * %%
    
    7
    + * Copyright (C) 2008 - 2022 IRD, Code Lutin, Ultreia.io
    
    8
    + * %%
    
    9
    + * This program is free software: you can redistribute it and/or modify
    
    10
    + * it under the terms of the GNU General Public License as
    
    11
    + * published by the Free Software Foundation, either version 3 of the
    
    12
    + * License, or (at your option) any later version.
    
    13
    + *
    
    14
    + * This program is distributed in the hope that it will be useful,
    
    15
    + * but WITHOUT ANY WARRANTY; without even the implied warranty of
    
    16
    + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    
    17
    + * GNU General Public License for more details.
    
    18
    + *
    
    19
    + * You should have received a copy of the GNU General Public
    
    20
    + * License along with this program.  If not, see
    
    21
    + * <http://www.gnu.org/licenses/gpl-3.0.html>.
    
    22
    + * #L%
    
    23
    + */
    
    24
    +
    
    25
    +import io.ultreia.java4all.config.ApplicationConfig;
    
    26
    +import io.ultreia.java4all.config.ApplicationConfigSaveException;
    
    27
    +import io.ultreia.java4all.config.ConfigResource;
    
    28
    +import io.ultreia.java4all.config.spi.ConfigOptionDef;
    
    29
    +import org.apache.logging.log4j.LogManager;
    
    30
    +import org.apache.logging.log4j.Logger;
    
    31
    +
    
    32
    +import java.io.BufferedWriter;
    
    33
    +import java.io.File;
    
    34
    +import java.io.IOException;
    
    35
    +import java.nio.file.Files;
    
    36
    +import java.util.List;
    
    37
    +import java.util.Objects;
    
    38
    +import java.util.Properties;
    
    39
    +import java.util.stream.Collectors;
    
    40
    +
    
    41
    +/**
    
    42
    + * FIXME Move this to config project.
    
    43
    + * Created on 19/02/2022.
    
    44
    + *
    
    45
    + * @author Tony Chemit - dev@tchemit.fr
    
    46
    + * @since 9.0.0
    
    47
    + */
    
    48
    +public class ConfigHelper {
    
    49
    +
    
    50
    +    private static final Logger log = LogManager.getLogger(ConfigHelper.class);
    
    51
    +
    
    52
    +    public static void save(ApplicationConfig applicationConfig, File file, String[] doNotSave, ConfigResource resource, ConfigOptionDef[] options) {
    
    53
    +        log.info(String.format("Save configuration to %s", file));
    
    54
    +        Properties propertiesToSave = applicationConfig.getPropertiesToSave(false, doNotSave);
    
    55
    +        List<String> propertyNames = propertiesToSave.stringPropertyNames().stream().sorted().collect(Collectors.toList());
    
    56
    +        for (ConfigOptionDef option : options) {
    
    57
    +            String optionKey = option.getKey();
    
    58
    +            if (propertyNames.contains(optionKey)) {
    
    59
    +                String property = propertiesToSave.getProperty(optionKey);
    
    60
    +                if (Objects.equals(property, option.getDefaultValue())) {
    
    61
    +                    // use default value
    
    62
    +                    propertyNames.remove(optionKey);
    
    63
    +                }
    
    64
    +            }
    
    65
    +        }
    
    66
    +
    
    67
    +        log.info(String.format("Property names to save: %s", propertyNames));
    
    68
    +        try (BufferedWriter writer = Files.newBufferedWriter(file.toPath())) {
    
    69
    +            List<String> lines = resource.readLines();
    
    70
    +            for (String line : lines) {
    
    71
    +                if (line.startsWith("#")) {
    
    72
    +                    for (String propertyName : propertyNames) {
    
    73
    +                        if (line.startsWith("#" + propertyName + "=")) {
    
    74
    +                            line = String.format("%s=%s", propertyName, propertiesToSave.getProperty(propertyName));
    
    75
    +                        }
    
    76
    +                    }
    
    77
    +                }
    
    78
    +                writer.write(line);
    
    79
    +                writer.newLine();
    
    80
    +            }
    
    81
    +        } catch (IOException e) {
    
    82
    +            throw new ApplicationConfigSaveException(e);
    
    83
    +        }
    
    84
    +    }
    
    85
    +
    
    86
    +}

  • server/configuration/src/main/config/Server.ini
    ... ... @@ -43,6 +43,11 @@ key = common.directory.config
    43 43
     type = file
    
    44 44
     defaultValue = ${common.directory.instances}/.conf/${build.version.major}
    
    45 45
     
    
    46
    +[option commonConfigurationFile]
    
    47
    +key = common.directory.config.file
    
    48
    +type = file
    
    49
    +defaultValue = ${common.directory.config}/observe-server.conf
    
    50
    +
    
    46 51
     [option commonLog4jConfigurationFile]
    
    47 52
     key = common.directory.config.file.log
    
    48 53
     type = file
    

  • server/configuration/src/main/i18n/getters/config.getter
    ... ... @@ -5,6 +5,7 @@ application.config.option.build.version.major
    5 5
     application.config.option.build.version.persistence
    
    6 6
     server.config.name
    
    7 7
     server.config.option.common.directory.config
    
    8
    +server.config.option.common.directory.config.file
    
    8 9
     server.config.option.common.directory.config.file.log
    
    9 10
     server.config.option.common.directory.config.file.server
    
    10 11
     server.config.option.common.directory.instances
    

  • server/configuration/src/main/java/fr/ird/observe/server/configuration/ServerConfig.java
    ... ... @@ -25,6 +25,7 @@ package fr.ird.observe.server.configuration;
    25 25
     import fr.ird.observe.dto.ObserveUtil;
    
    26 26
     import fr.ird.observe.dto.referential.ReferentialLocale;
    
    27 27
     import fr.ird.observe.services.service.CleanTemporaryFilesTaskConfiguration;
    
    28
    +import fr.ird.observe.spi.ConfigHelper;
    
    28 29
     import io.ultreia.java4all.application.context.spi.ApplicationComponentInstantiateStrategy;
    
    29 30
     import io.ultreia.java4all.application.context.spi.GenerateApplicationComponent;
    
    30 31
     import io.ultreia.java4all.application.template.TemplateGeneratorConfig;
    
    ... ... @@ -60,38 +61,70 @@ public class ServerConfig extends GeneratedServerConfig implements CleanTemporar
    60 61
                 "observeweb.httpTimeout", "instance.timeout.http",
    
    61 62
                 "observeweb.sessionExpirationDelay", "instance.timeout.session",
    
    62 63
                 "observeweb.sessionMaximumSize", "instance.session.maximum.size"
    
    63
    -            );
    
    64
    +    );
    
    64 65
         private static Logger log = LogManager.getLogger(ServerConfig.class);
    
    65 66
         private ReferentialLocale referentialLocale;
    
    66 67
     
    
    68
    +    protected static ApplicationConfigInit setConfigFileName(ApplicationConfigInit init) {
    
    69
    +        return init.setConfigFileName(DEFAULT_OBSERVE_WEB_CONFIGURATION_FILENAME);
    
    70
    +    }
    
    71
    +
    
    72
    +    protected static ApplicationConfigInit setInstanceExtraConfigDirectory(ApplicationConfigInit init) {
    
    73
    +        return init.setExtraConfigDirectory("${instance.directory}");
    
    74
    +    }
    
    75
    +
    
    76
    +    protected static ApplicationConfigInit setCommonExtraConfigDirectory(ApplicationConfigInit init) {
    
    77
    +        return init.setExtraConfigDirectory("${common.directory.config}");
    
    78
    +    }
    
    79
    +
    
    67 80
         public static ServerConfig fromContextPath(String contextPath) {
    
    68
    -        ServerConfig config = new ServerConfig(ApplicationConfigInit
    
    69
    -                                                       .defaultInit()
    
    70
    -                                                       .addDefaults(ServerConfigOption.CONTEXT_PATH.getKey(), contextPath));
    
    71
    -        config.init();
    
    81
    +
    
    82
    +        // load a first configuration with /etc authorized (and only him)
    
    83
    +        // using extra config directory as common configuration directory
    
    84
    +        // if default configuration does not exist, generate it and migrates from /etc
    
    85
    +
    
    86
    +        ApplicationConfigInit init = ApplicationConfigInit.forAllScopesWithout(ApplicationConfigScope.HOME, ApplicationConfigScope.ENV)
    
    87
    +                .addDefaults(ServerConfigOption.CONTEXT_PATH.getKey(), contextPath);
    
    88
    +
    
    89
    +        ServerConfig fakeConfig = new ServerConfig(setCommonExtraConfigDirectory(setConfigFileName(init)), true);
    
    90
    +        fakeConfig.initFirst();
    
    91
    +
    
    92
    +        // Now that common files are ready, starts a normal configuration without system file and without migration possible
    
    93
    +        ApplicationConfigInit  realInit = ApplicationConfigInit.forAllScopesWithout(ApplicationConfigScope.HOME, ApplicationConfigScope.ENV, ApplicationConfigScope.SYSTEM)
    
    94
    +                .addDefaults(ServerConfigOption.CONTEXT_PATH.getKey(), contextPath);
    
    95
    +
    
    96
    +        ServerConfig config = new ServerConfig(setInstanceExtraConfigDirectory(setConfigFileName(realInit)));
    
    97
    +        config.init(true);
    
    72 98
             return config;
    
    73 99
         }
    
    74 100
     
    
    75 101
         public static ServerConfig forTest() throws IOException {
    
    76 102
             Files.createDirectories(new File(System.getProperty("java.io.tmpdir")).toPath());
    
    77 103
             Path directory = Files.createTempDirectory("taiste");
    
    78
    -        ServerConfig config = new ServerConfig(ApplicationConfigInit
    
    79
    -                                                       .forAllScopesWithout(ApplicationConfigScope.CURRENT,
    
    80
    -                                                                            ApplicationConfigScope.HOME,
    
    81
    -                                                                            ApplicationConfigScope.ENV,
    
    82
    -                                                                            ApplicationConfigScope.JVM,
    
    83
    -                                                                            ApplicationConfigScope.CLASS_PATH,
    
    84
    -                                                                            ApplicationConfigScope.SYSTEM)
    
    85
    -                                                       .addDefaults(ServerConfigOption.CONTEXT_PATH.getKey(), "observe-${build.version}")
    
    86
    -                                                       .addDefaults(ServerConfigOption.COMMON_CONFIG_DIRECTORY.getKey(), String.format("%s/${build.version.major}", directory.resolve("conf")))
    
    87
    -                                                       .addDefaults(ServerConfigOption.COMMON_INSTANCES_DIRECTORY.getKey(), directory.resolve("instances").toString()));
    
    88
    -        config.init();
    
    104
    +        ApplicationConfigInit init = ApplicationConfigInit
    
    105
    +                .forAllScopesWithout(ApplicationConfigScope.CURRENT,
    
    106
    +                                     ApplicationConfigScope.HOME,
    
    107
    +                                     ApplicationConfigScope.ENV,
    
    108
    +                                     ApplicationConfigScope.JVM,
    
    109
    +                                     ApplicationConfigScope.CLASS_PATH,
    
    110
    +                                     ApplicationConfigScope.SYSTEM)
    
    111
    +                .addDefaults(ServerConfigOption.CONTEXT_PATH.getKey(), "observe-${build.version}")
    
    112
    +                .addDefaults(ServerConfigOption.COMMON_CONFIG_DIRECTORY.getKey(), String.format("%s/${build.version.major}", directory.resolve("conf")))
    
    113
    +                .addDefaults(ServerConfigOption.COMMON_INSTANCES_DIRECTORY.getKey(), directory.resolve("instances").toString());
    
    114
    +        ServerConfig config = new ServerConfig(setInstanceExtraConfigDirectory(setConfigFileName(init)));
    
    115
    +        config.init(false);
    
    89 116
             return config;
    
    90 117
         }
    
    91 118
     
    
    92 119
         private ServerConfig(ApplicationConfigInit init) {
    
    93
    -        super(init.setConfigFileName(DEFAULT_OBSERVE_WEB_CONFIGURATION_FILENAME).setExtraConfigDirectory("${instance.directory}"));
    
    94
    -        get().setPropertiesMigration(V9_MIGRATION);
    
    120
    +        this(init, false);
    
    121
    +    }
    
    122
    +
    
    123
    +    private ServerConfig(ApplicationConfigInit init, boolean acceptMigration) {
    
    124
    +        super(init);
    
    125
    +        if (acceptMigration) {
    
    126
    +            get().setPropertiesMigration(V9_MIGRATION);
    
    127
    +        }
    
    95 128
         }
    
    96 129
     
    
    97 130
         @Override
    
    ... ... @@ -99,13 +132,31 @@ public class ServerConfig extends GeneratedServerConfig implements CleanTemporar
    99 132
             return Collections.singletonMap(getTemporaryDirectory().toPath(), getTemporaryFilesTimeout());
    
    100 133
         }
    
    101 134
     
    
    102
    -    public void init(String... args) {
    
    103
    -        log.info("Starts to init ObServe server configuration...");
    
    104
    -        try {
    
    105
    -            get().parse(args);
    
    106
    -        } catch (ArgumentsParserException e) {
    
    107
    -            throw new ObserveWebApplicationConfigInitException("could not parse configuration", e);
    
    135
    +    public void initFirst() {
    
    136
    +        log.info("Starts to init ObServe fake server configuration (to generate default directories and common files...");
    
    137
    +
    
    138
    +        parse();
    
    139
    +
    
    140
    +        Path baseDirectory = getCommonConfigDirectory().toPath();
    
    141
    +        createDirectories(baseDirectory, "Impossible de créer le répertoire principal de l'application (%s)");
    
    142
    +
    
    143
    +        File extraConfigFile = get().getExtraConfigFile();
    
    144
    +        if (Files.notExists(extraConfigFile.toPath())) {
    
    145
    +            log.info(String.format("Save common configuration file to: %s", extraConfigFile));
    
    146
    +            ConfigHelper.save(get(), extraConfigFile, new String[0], ServerResources.CONFIG, options());
    
    147
    +        }
    
    148
    +
    
    149
    +        File log4jConfigurationFile = getCommonLog4jConfigurationFile();
    
    150
    +        if (!log4jConfigurationFile.exists()) {
    
    151
    +            ServerResources.LOG_CONFIGURATION_FILE.copyResource(log4jConfigurationFile);
    
    152
    +            log.info(String.format("Generate empty log4j configuration file to: %s", log4jConfigurationFile));
    
    108 153
             }
    
    154
    +    }
    
    155
    +
    
    156
    +    public void init(boolean strict) {
    
    157
    +        log.info("Starts to init ObServe server configuration...");
    
    158
    +
    
    159
    +        parse();
    
    109 160
     
    
    110 161
             Path baseDirectory = getBaseDirectory().toPath();
    
    111 162
             log.info(getConfigurationDescription());
    
    ... ... @@ -113,8 +164,12 @@ public class ServerConfig extends GeneratedServerConfig implements CleanTemporar
    113 164
     
    
    114 165
             File extraConfigFile = get().getExtraConfigFile();
    
    115 166
             if (Files.notExists(extraConfigFile.toPath())) {
    
    116
    -            ServerResources.CONFIG.copyResource(extraConfigFile);
    
    117
    -            log.info(String.format("Generate empty configuration file to: %s", extraConfigFile));
    
    167
    +            boolean generated = ServerResources.CONFIG.copyResource(getCommonConfigurationFile().toPath(), extraConfigFile);
    
    168
    +            if (generated) {
    
    169
    +                log.info(String.format("Generate empty configuration file to: %s", extraConfigFile));
    
    170
    +            } else {
    
    171
    +                log.info(String.format("Create symbolic link from common configuration file to: %s", extraConfigFile));
    
    172
    +            }
    
    118 173
             }
    
    119 174
     
    
    120 175
             Path temporaryDirectory = getTemporaryDirectory().toPath();
    
    ... ... @@ -122,7 +177,11 @@ public class ServerConfig extends GeneratedServerConfig implements CleanTemporar
    122 177
     
    
    123 178
             File securityConfigurationFile = getSecurityConfigurationFile();
    
    124 179
             if (!securityConfigurationFile.exists()) {
    
    125
    -            boolean generated = ServerResources.SECURITY.copyResource(getCommonSecurityConfigurationFile().toPath(), securityConfigurationFile);
    
    180
    +            File commonSecurityConfigurationFile = getCommonSecurityConfigurationFile();
    
    181
    +            if (strict && !commonSecurityConfigurationFile.exists()) {
    
    182
    +                throw new IllegalStateException(String.format("Can not start application. Could not find security.yml file.\n\nPlease add it to one of this places:\n\t%s\n\t%s", commonSecurityConfigurationFile, securityConfigurationFile));
    
    183
    +            }
    
    184
    +            boolean generated = ServerResources.SECURITY.copyResource(commonSecurityConfigurationFile.toPath(), securityConfigurationFile);
    
    126 185
                 if (generated) {
    
    127 186
                     log.info("Generate default security.yml");
    
    128 187
                 } else {
    
    ... ... @@ -133,6 +192,15 @@ public class ServerConfig extends GeneratedServerConfig implements CleanTemporar
    133 192
             log.info("ObServe server configuration init done.");
    
    134 193
         }
    
    135 194
     
    
    195
    +    private void parse() {
    
    196
    +        try {
    
    197
    +            get().parse();
    
    198
    +        } catch (ArgumentsParserException e) {
    
    199
    +            throw new ObserveWebApplicationConfigInitException("could not parse configuration", e);
    
    200
    +        }
    
    201
    +
    
    202
    +    }
    
    203
    +
    
    136 204
         private void initLog() {
    
    137 205
             File logFile = getLog4jConfigurationFile();
    
    138 206
             log.info(String.format("Chargement du fichier de log : %s", logFile));
    

  • server/runner/src/main/i18n/translations/server-runner_en_GB.properties
    1 1
     server.config.name=ObServe Web configuration
    
    2 2
     server.config.option.common.directory.config=Common config directory
    
    3
    +server.config.option.common.directory.config.file=Common config file
    
    3 4
     server.config.option.common.directory.config.file.log=Common config log file
    
    4 5
     server.config.option.common.directory.config.file.server=Common config databases file
    
    5 6
     server.config.option.common.directory.instances=Instances directory
    

  • server/runner/src/main/i18n/translations/server-runner_es_ES.properties
    1 1
     server.config.name=Configuración de Observe web
    
    2 2
     server.config.option.common.directory.config=Common directory
    
    3
    +server.config.option.common.directory.config.file=Common config file
    
    3 4
     server.config.option.common.directory.config.file.log=Common config log file
    
    4 5
     server.config.option.common.directory.config.file.server=Common config databases file
    
    5 6
     server.config.option.common.directory.instances=Instances directory
    

  • server/runner/src/main/i18n/translations/server-runner_fr_FR.properties
    1 1
     server.config.name=Observe web Configuration
    
    2 2
     server.config.option.common.directory.config=Répertoire des configurations partagées
    
    3
    +server.config.option.common.directory.config.file=Chemin vers le fichier commun de configuration
    
    3 4
     server.config.option.common.directory.config.file.log=Chemin vers le fichier commun de configuration des logs
    
    4 5
     server.config.option.common.directory.config.file.server=Chemin vers le fichier commun de configuration des bases
    
    5 6
     server.config.option.common.directory.instances=Chemin des instances