Tony CHEMIT pushed to branch develop at ultreiaio / ird-observe Commits: 65625bbb by Tony Chemit at 2022-04-24T11:26:10+02:00 Dans le gestionnaire de connexions, l'onglet serveurs pourrait être le premier - Closes #2286 - - - - - 39d09581 by Tony Chemit at 2022-04-24T11:26:22+02:00 update i18n - - - - - 12bb3774 by Tony Chemit at 2022-04-24T11:59:07+02:00 Erreur non explicitée s'il manque l'information de base par défaut - Closes #2284 - - - - - 762fb804 by Tony Chemit at 2022-04-24T12:42:47+02:00 Libellé sur UI déplacements - Closes #2281 - - - - - 9 changed files: - client/core/src/main/java/fr/ird/observe/client/datasource/presets/RemotePresetsUI.jaxx - client/datasource/editor/api/src/main/i18n/getters/java.getter - core/services/i18n/src/main/i18n/translations/services_en_GB.properties - core/services/i18n/src/main/i18n/translations/services_es_ES.properties - core/services/i18n/src/main/i18n/translations/services_fr_FR.properties - server/configuration/src/main/java/fr/ird/observe/server/configuration/ServerResources.java - server/configuration/src/test/java/fr/ird/observe/dto/server/ServerModelTest.java - + server/configuration/src/test/resources/META-INF/configuration/security-2284-2.yml - + server/configuration/src/test/resources/META-INF/configuration/security-2284.yml Changes: ===================================== client/core/src/main/java/fr/ird/observe/client/datasource/presets/RemotePresetsUI.jaxx ===================================== @@ -28,20 +28,20 @@ <RemotePresetsUIModel id="model" initializer="getContextValue(RemotePresetsUIModel.class)"/> <JTabbedPane id='tabs' constraints='BorderLayout.CENTER'> - <tab id='remoteTab' title="observe.ui.datasource.storage.remote.presets.title"> - <JPanel id="remotePanel" layout="{new BorderLayout()}"> - <JScrollPane id='remoteConfigurationsPane' constraints='BorderLayout.CENTER'> - <JList id='remoteConfigurations' genericType="RemoteDataSourceConfiguration"/> + <tab id='serverTab' title="observe.ui.datasource.storage.server.presets.title"> + <JPanel id="serverPanel" layout="{new BorderLayout()}"> + <JScrollPane id='serverConfigurationsPane' constraints='BorderLayout.CENTER'> + <JList id='serverConfigurations' genericType="ServerDataSourceConfiguration"/> </JScrollPane> - <JPanel id="remoteContentPanel" layout="{new CardLayout()}" constraints='BorderLayout.SOUTH' border='{new TitledBorder("")}'> - <JLabel id="noRemoteSelected" constraints='"empty"'/> - <Table id="remoteForm" constraints='"form"' fill="both"> + <JPanel id="serverContentPanel" layout="{new CardLayout()}" constraints='BorderLayout.SOUTH' border='{new TitledBorder("")}'> + <JLabel id="noServerSelected" constraints='"empty"'/> + <Table id="serverForm" constraints='"form"' fill="both"> <row> <cell anchor='west'> <JLabel text='observe.ui.datasource.storage.remote.name'/> </cell> <cell weightx='1' fill="both" anchor='east'> - <JTextField id="remoteName" onKeyReleased="handler.setRemoteModified(event);"/> + <JTextField id="serverName" onKeyReleased="handler.setServerModified(event);"/> </cell> </row> <row> @@ -49,7 +49,7 @@ <JLabel text='observe.ui.datasource.storage.remote.url'/> </cell> <cell weightx='1' fill="both" anchor='east'> - <JTextField id="remoteUrl" onKeyReleased="handler.setRemoteModified(event);"/> + <JTextField id="serverUrl" onKeyReleased="handler.setServerModified(event);"/> </cell> </row> <row> @@ -57,7 +57,7 @@ <JLabel text='observe.ui.datasource.storage.remote.login'/> </cell> <cell weightx='1' fill="both" anchor='east'> - <JTextField id="remoteLogin" onKeyReleased="handler.setRemoteModified(event);"/> + <JTextField id="serverLogin" onKeyReleased="handler.setServerModified(event);"/> </cell> </row> <row> @@ -65,24 +65,27 @@ <JLabel text='observe.ui.datasource.storage.remote.password'/> </cell> <cell weightx='1' fill="both" anchor='east'> - <JTextField id="remotePassword" onKeyReleased="handler.setRemoteModified(event);"/> + <JTextField id="serverPassword" onKeyReleased="handler.setServerModified(event);"/> </cell> </row> <row> - <cell columns='2'> - <JCheckBox id="remoteUseSsl" onActionPerformed="model.setRemoteModified(true);"/> + <cell anchor='west'> + <JLabel id="serverDataBaseLabel" text='observe.ui.datasource.storage.server.dataBase'/> + </cell> + <cell weightx='1' fill="both" anchor='east'> + <JTextField id="serverDataBase" onKeyReleased="handler.setServerModified(event);"/> </cell> </row> <row> <cell columns='2'> - <JPanel id="remoteActions" layout="{new GridLayout(1, 0)}"> - <JButton id="cancelRemoteAction"/> - <JButton id="resetRemoteAction"/> - <JButton id="saveRemoteAction"/> - <JButton id="deleteRemoteAction"/> - <JButton id="testRemoteAction"/> - <JButton id="duplicateRemoteAction"/> + <JPanel id="serverActions" layout="{new GridLayout(1, 0)}"> + <JButton id="cancelServerAction"/> + <JButton id="resetServerAction"/> + <JButton id="saveServerAction"/> + <JButton id="deleteServerAction"/> + <JButton id="testServerAction"/> + <JButton id="duplicateServerAction"/> </JPanel> </cell> </row> @@ -90,21 +93,20 @@ </JPanel> </JPanel> </tab> - <tab id='serverTab' title="observe.ui.datasource.storage.server.presets.title"> - - <JPanel id="serverPanel" layout="{new BorderLayout()}"> - <JScrollPane id='serverConfigurationsPane' constraints='BorderLayout.CENTER'> - <JList id='serverConfigurations' genericType="ServerDataSourceConfiguration"/> + <tab id='remoteTab' title="observe.ui.datasource.storage.remote.presets.title"> + <JPanel id="remotePanel" layout="{new BorderLayout()}"> + <JScrollPane id='remoteConfigurationsPane' constraints='BorderLayout.CENTER'> + <JList id='remoteConfigurations' genericType="RemoteDataSourceConfiguration"/> </JScrollPane> - <JPanel id="serverContentPanel" layout="{new CardLayout()}" constraints='BorderLayout.SOUTH' border='{new TitledBorder("")}'> - <JLabel id="noServerSelected" constraints='"empty"'/> - <Table id="serverForm" constraints='"form"' fill="both"> + <JPanel id="remoteContentPanel" layout="{new CardLayout()}" constraints='BorderLayout.SOUTH' border='{new TitledBorder("")}'> + <JLabel id="noRemoteSelected" constraints='"empty"'/> + <Table id="remoteForm" constraints='"form"' fill="both"> <row> <cell anchor='west'> <JLabel text='observe.ui.datasource.storage.remote.name'/> </cell> <cell weightx='1' fill="both" anchor='east'> - <JTextField id="serverName" onKeyReleased="handler.setServerModified(event);"/> + <JTextField id="remoteName" onKeyReleased="handler.setRemoteModified(event);"/> </cell> </row> <row> @@ -112,7 +114,7 @@ <JLabel text='observe.ui.datasource.storage.remote.url'/> </cell> <cell weightx='1' fill="both" anchor='east'> - <JTextField id="serverUrl" onKeyReleased="handler.setServerModified(event);"/> + <JTextField id="remoteUrl" onKeyReleased="handler.setRemoteModified(event);"/> </cell> </row> <row> @@ -120,7 +122,7 @@ <JLabel text='observe.ui.datasource.storage.remote.login'/> </cell> <cell weightx='1' fill="both" anchor='east'> - <JTextField id="serverLogin" onKeyReleased="handler.setServerModified(event);"/> + <JTextField id="remoteLogin" onKeyReleased="handler.setRemoteModified(event);"/> </cell> </row> <row> @@ -128,27 +130,23 @@ <JLabel text='observe.ui.datasource.storage.remote.password'/> </cell> <cell weightx='1' fill="both" anchor='east'> - <JTextField id="serverPassword" onKeyReleased="handler.setServerModified(event);"/> + <JTextField id="remotePassword" onKeyReleased="handler.setRemoteModified(event);"/> </cell> </row> <row> - <cell anchor='west'> - <JLabel id="serverDataBaseLabel" text='observe.ui.datasource.storage.server.dataBase'/> - </cell> - <cell weightx='1' fill="both" anchor='east'> - <JTextField id="serverDataBase" onKeyReleased="handler.setServerModified(event);"/> + <cell columns='2'> + <JCheckBox id="remoteUseSsl" onActionPerformed="model.setRemoteModified(true);"/> </cell> </row> - <row> <cell columns='2'> - <JPanel id="serverActions" layout="{new GridLayout(1, 0)}"> - <JButton id="cancelServerAction"/> - <JButton id="resetServerAction"/> - <JButton id="saveServerAction"/> - <JButton id="deleteServerAction"/> - <JButton id="testServerAction"/> - <JButton id="duplicateServerAction"/> + <JPanel id="remoteActions" layout="{new GridLayout(1, 0)}"> + <JButton id="cancelRemoteAction"/> + <JButton id="resetRemoteAction"/> + <JButton id="saveRemoteAction"/> + <JButton id="deleteRemoteAction"/> + <JButton id="testRemoteAction"/> + <JButton id="duplicateRemoteAction"/> </JPanel> </cell> </row> ===================================== client/datasource/editor/api/src/main/i18n/getters/java.getter ===================================== @@ -34,6 +34,7 @@ observe.Common.id observe.Common.label observe.Common.lastUpdateDate observe.Common.list.message.none +observe.Common.navigation.config.groupByName observe.Common.needComment observe.Common.storage.not.valid observe.Common.technicalInformation @@ -165,7 +166,6 @@ observe.ui.action.info.storage observe.ui.action.info.storage.tip observe.ui.action.load.from.file observe.ui.action.load.from.file.tip -observe.ui.action.move.groupBy.configuration observe.ui.action.move.layout.multiple.message observe.ui.action.move.layout.single.message observe.ui.action.move.message ===================================== core/services/i18n/src/main/i18n/translations/services_en_GB.properties ===================================== @@ -1262,14 +1262,14 @@ observe.data.ps.observation.Route.choice.create.fin.veille.activity=Create end a observe.data.ps.observation.Route.choice.not.create.fin.veille.activity.and.continue=do not create end watch activity and continue observe.data.ps.observation.Route.date=Date observe.data.ps.observation.Route.endLogValue=End log value -observe.data.ps.observation.Route.list.navigation.node=Observations -observe.data.ps.observation.Route.list.title=Observations - List of roads +observe.data.ps.observation.Route.list.navigation.node=Onboard observationsOnboard observations +observe.data.ps.observation.Route.list.title=Onboard observations - List of roads observe.data.ps.observation.Route.message.need.fin.veille.activity=No end watch activity was found in route to close.\n You can\:\n\n\t- Close route without creating the end watch activity\n\t- Create and go the end watch activity\n\t- Cancel and go back to route observe.data.ps.observation.Route.message.not.open=Current route is not open, no modification is possible. observe.data.ps.observation.Route.navigation.unsaved=New route observe.data.ps.observation.Route.startLogValue=Start log value -observe.data.ps.observation.Route.title=Route -observe.data.ps.observation.Route.type=Route +observe.data.ps.observation.Route.title=Onboard observations +observe.data.ps.observation.Route.type=Onboard observations observe.data.ps.observation.Route.validation.activityEndOfSearching.notAvailable=There is already an end watch activity on trip. observe.data.ps.observation.Route.validation.date.after.currentPsCommonTrip.startDate=Date (%2$s) must be after trip start date (%1$s). observe.data.ps.observation.Route.validation.invalid.endLogValue.maximum=End log can't be before start log. ===================================== core/services/i18n/src/main/i18n/translations/services_es_ES.properties ===================================== @@ -1262,14 +1262,14 @@ observe.data.ps.observation.Route.choice.create.fin.veille.activity=Crear la act observe.data.ps.observation.Route.choice.not.create.fin.veille.activity.and.continue=No crear la actividad de fin de guardia y continuar observe.data.ps.observation.Route.date=Día de observación observe.data.ps.observation.Route.endLogValue=Corredera de tarde (millas) -observe.data.ps.observation.Route.list.navigation.node=Observations +observe.data.ps.observation.Route.list.navigation.node=Observaciones observe.data.ps.observation.Route.list.title=List of roads \#TODO observe.data.ps.observation.Route.message.need.fin.veille.activity=Ninguna actividad de fin de guardia registrada en la ruta a cerrar.\n Puede \:\n\n\t- Continuar con el cierra de la ruta sin crear la actividad de fin de guardia\n\t- Crear la actividad de fin de guardia e ir a ella\n\t- Cancelar el cierre y continuar con la ruta observe.data.ps.observation.Route.message.not.open=la ruta actual no está abierta, no se pueden hacer modificaciones. observe.data.ps.observation.Route.navigation.unsaved=New ruta observe.data.ps.observation.Route.startLogValue=Corredera de mañana (millas) -observe.data.ps.observation.Route.title=Ruta -observe.data.ps.observation.Route.type=Ruta +observe.data.ps.observation.Route.title=Observaciones +observe.data.ps.observation.Route.type=Observaciones observe.data.ps.observation.Route.validation.activityEndOfSearching.notAvailable=Existe una actividad de fin de guardia en la ruta. observe.data.ps.observation.Route.validation.date.after.currentPsCommonTrip.startDate=El día de observación (%2$s) debe ser superior o igual a la fecha de comienzo de marea (%1$s). observe.data.ps.observation.Route.validation.invalid.endLogValue.maximum=La corredera de tarde no puede ser superior en %1$s a la de mañana. ===================================== core/services/i18n/src/main/i18n/translations/services_fr_FR.properties ===================================== @@ -1262,14 +1262,14 @@ observe.data.ps.observation.Route.choice.create.fin.veille.activity=Créer l'act observe.data.ps.observation.Route.choice.not.create.fin.veille.activity.and.continue=Ne pas créer l'activité de fin de veille et continuer observe.data.ps.observation.Route.date=Jour d'observation observe.data.ps.observation.Route.endLogValue=Loch du soir (milles) -observe.data.ps.observation.Route.list.navigation.node=Observations -observe.data.ps.observation.Route.list.title=Liste des routes +observe.data.ps.observation.Route.list.navigation.node=Observations embarquées +observe.data.ps.observation.Route.list.title=Liste des observations emabrquées observe.data.ps.observation.Route.message.need.fin.veille.activity=Aucune activité de fin de veille enregistrée sur la route à clôturer.\nVous pouvez \:\n\n\t- Continuer la clôture de la route sans créer cette activité de fin de veille\n\t- Créer l'activité de fin de veille et vous y rendre\n\t- Annuler la fermeture et rester sur la route observe.data.ps.observation.Route.message.not.open=La route courante n'est pas ouverte, aucune modification possible. observe.data.ps.observation.Route.navigation.unsaved=Nouvelle route observe.data.ps.observation.Route.startLogValue=Loch du matin (milles) -observe.data.ps.observation.Route.title=Route -observe.data.ps.observation.Route.type=Route +observe.data.ps.observation.Route.title=Observations embarquées +observe.data.ps.observation.Route.type=Observations embarquées observe.data.ps.observation.Route.validation.activityEndOfSearching.notAvailable=Il existe déjà une activité de fin de veille sur la route observe.data.ps.observation.Route.validation.date.after.currentPsCommonTrip.startDate=Le jour d'observation (%2$s) doit être supérieure ou égale à la date de début de la marée (%1$s). observe.data.ps.observation.Route.validation.invalid.endLogValue.maximum=Le loch du soir ne peut pas être supérieur de %1$s à celui du matin. ===================================== server/configuration/src/main/java/fr/ird/observe/server/configuration/ServerResources.java ===================================== @@ -40,7 +40,7 @@ public class ServerResources { public static final ConfigResource2 SECURITY_CONFIGURATION = new ConfigResource2("/META-INF/configuration/security.yml"); public static final ConfigResource2 LOG_CONFIGURATION = new ConfigResource2("/META-INF/configuration/log.xml"); - static class ConfigResource2 extends ConfigResource { + public static class ConfigResource2 extends ConfigResource { private boolean strict; private boolean forWindows; ===================================== server/configuration/src/test/java/fr/ird/observe/dto/server/ServerModelTest.java ===================================== @@ -23,6 +23,7 @@ package fr.ird.observe.dto.server; */ import fr.ird.observe.server.configuration.ServerConfig; +import fr.ird.observe.server.configuration.ServerResources; import org.junit.Assert; import org.junit.Before; import org.junit.Test; @@ -47,6 +48,33 @@ public class ServerModelTest { configuration = ServerConfig.forTest(); } + + @Test + public void testLoad_issue_2284() { + + ServerResources.ConfigResource2 securityConfiguration = new ServerResources.ConfigResource2("/META-INF/configuration/security-2284.yml"); + + String content = String.join("\n", securityConfiguration.readLines()); + ServerModel model = ServerModelHelper.load(content); + try { + ServerModelHelper.validate(model); + Assert.fail("Should have an error"); + } catch (InvalidServerModelException e) { + Assert.assertEquals("Should have found this message error", "Found two default databases: production and test", e.getMessage()); + } + + securityConfiguration = new ServerResources.ConfigResource2("/META-INF/configuration/security-2284-2.yml"); + + content = String.join("\n", securityConfiguration.readLines()); + model = ServerModelHelper.load(content); + try { + ServerModelHelper.validate(model); + Assert.fail("Should have an error"); + } catch (InvalidServerModelException e) { + Assert.assertEquals("Should have found this message error", "No default databases defined", e.getMessage()); + } + } + @Test public void testLoad() throws Exception { ===================================== server/configuration/src/test/resources/META-INF/configuration/security-2284-2.yml ===================================== @@ -0,0 +1,42 @@ +roles: + - &role-admin + password: a + - &role-technicien + password: a + - &role-referentiel + password: a + - &role-test + password: a +databases: + - &db-production + url: jdbc:postgresql://localhost:5432/obstuna-production + roles: + - *role-admin + - *role-technicien + - *role-referentiel + - &db-test + url: jdbc:postgresql://localhost:5432/obstuna-test + roles: + - *role-admin + - *role-technicien + - *role-referentiel + - *role-test +users: + - login: utilisateur-technicien + password: a + permissions: + - database: *db-production + role: *role-technicien + apiAccess: ALL + validationMode: STRONG + - database: *db-test + role: *role-technicien + apiAccess: PUBLIC + validationMode: PERMISSIVE + - login: utilisateur-referentiel + password: a + permissions: + - database: *db-production + role: *role-referentiel + apiAccess: CLIENT + validationMode: NONE ===================================== server/configuration/src/test/resources/META-INF/configuration/security-2284.yml ===================================== @@ -0,0 +1,44 @@ +roles: + - &role-admin + password: a + - &role-technicien + password: a + - &role-referentiel + password: a + - &role-test + password: a +databases: + - &db-production + url: jdbc:postgresql://localhost:5432/obstuna-production + defaultDatabase: true + roles: + - *role-admin + - *role-technicien + - *role-referentiel + - &db-test + url: jdbc:postgresql://localhost:5432/obstuna-test + defaultDatabase: true + roles: + - *role-admin + - *role-technicien + - *role-referentiel + - *role-test +users: + - login: utilisateur-technicien + password: a + permissions: + - database: *db-production + role: *role-technicien + apiAccess: ALL + validationMode: STRONG + - database: *db-test + role: *role-technicien + apiAccess: PUBLIC + validationMode: PERMISSIVE + - login: utilisateur-referentiel + password: a + permissions: + - database: *db-production + role: *role-referentiel + apiAccess: CLIENT + validationMode: NONE View it on GitLab: https://gitlab.com/ultreiaio/ird-observe/-/compare/2376af0a38b08350d2c33e3e6... -- View it on GitLab: https://gitlab.com/ultreiaio/ird-observe/-/compare/2376af0a38b08350d2c33e3e6... You're receiving this email because of your account on gitlab.com.