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

Commits:

26 changed files:

Changes:

  • client/core/src/main/java/fr/ird/observe/client/datasource/api/ObserveSwingDataSource.java
    ... ... @@ -509,7 +509,7 @@ public class ObserveSwingDataSource extends AbstractJavaBean implements ObserveS
    509 509
                 Files.deleteIfExists(dst);
    
    510 510
                 CreateDatabaseRequest request = CreateDatabaseRequest.builder(false, config.getModelVersion()).addGeneratedSchema().addStandaloneTables().addAllData().build();
    
    511 511
                 SqlScript dataDump = getDataSourceService().produceCreateSqlScript(request);
    
    512
    -            dataDump.copy(dst);
    
    512
    +            dataDump.copyAndCompress(dst);
    
    513 513
             } catch (Exception e) {
    
    514 514
                 throw new ObserveSwingTechnicalException(e);
    
    515 515
             }
    

  • client/datasource/actions/pom.xml
    ... ... @@ -160,6 +160,10 @@
    160 160
           <groupId>org.apache.logging.log4j</groupId>
    
    161 161
           <artifactId>log4j-api</artifactId>
    
    162 162
         </dependency>
    
    163
    +    <dependency>
    
    164
    +      <groupId>org.swinglabs</groupId>
    
    165
    +      <artifactId>jxlayer</artifactId>
    
    166
    +    </dependency>
    
    163 167
         <dependency>
    
    164 168
           <groupId>org.swinglabs.swingx</groupId>
    
    165 169
           <artifactId>swingx-core</artifactId>
    

  • client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/save/actions/Start.java
    ... ... @@ -90,7 +90,7 @@ public class Start extends SaveLocalUIActionSupport {
    90 90
                 DataSourceService dumpService = source.getDataSourceService();
    
    91 91
                 CreateDatabaseRequest request = CreateDatabaseRequest.builder(false, source.getVersion()).addGeneratedSchema().addStandaloneTables().addAllData().build();
    
    92 92
                 SqlScript dump = dumpService.produceCreateSqlScript(request);
    
    93
    -            dump.copy(backupFile.toPath());
    
    93
    +            dump.copyAndCompress(backupFile.toPath());
    
    94 94
             }
    
    95 95
     
    
    96 96
             if (stepModel.containsStepForSave(AdminStep.SYNCHRONIZE)) {
    

  • client/datasource/editor/api/pom.xml
    ... ... @@ -168,6 +168,10 @@
    168 168
           <groupId>org.geotools</groupId>
    
    169 169
           <artifactId>gt-main</artifactId>
    
    170 170
         </dependency>
    
    171
    +    <dependency>
    
    172
    +      <groupId>org.geotools</groupId>
    
    173
    +      <artifactId>gt-metadata</artifactId>
    
    174
    +    </dependency>
    
    171 175
         <dependency>
    
    172 176
           <groupId>org.geotools</groupId>
    
    173 177
           <artifactId>gt-opengis</artifactId>
    

  • client/datasource/editor/api/src/main/i18n/getters/java.getter
    ... ... @@ -84,6 +84,9 @@ observe.referential.Referential.action.delete.tip
    84 84
     observe.referential.Referential.action.detail
    
    85 85
     observe.referential.Referential.action.modify
    
    86 86
     observe.referential.Referential.action.openType
    
    87
    +observe.referential.Referential.action.replaceUsages
    
    88
    +observe.referential.Referential.action.replaceUsages.no.data.usage
    
    89
    +observe.referential.Referential.action.replaceUsages.tip
    
    87 90
     observe.referential.Referential.action.show.usages.tip
    
    88 91
     observe.referential.Referential.code
    
    89 92
     observe.referential.Referential.disabled
    
    ... ... @@ -282,11 +285,13 @@ observe.ui.message.quit.valid.edit
    282 285
     observe.ui.message.show.referential.usages
    
    283 286
     observe.ui.message.show.usage.referential.delete
    
    284 287
     observe.ui.message.show.usage.referential.disabled
    
    288
    +observe.ui.message.show.usage.referential.replace
    
    285 289
     observe.ui.message.table.editBean.modified
    
    286 290
     observe.ui.message.table.editBean.modified.but.invalid
    
    287 291
     observe.ui.move.selectTarget
    
    288 292
     observe.ui.title.can.not.delete.referential
    
    289 293
     observe.ui.title.can.not.export.obstuna
    
    294
    +observe.ui.title.can.not.replace.referential
    
    290 295
     observe.ui.title.choose.avdth.file
    
    291 296
     observe.ui.title.choose.db.dump
    
    292 297
     observe.ui.title.choose.db.dump.directory
    

  • client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/ObserveKeyStrokesEditorApi.java
    ... ... @@ -101,7 +101,8 @@ public class ObserveKeyStrokesEditorApi extends ObserveKeyStrokesSupport {
    101 101
         public static final KeyStroke KEY_STROKE_CHANGE_ID = KeyStroke.getKeyStroke("pressed F7");
    
    102 102
     
    
    103 103
         public static final KeyStroke KEY_STROKE_SHOW_TECHNICAL_INFORMATION = KeyStroke.getKeyStroke("pressed F10");
    
    104
    -    public static final KeyStroke KEY_STROKE_SHOW_USAGES = KeyStroke.getKeyStroke("pressed F8");
    
    104
    +    public static final KeyStroke KEY_STROKE_REPLACE_REFERENTIAL = KeyStroke.getKeyStroke("pressed F8");
    
    105
    +    public static final KeyStroke KEY_STROKE_SHOW_USAGES = KeyStroke.getKeyStroke("pressed F9");
    
    105 106
         public static final KeyStroke KEY_STROKE_SHOW_UNIQUE_KEYS = KeyStroke.getKeyStroke("pressed F9");
    
    106 107
     
    
    107 108
         public static final KeyStroke KEY_STROKE_SELECT_TARGET = KeyStroke.getKeyStroke("pressed F2");
    

  • client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/content/referential/ContentReferentialUI.jaxx
    ... ... @@ -19,43 +19,43 @@
    19 19
       -->
    
    20 20
     
    
    21 21
     <fr.ird.observe.client.datasource.editor.api.content.ContentUI
    
    22
    -    abstract='true'
    
    23
    -    beanScope="bean"
    
    24
    -    i18n="fr.ird.observe.dto.referential.ReferentialDto"
    
    25
    -    genericType='D extends ReferentialDto, R extends ReferentialDtoReference, U extends ContentReferentialUI&lt;D, R, U&gt;'
    
    26
    -    implements="fr.ird.observe.client.datasource.editor.api.content.EditableContentUI&lt;D&gt;">
    
    27
    -  <import>
    
    28
    -    fr.ird.observe.dto.referential.ReferentialDto
    
    29
    -    fr.ird.observe.dto.reference.ReferentialDtoReference
    
    30
    -    fr.ird.observe.dto.referential.ReferenceStatus
    
    31
    -    fr.ird.observe.client.util.UIHelper
    
    32
    -    fr.ird.observe.client.util.ObserveBlockingLayerUI
    
    33
    -    fr.ird.observe.client.datasource.validation.ObserveSwingValidator
    
    34
    -
    
    35
    -    org.nuiton.jaxx.widgets.text.NormalTextEditor
    
    36
    -    org.nuiton.jaxx.validator.swing.SwingValidator
    
    37
    -    io.ultreia.java4all.jaxx.widgets.choice.BeanCheckBox
    
    38
    -    io.ultreia.java4all.jaxx.widgets.combobox.BeanEnumEditor
    
    39
    -
    
    40
    -    io.ultreia.java4all.jaxx.widgets.list.ListHeader
    
    41
    -
    
    42
    -    javax.swing.DefaultListModel
    
    43
    -    javax.swing.ListSelectionModel
    
    44
    -    javax.swing.JTable
    
    45
    -    javax.swing.JTextField
    
    46
    -    javax.swing.UIManager
    
    47
    -    javax.swing.table.TableCellRenderer
    
    48
    -
    
    49
    -    static io.ultreia.java4all.i18n.I18n.t
    
    50
    -  </import>
    
    51
    -
    
    52
    -  <ContentReferentialUIModel id='model' genericType='D, R'/>
    
    53
    -  <ContentReferentialUIModelStates id='states' genericType='D, R'/>
    
    54
    -  <ReferentialDto id='bean' initializer='getStates().getBean()'/>
    
    55
    -  <ObserveBlockingLayerUI id='editKeyTableLayerUI' styleClass="blockBlockLayerUI"/>
    
    56
    -  <CardLayout2Ext id='viewLayout' constructorParams='this, "contentBody"'/>
    
    57
    -
    
    58
    -  <script><![CDATA[
    
    22
    +        abstract='true'
    
    23
    +        beanScope="bean"
    
    24
    +        i18n="fr.ird.observe.dto.referential.ReferentialDto"
    
    25
    +        genericType='D extends ReferentialDto, R extends ReferentialDtoReference, U extends ContentReferentialUI&lt;D, R, U&gt;'
    
    26
    +        implements="fr.ird.observe.client.datasource.editor.api.content.EditableContentUI&lt;D&gt;">
    
    27
    +    <import>
    
    28
    +        fr.ird.observe.dto.referential.ReferentialDto
    
    29
    +        fr.ird.observe.dto.reference.ReferentialDtoReference
    
    30
    +        fr.ird.observe.dto.referential.ReferenceStatus
    
    31
    +        fr.ird.observe.client.util.UIHelper
    
    32
    +        fr.ird.observe.client.util.ObserveBlockingLayerUI
    
    33
    +        fr.ird.observe.client.datasource.validation.ObserveSwingValidator
    
    34
    +
    
    35
    +        org.nuiton.jaxx.widgets.text.NormalTextEditor
    
    36
    +        org.nuiton.jaxx.validator.swing.SwingValidator
    
    37
    +        io.ultreia.java4all.jaxx.widgets.choice.BeanCheckBox
    
    38
    +        io.ultreia.java4all.jaxx.widgets.combobox.BeanEnumEditor
    
    39
    +
    
    40
    +        io.ultreia.java4all.jaxx.widgets.list.ListHeader
    
    41
    +
    
    42
    +        javax.swing.DefaultListModel
    
    43
    +        javax.swing.ListSelectionModel
    
    44
    +        javax.swing.JTable
    
    45
    +        javax.swing.JTextField
    
    46
    +        javax.swing.UIManager
    
    47
    +        javax.swing.table.TableCellRenderer
    
    48
    +
    
    49
    +        static io.ultreia.java4all.i18n.I18n.t
    
    50
    +    </import>
    
    51
    +
    
    52
    +    <ContentReferentialUIModel id='model' genericType='D, R'/>
    
    53
    +    <ContentReferentialUIModelStates id='states' genericType='D, R'/>
    
    54
    +    <ReferentialDto id='bean' initializer='getStates().getBean()'/>
    
    55
    +    <ObserveBlockingLayerUI id='editKeyTableLayerUI' styleClass="blockBlockLayerUI"/>
    
    56
    +    <CardLayout2Ext id='viewLayout' constructorParams='this, "contentBody"'/>
    
    57
    +
    
    58
    +    <script><![CDATA[
    
    59 59
     
    
    60 60
     public static final String LIST_VIEW = "listView";
    
    61 61
     
    
    ... ... @@ -87,110 +87,114 @@ viewLayout.addLayoutComponent(editView, DETAIL_VIEW);
    87 87
     
    
    88 88
     ]]></script>
    
    89 89
     
    
    90
    -  <JPanel id="contentBody" layout="{viewLayout}">
    
    90
    +    <JPanel id="contentBody" layout="{viewLayout}">
    
    91 91
     
    
    92
    -    <JPanel id="listView" constraints="LIST_VIEW" layout="{new BorderLayout()}">
    
    93
    -      <JScrollPane id='listPane' constraints='BorderLayout.CENTER' columnHeaderView='{referentialListHeader}' decorator="boxed">
    
    94
    -        <JList id='list' genericType='R'/>
    
    95
    -        <ListHeader id='referentialListHeader' genericType='R' constructorParams="list"/>
    
    96
    -      </JScrollPane>
    
    97
    -    </JPanel>
    
    92
    +        <JPanel id="listView" constraints="LIST_VIEW" layout="{new BorderLayout()}">
    
    93
    +            <JScrollPane id='listPane' constraints='BorderLayout.CENTER' columnHeaderView='{referentialListHeader}'
    
    94
    +                         decorator="boxed">
    
    95
    +                <JList id='list' genericType='R'/>
    
    96
    +                <ListHeader id='referentialListHeader' genericType='R' constructorParams="list"/>
    
    97
    +            </JScrollPane>
    
    98
    +        </JPanel>
    
    98 99
     
    
    99
    -    <Table id="editView" insets="0" weightx="1" fill="both" constraints="DETAIL_VIEW">
    
    100
    -      <row>
    
    101
    -        <cell anchor='north'>
    
    102
    -          <Table id='editTable'>
    
    100
    +        <Table id="editView" insets="0" weightx="1" fill="both" constraints="DETAIL_VIEW">
    
    103 101
                 <row>
    
    104
    -              <cell anchor="west">
    
    105
    -                <JLabel id='codeAndHomeIdLabel'/>
    
    106
    -              </cell>
    
    107
    -              <cell anchor='east' weightx="1" fill="both">
    
    108
    -                <JPanel id='codeAndHomeIdPanel' layout='{new GridLayout()}'>
    
    109
    -                  <NormalTextEditor id='code' decorator="boxed"/>
    
    110
    -                  <NormalTextEditor id='homeId' decorator="boxed"/>
    
    111
    -                </JPanel>
    
    112
    -              </cell>
    
    102
    +                <cell anchor='north'>
    
    103
    +                    <Table id='editTable'>
    
    104
    +                        <row>
    
    105
    +                            <cell anchor="west">
    
    106
    +                                <JLabel id='codeAndHomeIdLabel'/>
    
    107
    +                            </cell>
    
    108
    +                            <cell anchor='east' weightx="1" fill="both">
    
    109
    +                                <JPanel id='codeAndHomeIdPanel' layout='{new GridLayout()}'>
    
    110
    +                                    <NormalTextEditor id='code' decorator="boxed"/>
    
    111
    +                                    <NormalTextEditor id='homeId' decorator="boxed"/>
    
    112
    +                                </JPanel>
    
    113
    +                            </cell>
    
    114
    +                        </row>
    
    115
    +                        <row>
    
    116
    +                            <cell anchor="west">
    
    117
    +                                <JLabel id='statusLabel'/>
    
    118
    +                            </cell>
    
    119
    +                            <cell anchor='east' weightx="1" fill="both">
    
    120
    +                                <JPanel id='statusAndNeedCommentPanel' layout='{new GridLayout()}'>
    
    121
    +                                    <BeanEnumEditor id='status' constructorParams='ReferenceStatus.class'
    
    122
    +                                                    genericType='ReferenceStatus' decorator="boxed"/>
    
    123
    +                                    <JPanel id='needCommentPanel' layout='{new BorderLayout()}'>
    
    124
    +                                        <JLabel id='needCommentLabel' constraints="BorderLayout.WEST"/>
    
    125
    +                                        <BeanCheckBox id='needComment' decorator="boxed"
    
    126
    +                                                      constraints="BorderLayout.EAST"/>
    
    127
    +                                    </JPanel>
    
    128
    +                                </JPanel>
    
    129
    +                            </cell>
    
    130
    +                        </row>
    
    131
    +                        <row>
    
    132
    +                            <cell anchor='west'>
    
    133
    +                                <JLabel id='uriLabel'/>
    
    134
    +                            </cell>
    
    135
    +                            <cell anchor='east' weightx="1" fill="both">
    
    136
    +                                <NormalTextEditor id='uri' decorator="boxed"/>
    
    137
    +                            </cell>
    
    138
    +                        </row>
    
    139
    +                    </Table>
    
    140
    +                </cell>
    
    113 141
                 </row>
    
    114 142
                 <row>
    
    115
    -              <cell anchor="west">
    
    116
    -                <JLabel id='statusLabel'/>
    
    117
    -              </cell>
    
    118
    -              <cell anchor='east' weightx="1" fill="both">
    
    119
    -                <JPanel id='statusAndNeedCommentPanel' layout='{new GridLayout()}'>
    
    120
    -                  <BeanEnumEditor id='status' constructorParams='ReferenceStatus.class' genericType='ReferenceStatus' decorator="boxed"/>
    
    121
    -                  <JPanel id='needCommentPanel' layout='{new BorderLayout()}'>
    
    122
    -                    <JLabel id='needCommentLabel' constraints="BorderLayout.WEST"/>
    
    123
    -                    <BeanCheckBox id='needComment' decorator="boxed" constraints="BorderLayout.EAST"/>
    
    124
    -                  </JPanel>
    
    125
    -                </JPanel>
    
    126
    -              </cell>
    
    143
    +                <cell anchor='north'>
    
    144
    +                    <Table id='editExtraTable' fill='both'/>
    
    145
    +                </cell>
    
    127 146
                 </row>
    
    128 147
                 <row>
    
    129
    -              <cell anchor='west'>
    
    130
    -                <JLabel id='uriLabel'/>
    
    131
    -              </cell>
    
    132
    -              <cell anchor='east' weightx="1" fill="both">
    
    133
    -                <NormalTextEditor id='uri' decorator="boxed"/>
    
    134
    -              </cell>
    
    148
    +                <cell anchor='north'>
    
    149
    +                    <Table id='editI18nTable' fill='both'/>
    
    150
    +                </cell>
    
    135 151
                 </row>
    
    136
    -          </Table>
    
    137
    -        </cell>
    
    138
    -      </row>
    
    139
    -      <row>
    
    140
    -        <cell anchor='north'>
    
    141
    -          <Table id='editExtraTable' fill='both'/>
    
    142
    -        </cell>
    
    143
    -      </row>
    
    144
    -      <row>
    
    145
    -        <cell anchor='north'>
    
    146
    -          <Table id='editI18nTable' fill='both'/>
    
    147
    -        </cell>
    
    148
    -      </row>
    
    149
    -      <row>
    
    150
    -        <cell anchor='north' weighty="1">
    
    151
    -          <Table id='editMoreExtraTable' fill='both'>
    
    152 152
                 <row>
    
    153
    -              <cell>
    
    154
    -                <JLabel styleClass="skipI18n"/>
    
    155
    -              </cell>
    
    153
    +                <cell anchor='north' weighty="1">
    
    154
    +                    <Table id='editMoreExtraTable' fill='both'>
    
    155
    +                        <row>
    
    156
    +                            <cell>
    
    157
    +                                <JLabel styleClass="skipI18n"/>
    
    158
    +                            </cell>
    
    159
    +                        </row>
    
    160
    +                    </Table>
    
    161
    +                </cell>
    
    156 162
                 </row>
    
    157
    -          </Table>
    
    158
    -        </cell>
    
    159
    -      </row>
    
    160
    -    </Table>
    
    161
    -  </JPanel>
    
    162
    -  <Table id='actions' fill='both' weightx='1' insets='0'>
    
    163
    -    <row>
    
    164
    -      <cell>
    
    165
    -        <JPanel id="listActions" layout="{new GridLayout(1, 0)}">
    
    166
    -          <JButton id='modify'/>
    
    167
    -          <JButton id='detail'/>
    
    168
    -        </JPanel>
    
    169
    -      </cell>
    
    170
    -    </row>
    
    171
    -    <row>
    
    172
    -      <cell>
    
    173
    -        <Table id="detailActions" fill='both' insets="1,4,1,1">
    
    174
    -          <row>
    
    175
    -            <cell fill="both" weightx="1">
    
    176
    -              <JPanel id="detailRealActions" layout="{new GridLayout(1, 0)}">
    
    177
    -                <JButton id='reset'/>
    
    178
    -                <JButton id='save'/>
    
    179
    -              </JPanel>
    
    163
    +        </Table>
    
    164
    +    </JPanel>
    
    165
    +    <Table id='actions' fill='both' weightx='1' insets='0'>
    
    166
    +        <row>
    
    167
    +            <cell>
    
    168
    +                <JPanel id="listActions" layout="{new GridLayout(1, 0)}">
    
    169
    +                    <JButton id='modify'/>
    
    170
    +                    <JButton id='detail'/>
    
    171
    +                </JPanel>
    
    180 172
                 </cell>
    
    181
    -          </row>
    
    182
    -          <row>
    
    183
    -            <cell fill="both" weightx="1">
    
    184
    -              <JButton id='backToList'/>
    
    173
    +        </row>
    
    174
    +        <row>
    
    175
    +            <cell>
    
    176
    +                <Table id="detailActions" fill='both' insets="1,4,1,1">
    
    177
    +                    <row>
    
    178
    +                        <cell fill="both" weightx="1">
    
    179
    +                            <JPanel id="detailRealActions" layout="{new GridLayout(1, 0)}">
    
    180
    +                                <JButton id='reset'/>
    
    181
    +                                <JButton id='save'/>
    
    182
    +                            </JPanel>
    
    183
    +                        </cell>
    
    184
    +                    </row>
    
    185
    +                    <row>
    
    186
    +                        <cell fill="both" weightx="1">
    
    187
    +                            <JButton id='backToList'/>
    
    188
    +                        </cell>
    
    189
    +                    </row>
    
    190
    +                </Table>
    
    185 191
                 </cell>
    
    186
    -          </row>
    
    187
    -        </Table>
    
    188
    -      </cell>
    
    189
    -    </row>
    
    190
    -  </Table>
    
    191
    -  <JMenuItem id='delete'/>
    
    192
    -  <JMenuItem id='showTechnicalInformations'/>
    
    193
    -  <JMenuItem id='changeId'/>
    
    194
    -  <JMenuItem id="showUsages"/>
    
    195
    -  <JMenuItem id='create'/>
    
    192
    +        </row>
    
    193
    +    </Table>
    
    194
    +    <JMenuItem id='delete'/>
    
    195
    +    <JMenuItem id='showTechnicalInformations'/>
    
    196
    +    <JMenuItem id='replaceUsages'/>
    
    197
    +    <JMenuItem id='changeId'/>
    
    198
    +    <JMenuItem id="showUsages"/>
    
    199
    +    <JMenuItem id='create'/>
    
    196 200
     </fr.ird.observe.client.datasource.editor.api.content.ContentUI>

  • client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/content/referential/ContentReferentialUIHandler.java
    ... ... @@ -39,6 +39,7 @@ import fr.ird.observe.client.datasource.editor.api.content.referential.actions.D
    39 39
     import fr.ird.observe.client.datasource.editor.api.content.referential.actions.DetailReferential;
    
    40 40
     import fr.ird.observe.client.datasource.editor.api.content.referential.actions.ModifyReferential;
    
    41 41
     import fr.ird.observe.client.datasource.editor.api.content.referential.actions.ReferentialResetAdapter;
    
    42
    +import fr.ird.observe.client.datasource.editor.api.content.referential.actions.ReplaceReferentialUsages;
    
    42 43
     import fr.ird.observe.client.datasource.editor.api.content.referential.actions.SaveContentReferentialUIAdapter;
    
    43 44
     import fr.ird.observe.client.datasource.editor.api.content.referential.actions.ShowUsagesReferential;
    
    44 45
     import fr.ird.observe.client.util.UIHelper;
    
    ... ... @@ -168,6 +169,7 @@ public class ContentReferentialUIHandler<D extends ReferentialDto, R extends Ref
    168 169
             DetailReferential.installAction(ui);
    
    169 170
             DeleteReferential.installAction(ui);
    
    170 171
             ChangeId.installAction(ui);
    
    172
    +        ReplaceReferentialUsages.installAction(ui);
    
    171 173
             ui.getConfigurePopup().addSeparator();
    
    172 174
             ShowUsagesReferential.installAction(ui);
    
    173 175
             ShowTechnicalInformations.installAction(ui);
    

  • client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/content/referential/actions/ReplaceReferentialUsages.java
    1
    +package fr.ird.observe.client.datasource.editor.api.content.referential.actions;
    
    2
    +
    
    3
    +/*-
    
    4
    + * #%L
    
    5
    + * ObServe Client :: DataSource :: Editor :: API
    
    6
    + * %%
    
    7
    + * Copyright (C) 2008 - 2023 IRD, 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 fr.ird.observe.client.datasource.api.ObserveSwingDataSource;
    
    26
    +import fr.ird.observe.client.datasource.editor.api.ObserveKeyStrokesEditorApi;
    
    27
    +import fr.ird.observe.client.datasource.editor.api.content.actions.ConfigureMenuAction;
    
    28
    +import fr.ird.observe.client.datasource.editor.api.content.referential.ContentReferentialUI;
    
    29
    +import fr.ird.observe.client.datasource.editor.api.content.referential.ContentReferentialUIModel;
    
    30
    +import fr.ird.observe.client.datasource.editor.api.content.referential.ContentReferentialUIModelStates;
    
    31
    +import fr.ird.observe.client.datasource.editor.api.content.referential.usage.UsageForReplaceUIHandler;
    
    32
    +import fr.ird.observe.dto.I18nDecoratorHelper;
    
    33
    +import fr.ird.observe.dto.ToolkitIdDtoBean;
    
    34
    +import fr.ird.observe.dto.ToolkitIdLabel;
    
    35
    +import fr.ird.observe.dto.reference.ReferentialDtoReference;
    
    36
    +import fr.ird.observe.dto.referential.ReferentialDto;
    
    37
    +import fr.ird.observe.services.service.UsageCount;
    
    38
    +import fr.ird.observe.services.service.UsageService;
    
    39
    +import io.ultreia.java4all.i18n.I18n;
    
    40
    +import org.apache.commons.lang3.tuple.Pair;
    
    41
    +import org.apache.logging.log4j.LogManager;
    
    42
    +import org.apache.logging.log4j.Logger;
    
    43
    +
    
    44
    +import javax.swing.JOptionPane;
    
    45
    +import java.awt.event.ActionEvent;
    
    46
    +import java.util.List;
    
    47
    +import java.util.stream.Collectors;
    
    48
    +
    
    49
    +import static io.ultreia.java4all.i18n.I18n.n;
    
    50
    +
    
    51
    +/**
    
    52
    + * To replace referential usages by another one.
    
    53
    + * Created on 20/05/2023.
    
    54
    + *
    
    55
    + * @author Tony Chemit - dev@tchemit.fr
    
    56
    + * @since 9.1.4
    
    57
    + */
    
    58
    +public class ReplaceReferentialUsages<D extends ReferentialDto, R extends ReferentialDtoReference, U extends ContentReferentialUI<D, R, U>> extends ContentReferentialUIActionSupport<D, R, U> implements ConfigureMenuAction<U> {
    
    59
    +
    
    60
    +    private static final Logger log = LogManager.getLogger(DeleteReferential.class);
    
    61
    +
    
    62
    +    private ToolkitIdLabel replaceReference;
    
    63
    +
    
    64
    +    public ReplaceReferentialUsages(Class<D> dataType) {
    
    65
    +        super(dataType, n("observe.referential.Referential.action.replaceUsages"), I18n.t("observe.referential.Referential.action.replaceUsages.tip", I18nDecoratorHelper.getType(dataType)), "move", ObserveKeyStrokesEditorApi.KEY_STROKE_REPLACE_REFERENTIAL);
    
    66
    +    }
    
    67
    +
    
    68
    +    public static <D extends ReferentialDto, R extends ReferentialDtoReference, U extends ContentReferentialUI<D, R, U>> void installAction(U ui) {
    
    69
    +        ReplaceReferentialUsages<D, R, U> action = new ReplaceReferentialUsages<>(ui.getModel().getScope().getMainType());
    
    70
    +        init(ui, ui.getReplaceUsages(), action);
    
    71
    +        ui.getModel().getStates().addPropertyChangeListener(ContentReferentialUIModelStates.PROPERTY_SELECTED_BEAN_REFERENCE, evt -> {
    
    72
    +            ReferentialDtoReference newValue = (ReferentialDtoReference) evt.getNewValue();
    
    73
    +            ObserveSwingDataSource mainDataSource = ui.getModel().getDataSourcesManager().getMainDataSource();
    
    74
    +            action.setEnabled(newValue != null && (mainDataSource.isLocal() || mainDataSource.canWriteData()));
    
    75
    +        });
    
    76
    +    }
    
    77
    +
    
    78
    +    @Override
    
    79
    +    protected void doActionPerformed(ActionEvent event, U ui) {
    
    80
    +        ContentReferentialUIModel<D, R> model = ui.getModel();
    
    81
    +        R selectedBeanReference = model.getStates().getSelectedBeanReference();
    
    82
    +        askToReplace(ui, selectedBeanReference);
    
    83
    +        if (replaceReference != null) {
    
    84
    +            doReplace(ui, selectedBeanReference, replaceReference);
    
    85
    +        }
    
    86
    +    }
    
    87
    +
    
    88
    +    private void askToReplace(U ui, R bean) {
    
    89
    +
    
    90
    +        ContentReferentialUIModel<D, R> model = ui.getModel();
    
    91
    +
    
    92
    +        // recherche des utilisation du bean dans la base
    
    93
    +        UsageService usageService = getServicesProvider().getUsageService();
    
    94
    +        ToolkitIdDtoBean request = model.getStates().toUsageRequest(bean.getId());
    
    95
    +        UsageCount usages = usageService.countReferentialInData(request);
    
    96
    +        replaceReference = null;
    
    97
    +
    
    98
    +        Class<D> beanType = model.getScope().getMainType();
    
    99
    +        Class<R> referenceType = model.getScope().getMainReferenceType();
    
    100
    +        if (usages.isEmpty()) {
    
    101
    +            JOptionPane.showMessageDialog(getMainUI(), I18n.t("observe.referential.Referential.action.replaceUsages.no.data.usage", bean));
    
    102
    +            return;
    
    103
    +        }
    
    104
    +
    
    105
    +        // some usages were found
    
    106
    +
    
    107
    +        // get replacements
    
    108
    +        List<R> referentialReferences = ui.getHandler().getReferentialReferences(referenceType);
    
    109
    +        List<R> referenceList = referentialReferences
    
    110
    +                .stream()
    
    111
    +                .filter(ReferentialDtoReference::isEnabled)
    
    112
    +                .filter(r -> !bean.getId().equals(r.getId()))
    
    113
    +                .collect(Collectors.toList());
    
    114
    +
    
    115
    +        ToolkitIdLabel dtoToReplaceLabel = bean.toLabel();
    
    116
    +        getDecoratorService().installToolkitIdLabelDecorator(beanType, dtoToReplaceLabel);
    
    117
    +        Pair<Boolean, ToolkitIdLabel> result = UsageForReplaceUIHandler.showUsages(usageService, dtoToReplaceLabel, request, usages, referenceList.stream().map(ReferentialDtoReference::toLabel).collect(Collectors.toList()));
    
    118
    +        Boolean canContinue = result.getLeft();
    
    119
    +        if (!canContinue) {
    
    120
    +            log.debug("user refuse to continue");
    
    121
    +            return;
    
    122
    +        }
    
    123
    +
    
    124
    +        replaceReference = result.getRight();
    
    125
    +        if (replaceReference == null) {
    
    126
    +            log.debug("user did not select replace");
    
    127
    +        }
    
    128
    +    }
    
    129
    +
    
    130
    +    private void doReplace(U ui, ReferentialDtoReference bean, ToolkitIdLabel replaceReference) {
    
    131
    +
    
    132
    +        String id = bean.getId();
    
    133
    +        Class<D> beanType = ui.getModel().getScope().getMainType();
    
    134
    +        if (replaceReference == null) {
    
    135
    +            return;
    
    136
    +        }
    
    137
    +        String replaceId = replaceReference.getId();
    
    138
    +        log.info(String.format("Do replace reference (%s → %s)", id, replaceId));
    
    139
    +        getServicesProvider().getReferentialService().replaceReferenceInData(beanType, id, replaceId);
    
    140
    +    }
    
    141
    +
    
    142
    +}

  • client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/content/referential/usage/UsageForReplaceUI.jaxx
    1
    +<!--
    
    2
    +  #%L
    
    3
    +  ObServe Client :: DataSource :: Editor :: API
    
    4
    +  %%
    
    5
    +  Copyright (C) 2008 - 2023 IRD, Ultreia.io
    
    6
    +  %%
    
    7
    +  This program is free software: you can redistribute it and/or modify
    
    8
    +  it under the terms of the GNU General Public License as
    
    9
    +  published by the Free Software Foundation, either version 3 of the
    
    10
    +  License, or (at your option) any later version.
    
    11
    +  This program is distributed in the hope that it will be useful,
    
    12
    +  but WITHOUT ANY WARRANTY; without even the implied warranty of
    
    13
    +  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    
    14
    +  GNU General Public License for more details.
    
    15
    +  You should have received a copy of the GNU General Public
    
    16
    +  License along with this program.  If not, see
    
    17
    +  <http://www.gnu.org/licenses/gpl-3.0.html>.
    
    18
    +  #L%
    
    19
    +  -->
    
    20
    +<org.jdesktop.swingx.JXTitledPanel id="usagesPane" contentContainer='{internalContent}'>
    
    21
    +    <JPanel id="internalContent" layout='{new BorderLayout()}'>
    
    22
    +
    
    23
    +        <import>
    
    24
    +
    
    25
    +            fr.ird.observe.dto.ToolkitIdLabel
    
    26
    +            fr.ird.observe.client.datasource.usage.UsagesGetter
    
    27
    +            fr.ird.observe.client.datasource.usage.UsagePanel
    
    28
    +            org.nuiton.jaxx.runtime.context.JAXXInitialContext
    
    29
    +            io.ultreia.java4all.jaxx.widgets.combobox.FilterableComboBox
    
    30
    +            java.util.List
    
    31
    +
    
    32
    +            static io.ultreia.java4all.i18n.I18n.t
    
    33
    +        </import>
    
    34
    +
    
    35
    +        <script><![CDATA[
    
    36
    +
    
    37
    +public static UsageForReplaceUI build(Class<?> type, String message, UsagesGetter getter, List references) {
    
    38
    +    return new UsageForReplaceUI(new JAXXInitialContext().add(type).add(message).add(getter).add(references));
    
    39
    +}
    
    40
    +
    
    41
    +public ToolkitIdLabel getSelectedReplace() { return (ToolkitIdLabel) replace.getModel().getSelectedItem(); }
    
    42
    +
    
    43
    +public void destroy() {
    
    44
    +    log.debug("destroy ui " + getName());
    
    45
    +    SwingUtil.destroy(this);
    
    46
    +    usagesPanel.removeAll();
    
    47
    +}
    
    48
    +]]>
    
    49
    +        </script>
    
    50
    +
    
    51
    +        <Boolean id="canApply" javaBean="false"/>
    
    52
    +        <UsagePanel id='usagesPanel' constraints="BorderLayout.CENTER"/>
    
    53
    +        <JPanel id="replacePanel" border='{new TitledBorder(t("observe.ui.usage.replaceTitle"))}'
    
    54
    +                constraints="BorderLayout.SOUTH" layout="{new GridLayout(0, 1)}">
    
    55
    +            <FilterableComboBox id="replace" genericType="ToolkitIdLabel"/>
    
    56
    +        </JPanel>
    
    57
    +    </JPanel>
    
    58
    +</org.jdesktop.swingx.JXTitledPanel>

  • client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/content/referential/usage/UsageForReplaceUIHandler.java
    1
    +package fr.ird.observe.client.datasource.editor.api.content.referential.usage;
    
    2
    +
    
    3
    +/*-
    
    4
    + * #%L
    
    5
    + * ObServe Client :: DataSource :: Editor :: API
    
    6
    + * %%
    
    7
    + * Copyright (C) 2008 - 2023 IRD, 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 fr.ird.observe.client.datasource.usage.UsagePanel;
    
    26
    +import fr.ird.observe.client.datasource.usage.UsageUIHandlerSupport;
    
    27
    +import fr.ird.observe.client.datasource.usage.UsagesGetter;
    
    28
    +import fr.ird.observe.dto.BusinessDto;
    
    29
    +import fr.ird.observe.dto.ToolkitIdDtoBean;
    
    30
    +import fr.ird.observe.dto.ToolkitIdLabel;
    
    31
    +import fr.ird.observe.services.service.UsageCount;
    
    32
    +import fr.ird.observe.services.service.UsageCountWithLabel;
    
    33
    +import fr.ird.observe.services.service.UsageService;
    
    34
    +import fr.ird.observe.spi.module.ObserveBusinessProject;
    
    35
    +import io.ultreia.java4all.i18n.I18n;
    
    36
    +import io.ultreia.java4all.jaxx.widgets.combobox.FilterableComboBox;
    
    37
    +import io.ultreia.java4all.jaxx.widgets.combobox.FilterableComboBoxModel;
    
    38
    +import io.ultreia.java4all.util.SingletonSupplier;
    
    39
    +import org.apache.commons.lang3.tuple.Pair;
    
    40
    +
    
    41
    +import javax.swing.JOptionPane;
    
    42
    +import java.util.Collection;
    
    43
    +import java.util.List;
    
    44
    +
    
    45
    +import static io.ultreia.java4all.i18n.I18n.t;
    
    46
    +
    
    47
    +/**
    
    48
    + * Created on 20/05/2023.
    
    49
    + *
    
    50
    + * @author Tony Chemit - dev@tchemit.fr
    
    51
    + * @since 9.1.4
    
    52
    + */
    
    53
    +public class UsageForReplaceUIHandler extends UsageUIHandlerSupport<UsageForReplaceUI> {
    
    54
    +
    
    55
    +    public static Pair<Boolean, ToolkitIdLabel> showUsages(UsageService usageService,
    
    56
    +                                                           ToolkitIdLabel dto,
    
    57
    +                                                           ToolkitIdDtoBean request,
    
    58
    +                                                           UsageCount usages,
    
    59
    +                                                           List<ToolkitIdLabel> referenceList) {
    
    60
    +        ObserveBusinessProject businessProject = ObserveBusinessProject.get();
    
    61
    +        UsageCountWithLabel realUsages = new UsageCountWithLabel(I18n.getDefaultLocale(), businessProject, usages);
    
    62
    +        UsageForReplaceUIHandler.ReplaceReferentialUsagesGetter getter = new UsageForReplaceUIHandler.ReplaceReferentialUsagesGetter(realUsages, usageService, request);
    
    63
    +        Class<? extends BusinessDto> dtoType = dto.getType();
    
    64
    +        String type = businessProject.getLongTitle(dtoType);
    
    65
    +        String message = t("observe.ui.message.show.usage.referential.replace", type, dto);
    
    66
    +
    
    67
    +        UsageForReplaceUI usagesUI = UsageForReplaceUI.build(dtoType, message, getter, referenceList);
    
    68
    +
    
    69
    +        String replaceText = t("observe.ui.choice.replace");
    
    70
    +        Object[] options = {replaceText, t("observe.ui.choice.cancel")};
    
    71
    +        JOptionPane pane = new JOptionPane(usagesUI, JOptionPane.WARNING_MESSAGE, JOptionPane.DEFAULT_OPTION, null, options, options[0]);
    
    72
    +
    
    73
    +        usagesUI.getHandler().attachToOptionPane(pane, replaceText);
    
    74
    +
    
    75
    +        usagesUI.getHandler().setUISize(pane);
    
    76
    +        int response = usagesUI.getHandler().askToUser(pane, t("observe.ui.title.can.not.replace.referential"), options);
    
    77
    +        if (response == 0) {
    
    78
    +            // will replace and replace
    
    79
    +            ToolkitIdLabel selectedReplace = usagesUI.getSelectedReplace();
    
    80
    +            return Pair.of(true, selectedReplace);
    
    81
    +        }
    
    82
    +        // any other case : do not replace, do not replace
    
    83
    +        return Pair.of(false, null);
    
    84
    +    }
    
    85
    +
    
    86
    +    @Override
    
    87
    +    protected UsagePanel getUsages() {
    
    88
    +        return ui.getUsagesPanel();
    
    89
    +    }
    
    90
    +
    
    91
    +    @Override
    
    92
    +    protected FilterableComboBox<ToolkitIdLabel> getReplace() {
    
    93
    +        return ui.getReplace();
    
    94
    +    }
    
    95
    +
    
    96
    +    @Override
    
    97
    +    public void afterInit(UsageForReplaceUI ui) {
    
    98
    +        super.afterInit(ui);
    
    99
    +        getReplace().getModel().addPropertyChangeListener(FilterableComboBoxModel.PROPERTY_SELECTED_ITEM, evt -> updateCanApply());
    
    100
    +    }
    
    101
    +
    
    102
    +    @Override
    
    103
    +    public void attachToOptionPane(JOptionPane pane, String message) {
    
    104
    +        super.attachToOptionPane(pane, message);
    
    105
    +        updateCanApply();
    
    106
    +    }
    
    107
    +
    
    108
    +    private void updateCanApply() {
    
    109
    +        boolean canApply = getReplace().getModel().getSelectedItem() != null;
    
    110
    +        ui.setCanApply(canApply);
    
    111
    +    }
    
    112
    +
    
    113
    +    public static class ReplaceReferentialUsagesGetter implements UsagesGetter {
    
    114
    +        private final UsageCountWithLabel usages;
    
    115
    +        private final UsageService usageService;
    
    116
    +        private final ToolkitIdDtoBean request;
    
    117
    +
    
    118
    +        public ReplaceReferentialUsagesGetter(UsageCountWithLabel usages, UsageService usageService, ToolkitIdDtoBean request) {
    
    119
    +            this.usages = usages;
    
    120
    +            this.usageService = usageService;
    
    121
    +            this.request = request;
    
    122
    +        }
    
    123
    +
    
    124
    +        @Override
    
    125
    +        public UsageCountWithLabel getCount() {
    
    126
    +            return usages;
    
    127
    +        }
    
    128
    +
    
    129
    +        @Override
    
    130
    +        public <D extends BusinessDto> SingletonSupplier<Collection<ToolkitIdLabel>> getUsages(Class<D> dtoType) {
    
    131
    +            return SingletonSupplier.of(() -> usageService.findReferential(request, dtoType));
    
    132
    +        }
    
    133
    +    }
    
    134
    +}

  • client/datasource/editor/common/pom.xml
    ... ... @@ -81,6 +81,10 @@
    81 81
           <groupId>org.apache.logging.log4j</groupId>
    
    82 82
           <artifactId>log4j-api</artifactId>
    
    83 83
         </dependency>
    
    84
    +    <dependency>
    
    85
    +      <groupId>org.swinglabs</groupId>
    
    86
    +      <artifactId>jxlayer</artifactId>
    
    87
    +    </dependency>
    
    84 88
         <dependency>
    
    85 89
           <groupId>${project.groupId}</groupId>
    
    86 90
           <artifactId>client-datasource-editor-api-test</artifactId>
    

  • client/datasource/editor/ll/pom.xml
    ... ... @@ -147,6 +147,10 @@
    147 147
           <groupId>org.locationtech.jts</groupId>
    
    148 148
           <artifactId>jts-core</artifactId>
    
    149 149
         </dependency>
    
    150
    +    <dependency>
    
    151
    +      <groupId>org.swinglabs</groupId>
    
    152
    +      <artifactId>jxlayer</artifactId>
    
    153
    +    </dependency>
    
    150 154
         <dependency>
    
    151 155
           <groupId>org.swinglabs.swingx</groupId>
    
    152 156
           <artifactId>swingx-core</artifactId>
    

  • client/datasource/editor/pom.xml
    ... ... @@ -91,6 +91,11 @@
    91 91
             <artifactId>gt-main</artifactId>
    
    92 92
             <version>${lib.version.geoTools}</version>
    
    93 93
           </dependency>
    
    94
    +      <dependency>
    
    95
    +        <groupId>org.geotools</groupId>
    
    96
    +        <artifactId>gt-metadata</artifactId>
    
    97
    +        <version>${lib.version.geoTools}</version>
    
    98
    +      </dependency>
    
    94 99
           <dependency>
    
    95 100
             <groupId>org.geotools</groupId>
    
    96 101
             <artifactId>gt-opengis</artifactId>
    

  • client/datasource/editor/ps/pom.xml
    ... ... @@ -160,6 +160,10 @@
    160 160
           <groupId>org.locationtech.jts</groupId>
    
    161 161
           <artifactId>jts-core</artifactId>
    
    162 162
         </dependency>
    
    163
    +    <dependency>
    
    164
    +      <groupId>org.swinglabs</groupId>
    
    165
    +      <artifactId>jxlayer</artifactId>
    
    166
    +    </dependency>
    
    163 167
         <dependency>
    
    164 168
           <groupId>org.swinglabs.swingx</groupId>
    
    165 169
           <artifactId>swingx-core</artifactId>
    

  • client/runner/pom.xml
    ... ... @@ -75,6 +75,10 @@
    75 75
           <groupId>io.ultreia.java4all</groupId>
    
    76 76
           <artifactId>application-context</artifactId>
    
    77 77
         </dependency>
    
    78
    +    <dependency>
    
    79
    +      <groupId>io.ultreia.java4all</groupId>
    
    80
    +      <artifactId>java-util</artifactId>
    
    81
    +    </dependency>
    
    78 82
         <dependency>
    
    79 83
           <groupId>io.ultreia.java4all.i18n</groupId>
    
    80 84
           <artifactId>i18n-runtime</artifactId>
    
    ... ... @@ -383,7 +387,7 @@
    383 387
                 <phase>generate-resources</phase>
    
    384 388
                 <configuration>
    
    385 389
                   <target>
    
    386
    -                <copy failonerror="true" file="../../CHANGELOG.md" overwrite="true" tofile="${project.build.outputDirectory}/META-INF/${applicationName}-CHANGELOG.md" />
    
    390
    +                <copy failonerror="true" file="../../CHANGELOG.md" overwrite="true" tofile="${project.build.outputDirectory}/META-INF/${applicationName}-CHANGELOG.md"/>
    
    387 391
                   </target>
    
    388 392
                 </configuration>
    
    389 393
               </execution>
    
    ... ... @@ -397,7 +401,7 @@
    397 401
                   <target>
    
    398 402
                     <copy failonerror="true" overwrite="true" todir="${project.build.outputDirectory}/META-INF/configuration/">
    
    399 403
                       <fileset dir="${config.targetDirectory}">
    
    400
    -                    <include name="${applicationName}.*" />
    
    404
    +                    <include name="${applicationName}.*"/>
    
    401 405
                       </fileset>
    
    402 406
                     </copy>
    
    403 407
                   </target>
    
    ... ... @@ -411,7 +415,7 @@
    411 415
                 <phase>integration-test</phase>
    
    412 416
                 <configuration>
    
    413 417
                   <target>
    
    414
    -                <copy failonerror="true" file="${project.build.directory}/${project.build.finalName}.jar" overwrite="true" tofile="${project.build.directory}/${applicationJarName}.jar" />
    
    418
    +                <copy failonerror="true" file="${project.build.directory}/${project.build.finalName}.jar" overwrite="true" tofile="${project.build.directory}/${applicationJarName}.jar"/>
    
    415 419
                   </target>
    
    416 420
                 </configuration>
    
    417 421
               </execution>
    
    ... ... @@ -445,7 +449,7 @@
    445 449
                     <phase>integration-test</phase>
    
    446 450
                     <configuration>
    
    447 451
                       <target>
    
    448
    -                    <copy failonerror="true" file="${project.build.directory}/${project.build.finalName}.exe" overwrite="true" tofile="${project.build.directory}/${applicationJarName}.exe" />
    
    452
    +                    <copy failonerror="true" file="${project.build.directory}/${project.build.finalName}.exe" overwrite="true" tofile="${project.build.directory}/${applicationJarName}.exe"/>
    
    449 453
                       </target>
    
    450 454
                     </configuration>
    
    451 455
                   </execution>
    

  • client/runner/src/main/i18n/translations/client-runner_en_GB.properties
    ... ... @@ -273,6 +273,9 @@ observe.info.validation.credentials=To validate referentiel (resp. data), You mu
    273 273
     observe.init.no.initial.dump.detected=Internal data source %1$s not detected.
    
    274 274
     observe.init.no.local.db.detected=Local data source %1$s not detected.
    
    275 275
     observe.ll.data.observation.SetDetailCompositionUI.generateTabValid=Templates
    
    276
    +observe.referential.Referential.action.replaceUsages=Replace in data with another reference
    
    277
    +observe.referential.Referential.action.replaceUsages.no.data.usage=No usage of reference «%s» found
    
    278
    +observe.referential.Referential.action.replaceUsages.tip=Replace current usages of this reference «%s» with another one
    
    276 279
     observe.referential.Referential.type=<html><body>Referential of type <i>%s</i>
    
    277 280
     observe.runner.action.showConfig.title=Configuration
    
    278 281
     observe.runner.config.loaded=Configuration d'ObServe v. %1$s chargée.
    
    ... ... @@ -866,6 +869,7 @@ observe.ui.message.show.data.compositions.usages=List of required dependencies f
    866 869
     observe.ui.message.show.referential.usages=List of usage of referential %1$s\: '%2$s'
    
    867 870
     observe.ui.message.show.usage.referential.delete=Referential %1$s "%2$s" can be deleted until you choose a replacement.
    
    868 871
     observe.ui.message.show.usage.referential.disabled=Referential %1$s "%2$s" will be disabled.
    
    872
    +observe.ui.message.show.usage.referential.replace=Choose a replacement for referential %1$s "%2$s"
    
    869 873
     observe.ui.message.table.editBean.modified=Current entry is modified and valid.
    
    870 874
     observe.ui.message.table.editBean.modified.but.invalid=Current entry is modified but not valid.
    
    871 875
     observe.ui.move.selectTarget=Select new parent node after move?
    
    ... ... @@ -873,6 +877,7 @@ observe.ui.textArea.tip=<html><body><ul><li>To focus on next widget, use acceler
    873 877
     observe.ui.title.about=About
    
    874 878
     observe.ui.title.can.not.delete.referential=Impossible to delete a referentiel data...
    
    875 879
     observe.ui.title.can.not.export.obstuna=Could not export data...
    
    880
    +observe.ui.title.can.not.replace.referential=Select referential replacement
    
    876 881
     observe.ui.title.choose.avdth.file=Select avdth file
    
    877 882
     observe.ui.title.choose.db.dump=Choose a database backup
    
    878 883
     observe.ui.title.choose.db.dump.directory=Choose directory of backup
    

  • client/runner/src/main/i18n/translations/client-runner_es_ES.properties
    ... ... @@ -273,6 +273,9 @@ observe.info.validation.credentials=Para validar el referencial (resp. los datos
    273 273
     observe.init.no.initial.dump.detected=fuente de datos interna %1$s no detectada.
    
    274 274
     observe.init.no.local.db.detected=Base local %1$s no detectada.
    
    275 275
     observe.ll.data.observation.SetDetailCompositionUI.generateTabValid=Templates \#TODO
    
    276
    +observe.referential.Referential.action.replaceUsages=Replace in data with another reference \#TODO
    
    277
    +observe.referential.Referential.action.replaceUsages.no.data.usage=No usage of reference «%s» found \#TODO
    
    278
    +observe.referential.Referential.action.replaceUsages.tip=Replace current usages of this reference «%s» with another one \#TODO
    
    276 279
     observe.referential.Referential.type=<html><body>Referencial de tipo <i>%s</i>
    
    277 280
     observe.runner.action.showConfig.title=Configuración
    
    278 281
     observe.runner.config.loaded=Configuración de Observe v. %1$s cargada.
    
    ... ... @@ -866,6 +869,7 @@ observe.ui.message.show.data.compositions.usages=List of required dependencies f
    866 869
     observe.ui.message.show.referential.usages=Listas de usos de referenciales %1$s \: '%2$s'
    
    867 870
     observe.ui.message.show.usage.referential.delete=El referencial %1$s "%2$s" no se puede eliminar sin hacer una sustitución antes.
    
    868 871
     observe.ui.message.show.usage.referential.disabled=El referencial %1$s "%2$s" se desactivará.
    
    872
    +observe.ui.message.show.usage.referential.replace=Choose a replacement for referential %1$s "%2$s" \#TODO
    
    869 873
     observe.ui.message.table.editBean.modified=El registro actual se ha modificado y es válido.
    
    870 874
     observe.ui.message.table.editBean.modified.but.invalid=El registro actual se ha modificado pero no es válido.
    
    871 875
     observe.ui.move.selectTarget=Select new parent node after move? \#TODO
    
    ... ... @@ -873,6 +877,7 @@ observe.ui.textArea.tip=<html><body><ul><li>To focus on next widget, use acceler
    873 877
     observe.ui.title.about=A proposito de ObServe...
    
    874 878
     observe.ui.title.can.not.delete.referential=Impossible eliminar un referencial en proceso de utilización...
    
    875 879
     observe.ui.title.can.not.export.obstuna=Impossible exportar los datos...
    
    880
    +observe.ui.title.can.not.replace.referential=Select referential replacement \#TODO
    
    876 881
     observe.ui.title.choose.avdth.file=Select avdth file \#TODO
    
    877 882
     observe.ui.title.choose.db.dump=Seleccionar una copia de seguridad de base local
    
    878 883
     observe.ui.title.choose.db.dump.directory=Seleccionar e directorio de destinación de la copia de seguridad
    

  • client/runner/src/main/i18n/translations/client-runner_fr_FR.properties
    ... ... @@ -273,6 +273,9 @@ observe.info.validation.credentials=Pour valider le référentiel (resp. les don
    273 273
     observe.init.no.initial.dump.detected=Base embarquée %1$s non détectée.
    
    274 274
     observe.init.no.local.db.detected=Base locale %1$s non détectée.
    
    275 275
     observe.ll.data.observation.SetDetailCompositionUI.generateTabValid=Templates
    
    276
    +observe.referential.Referential.action.replaceUsages=Remplacer dans les données par une autre référence
    
    277
    +observe.referential.Referential.action.replaceUsages.no.data.usage=Aucune utilisation de la référence «%s» détectée
    
    278
    +observe.referential.Referential.action.replaceUsages.tip=Remplacer les utilisations actuelles de cette référence «%s» par une autre
    
    276 279
     observe.referential.Referential.type=<html><body>Référentiel de type <i>%s</i>
    
    277 280
     observe.runner.action.showConfig.title=Configuration
    
    278 281
     observe.runner.config.loaded=Configuration d'ObServe v. %1$s chargée.
    
    ... ... @@ -866,6 +869,7 @@ observe.ui.message.show.data.compositions.usages=Liste des dépendances requises
    866 869
     observe.ui.message.show.referential.usages=Listes des utilisations du référentiel %1$s de type '%2$s'
    
    867 870
     observe.ui.message.show.usage.referential.delete=Le référentiel %1$s "%2$s" ne peut pas être supprimé sans effectuer au préalable un remplacement.
    
    868 871
     observe.ui.message.show.usage.referential.disabled=Le référentiel %1$s "%2$s" va être désactivé.
    
    872
    +observe.ui.message.show.usage.referential.replace=Le référentiel %1$s "%2$s" va être remplacé dans les données métiers
    
    869 873
     observe.ui.message.table.editBean.modified=L'entrée en cours d'édition a été modifiée et est valide.
    
    870 874
     observe.ui.message.table.editBean.modified.but.invalid=L'entrée en cours d'édition a été modifiée, mais n'est pas valide.
    
    871 875
     observe.ui.move.selectTarget=Se positionner sur le nœud destination après le déplacement ?
    
    ... ... @@ -873,6 +877,7 @@ observe.ui.textArea.tip=<html><body><ul><li>Pour accéder au composant suivant,
    873 877
     observe.ui.title.about=A propos d'ObServe...
    
    874 878
     observe.ui.title.can.not.delete.referential=Impossible de supprimer un référentiel en cours d'utilisation...
    
    875 879
     observe.ui.title.can.not.export.obstuna=Impossible d'exporter des données...
    
    880
    +observe.ui.title.can.not.replace.referential=Choisir le référentiel de remplacement
    
    876 881
     observe.ui.title.choose.avdth.file=Choisir une base AVDTH
    
    877 882
     observe.ui.title.choose.db.dump=Choisir une sauvegarder de base locale
    
    878 883
     observe.ui.title.choose.db.dump.directory=Choisir le répertoire de destination de la sauvegarde
    

  • core/api/validation/pom.xml
    ... ... @@ -63,6 +63,11 @@
    63 63
           <artifactId>toolkit-api-services</artifactId>
    
    64 64
           <version>${project.version}</version>
    
    65 65
         </dependency>
    
    66
    +    <dependency>
    
    67
    +      <groupId>${project.groupId}</groupId>
    
    68
    +      <artifactId>toolkit-api-validation</artifactId>
    
    69
    +      <version>${project.version}</version>
    
    70
    +    </dependency>
    
    66 71
         <dependency>
    
    67 72
           <groupId>${project.groupId}</groupId>
    
    68 73
           <artifactId>model</artifactId>
    

  • core/persistence/avdth/pom.xml
    ... ... @@ -66,6 +66,10 @@
    66 66
           <groupId>com.google.guava</groupId>
    
    67 67
           <artifactId>guava</artifactId>
    
    68 68
         </dependency>
    
    69
    +    <dependency>
    
    70
    +      <groupId>io.ultreia.java4all</groupId>
    
    71
    +      <artifactId>java-bean</artifactId>
    
    72
    +    </dependency>
    
    69 73
         <dependency>
    
    70 74
           <groupId>io.ultreia.java4all</groupId>
    
    71 75
           <artifactId>java-lang</artifactId>
    

  • core/services/pom.xml
    ... ... @@ -36,7 +36,7 @@
    36 36
         <module>client</module>
    
    37 37
       </modules>
    
    38 38
       <properties>
    
    39
    -    <serviceClassifier />
    
    39
    +    <serviceClassifier/>
    
    40 40
       </properties>
    
    41 41
       <profiles>
    
    42 42
         <profile>
    

  • model/pom.xml
    ... ... @@ -91,11 +91,11 @@
    91 91
                   <target>
    
    92 92
                     <copy failonerror="true" filtering="true" overwrite="true" todir="${project.build.outputDirectory}/models">
    
    93 93
                       <filterset>
    
    94
    -                    <filter token="persistence.model.version" value="${persistence.model.version}" />
    
    95
    -                    <filter token="model.name" value="${model.name}" />
    
    94
    +                    <filter token="persistence.model.version" value="${persistence.model.version}"/>
    
    95
    +                    <filter token="model.name" value="${model.name}"/>
    
    96 96
                       </filterset>
    
    97 97
                       <fileset dir="${basedir}/src/main/models">
    
    98
    -                    <include name="**/*" />
    
    98
    +                    <include name="**/*"/>
    
    99 99
                       </fileset>
    
    100 100
                     </copy>
    
    101 101
                   </target>
    
    ... ... @@ -111,12 +111,12 @@
    111 111
                   <target>
    
    112 112
                     <delete includeEmptyDirs="true">
    
    113 113
                       <fileset dir="${project.build.outputDirectory}/models/${model.name}">
    
    114
    -                    <include name="${model.dto.classifier}/*/*" />
    
    115
    -                    <include name="${model.dto.classifier}/*" />
    
    116
    -                    <include name="${model.dto.classifier}" />
    
    117
    -                    <include name="${model.persistence.classifier}/*/*" />
    
    118
    -                    <include name="${model.persistence.classifier}/*" />
    
    119
    -                    <include name="${model.persistence.classifier}" />
    
    114
    +                    <include name="${model.dto.classifier}/*/*"/>
    
    115
    +                    <include name="${model.dto.classifier}/*"/>
    
    116
    +                    <include name="${model.dto.classifier}"/>
    
    117
    +                    <include name="${model.persistence.classifier}/*/*"/>
    
    118
    +                    <include name="${model.persistence.classifier}/*"/>
    
    119
    +                    <include name="${model.persistence.classifier}"/>
    
    120 120
                       </fileset>
    
    121 121
                     </delete>
    
    122 122
                   </target>
    

  • observe/pom.xml
    ... ... @@ -31,7 +31,7 @@
    31 31
       <description>ObServe Release</description>
    
    32 32
       <properties>
    
    33 33
         <deploy>false</deploy>
    
    34
    -    <deployFileSuffix />
    
    34
    +    <deployFileSuffix/>
    
    35 35
       </properties>
    
    36 36
       <build>
    
    37 37
         <plugins>
    
    ... ... @@ -183,9 +183,6 @@
    183 183
             <skipNexusStagingDeployMojo>false</skipNexusStagingDeployMojo>
    
    184 184
             <!--        <deployFileSuffix />-->
    
    185 185
           </properties>
    
    186
    -      <build>
    
    187
    -        <plugins />
    
    188
    -      </build>
    
    189 186
         </profile>
    
    190 187
       </profiles>
    
    191 188
     </project>

  • pom.xml
    ... ... @@ -23,7 +23,7 @@
    23 23
       <parent>
    
    24 24
         <groupId>io.ultreia.maven</groupId>
    
    25 25
         <artifactId>pom</artifactId>
    
    26
    -    <version>2023.23</version>
    
    26
    +    <version>2023.26</version>
    
    27 27
       </parent>
    
    28 28
       <groupId>fr.ird.observe</groupId>
    
    29 29
       <artifactId>ird-observe</artifactId>
    
    ... ... @@ -543,6 +543,11 @@
    543 543
             <artifactId>commons-lang3</artifactId>
    
    544 544
             <version>${lib.version.commons-lang3}</version>
    
    545 545
           </dependency>
    
    546
    +      <dependency>
    
    547
    +        <groupId>org.apache.commons</groupId>
    
    548
    +        <artifactId>commons-text</artifactId>
    
    549
    +        <version>1.10.0</version>
    
    550
    +      </dependency>
    
    546 551
           <dependency>
    
    547 552
             <groupId>org.apache.httpcomponents</groupId>
    
    548 553
             <artifactId>httpclient</artifactId>
    
    ... ... @@ -735,6 +740,11 @@
    735 740
             <artifactId>jboss-logging</artifactId>
    
    736 741
             <version>${lib.version.jboss-logging}</version>
    
    737 742
           </dependency>
    
    743
    +      <dependency>
    
    744
    +        <groupId>org.jdom</groupId>
    
    745
    +        <artifactId>jdom2</artifactId>
    
    746
    +        <version>2.0.6.1</version>
    
    747
    +      </dependency>
    
    738 748
           <dependency>
    
    739 749
             <groupId>org.locationtech.jts</groupId>
    
    740 750
             <artifactId>jts-core</artifactId>
    
    ... ... @@ -1653,7 +1663,7 @@
    1653 1663
                     <phase>pre-site</phase>
    
    1654 1664
                     <configuration>
    
    1655 1665
                       <target>
    
    1656
    -                    <copy failonerror="true" file="README.md" overwrite="true" tofile="${project.basedir}/src/site/markdown/index.md" verbose="true" />
    
    1666
    +                    <copy failonerror="true" file="README.md" overwrite="true" tofile="${project.basedir}/src/site/markdown/index.md" verbose="true"/>
    
    1657 1667
                       </target>
    
    1658 1668
                     </configuration>
    
    1659 1669
                   </execution>
    
    ... ... @@ -1683,11 +1693,11 @@
    1683 1693
                     <phase>pre-site</phase>
    
    1684 1694
                     <configuration>
    
    1685 1695
                       <target>
    
    1686
    -                    <copy failonerror="true" file="CHANGELOG.md" overwrite="true" todir="${project.basedir}/src/site/markdown" />
    
    1687
    -                    <copy failonerror="true" file="${project.basedir}/client/runner/src/main/assembly/dist/config/observe-client.md" overwrite="true" todir="${project.basedir}/src/site/markdown/" />
    
    1688
    -                    <copy failonerror="true" file="${project.basedir}/client/runner/src/main/assembly/dist/config/observe-client.conf" overwrite="true" todir="${project.basedir}/src/site/resources/" />
    
    1689
    -                    <copy failonerror="true" file="${project.basedir}/server/runner/src/main/assembly/dist/config/observe-server.md" overwrite="true" todir="${project.basedir}/src/site/markdown/" />
    
    1690
    -                    <copy failonerror="true" file="${project.basedir}/server/runner/src/main/assembly/dist/config/observe-server.conf" overwrite="true" todir="${project.basedir}/src/site/resources/" />
    
    1696
    +                    <copy failonerror="true" file="CHANGELOG.md" overwrite="true" todir="${project.basedir}/src/site/markdown"/>
    
    1697
    +                    <copy failonerror="true" file="${project.basedir}/client/runner/src/main/assembly/dist/config/observe-client.md" overwrite="true" todir="${project.basedir}/src/site/markdown/"/>
    
    1698
    +                    <copy failonerror="true" file="${project.basedir}/client/runner/src/main/assembly/dist/config/observe-client.conf" overwrite="true" todir="${project.basedir}/src/site/resources/"/>
    
    1699
    +                    <copy failonerror="true" file="${project.basedir}/server/runner/src/main/assembly/dist/config/observe-server.md" overwrite="true" todir="${project.basedir}/src/site/markdown/"/>
    
    1700
    +                    <copy failonerror="true" file="${project.basedir}/server/runner/src/main/assembly/dist/config/observe-server.conf" overwrite="true" todir="${project.basedir}/src/site/resources/"/>
    
    1691 1701
                       </target>
    
    1692 1702
                     </configuration>
    
    1693 1703
                   </execution>
    

  • server/runner/pom.xml
    ... ... @@ -256,7 +256,7 @@
    256 256
                 <phase>generate-resources</phase>
    
    257 257
                 <configuration>
    
    258 258
                   <target>
    
    259
    -                <copy failonerror="true" file="../../CHANGELOG.md" overwrite="true" tofile="${project.build.outputDirectory}/META-INF/${applicationName}-CHANGELOG.md" />
    
    259
    +                <copy failonerror="true" file="../../CHANGELOG.md" overwrite="true" tofile="${project.build.outputDirectory}/META-INF/${applicationName}-CHANGELOG.md"/>
    
    260 260
                   </target>
    
    261 261
                 </configuration>
    
    262 262
               </execution>
    
    ... ... @@ -270,7 +270,7 @@
    270 270
                   <target>
    
    271 271
                     <copy failonerror="true" overwrite="true" todir="${project.build.outputDirectory}/META-INF/configuration/">
    
    272 272
                       <fileset dir="${config.targetDirectory}">
    
    273
    -                    <include name="${applicationName}.*" />
    
    273
    +                    <include name="${applicationName}.*"/>
    
    274 274
                       </fileset>
    
    275 275
                     </copy>
    
    276 276
                   </target>