Skip to content

Commit c11d048

Browse files
committed
feat: export gui
1 parent cfeee89 commit c11d048

14 files changed

Lines changed: 151 additions & 94 deletions

File tree

arc-core/src/main/java/fr/insee/arc/core/dataobjects/ColumnEnum.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ public enum ColumnEnum {
3131
, ENVIRONMENT("environment", TypeEnum.TEXT, "") // ihm_ws_context
3232
, ENV_DESCRIPTION("env_description", TypeEnum.TEXT, "") // ext_etat_jeuderegle
3333
, ERROR_ROW_PROCESSING("error_row_processing", TypeEnum.TEXT, "") // ihm_controle_regle
34-
, ETAT("etat", TypeEnum.TEXT, "") // ihm_jeuderegle,ihm_norme,ihm_calendrier, export
34+
, ETAT("etat", TypeEnum.TEXT, "") // ihm_jeuderegle,ihm_norme,ihm_calendrier,export
3535
, EVENT_TIMESTAMP("event_timestamp", TypeEnum.TIMESTAMP, "") // security_webservice_log
3636
, EXPRESSION("expression", TypeEnum.TEXT, "") // ihm_ws_query
3737
, EXPR_NOM("expr_nom", TypeEnum.TEXT, "") // ihm_expression
@@ -95,12 +95,12 @@ public enum ColumnEnum {
9595
, XSD_ORDRE("xsd_ordre", TypeEnum.INTEGER, "") // ihm_controle_regle
9696
, XSD_ROLE("xsd_role", TypeEnum.TEXT, "") // ihm_controle_regle
9797

98+
, TIMESTAMP_DIRECTORY("timestamp_directory", TypeEnum.TEXT, "") // export
9899
, FILE_NAME("file_name", TypeEnum.TEXT, "") // export
99100
, TABLE_TO_EXPORT("table_to_export", TypeEnum.TEXT, "") // export
100101
, NOMENCLATURE_EXPORT("nomenclature_export", TypeEnum.TEXT, "") // export
101102
, FILTER_TABLE("filter_table", TypeEnum.TEXT, "") // export
102-
, COLUMNS_ARRAY_HEADER("columns_array_header", TypeEnum.TEXT, "") // export
103-
, COLUMNS_ARRAY_VALUE("columns_array_value", TypeEnum.TEXT, "") // export
103+
, JSON_KEY_VALUE("json_key_value", TypeEnum.TEXT, "") //export
104104
, NULLS("nulls", TypeEnum.TEXT, "") // export
105105
, HEADERS("headers", TypeEnum.TEXT, "") // export
106106
, ORDER_TABLE("order_table", TypeEnum.TEXT, "") // export

arc-core/src/main/java/fr/insee/arc/core/dataobjects/ViewEnum.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -81,10 +81,9 @@ public enum ViewEnum {
8181
, PARAMETER("parameter", SchemaEnum.ARC_METADATA, ColumnEnum.KEY, ColumnEnum.VAL, ColumnEnum.DESCRIPTION) //
8282

8383
// table d'export
84-
, EXPORT("export", SchemaEnum.SANDBOX, ColumnEnum.FILE_NAME, ColumnEnum.ZIP, ColumnEnum.TABLE_TO_EXPORT,
84+
, EXPORT("export", SchemaEnum.SANDBOX, ColumnEnum.TIMESTAMP_DIRECTORY, ColumnEnum.FILE_NAME, ColumnEnum.ZIP, ColumnEnum.TABLE_TO_EXPORT,
8585
ColumnEnum.HEADERS, ColumnEnum.NULLS, ColumnEnum.FILTER_TABLE, ColumnEnum.ORDER_TABLE,
86-
ColumnEnum.NOMENCLATURE_EXPORT, ColumnEnum.COLUMNS_ARRAY_HEADER, ColumnEnum.COLUMNS_ARRAY_VALUE,
87-
ColumnEnum.ETAT) //
86+
ColumnEnum.NOMENCLATURE_EXPORT, ColumnEnum.JSON_KEY_VALUE, ColumnEnum.ETAT) //
8887
, EXPORT_OPTION("export_option", SchemaEnum.SANDBOX, ColumnEnum.NOM_TABLE_METIER
8988
, ColumnEnum.EXPORT_PARQUET_OPTION, ColumnEnum.EXPORT_COORDINATOR_OPTION) //
9089

arc-core/src/main/resources/BdD/script_global.sql

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -420,8 +420,12 @@ val text,
420420
CONSTRAINT ext_export_format_pkey PRIMARY KEY (id)
421421
);
422422

423-
INSERT INTO arc.ext_export_format VALUES ('0','NA'), ('1','ZIP'), ('2','GZ') ON CONFLICT DO NOTHING;
423+
-- patch 13/04/2026 : export change
424+
UPDATE arc.ext_export_format set val='parquet' where id='0' and val!='parquet';
425+
UPDATE arc.ext_export_format set val='csv' where id='1' and val!='csv';
426+
UPDATE arc.ext_export_format set val='csv.gz' where id='2' and val!='csv.gz';
424427

428+
INSERT INTO arc.ext_export_format VALUES ('0','parquet'), ('1','csv'), ('2','csv.gz') ON CONFLICT DO NOTHING;
425429

426430
/*
427431
* PATCHS version

arc-core/src/main/resources/BdD/script_sandbox_constraint.sql

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,7 @@ commit;do $$ begin alter table {{envExecution}}.export add CONSTRAINT export_zip
44
select public.check_function('{{envExecution}}.export', 'file_name', 'public.check_identifier_with_schema');
55
select public.check_function('{{envExecution}}.export', 'table_to_export', 'public.check_identifier');
66
select public.check_function('{{envExecution}}.export', 'nomenclature_export', 'public.check_identifier');
7-
select public.check_function('{{envExecution}}.export', 'columns_array_header', 'public.check_identifier');
8-
select public.check_function('{{envExecution}}.export', 'columns_array_value', 'public.check_identifier');
7+
select public.check_function('{{envExecution}}.export', 'json_key_value', 'public.check_identifier');
98
select public.check_function('{{envExecution}}.export', 'filter_table', 'public.check_sql');
109
select public.check_function('{{envExecution}}.export', 'order_table', 'public.check_sql');
1110

arc-core/src/main/resources/BdD/script_sandbox_phase_export.sql

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,28 @@
11
-- create export rules table
22
CREATE TABLE IF NOT EXISTS {{envExecution}}.export
33
(
4+
timestamp_directory text,
45
file_name text,
56
table_to_export text,
67
nomenclature_export text,
78
filter_table text,
8-
columns_array_header text,
9-
columns_array_value text,
10-
etat text,
9+
json_key_value text,
1110
nulls text,
1211
headers text,
1312
order_table text,
1413
zip text,
14+
etat text,
1515
PRIMARY KEY (file_name)
1616
);
1717

18+
-- patch 13/04/2026 : columns_array_header and columns_array_value are replaced by json_key_value
19+
ALTER TABLE {{envExecution}}.export DROP COLUMN IF EXISTS columns_array_header;
20+
ALTER TABLE {{envExecution}}.export DROP COLUMN IF EXISTS columns_array_value;
21+
ALTER TABLE {{envExecution}}.export ADD COLUMN IF NOT EXISTS json_key_value text;
22+
ALTER TABLE {{envExecution}}.export ADD COLUMN IF NOT EXISTS etat text;
23+
ALTER TABLE {{envExecution}}.export ADD COLUMN IF NOT EXISTS timestamp_directory text;
24+
25+
1826
CREATE TABLE IF NOT EXISTS {{envExecution}}.export_option
1927
(
2028
nom_table_metier text NOT NULL,

arc-utils/src/main/java/fr/insee/arc/utils/structure/GenericBean.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,11 @@ public GenericBean(String headers, String types, List<String> contentList) {
5151
this.content = reworkListAsContent(contentList);
5252
}
5353

54-
54+
/**
55+
* Translate a list as a genericBean content
56+
* @param contentList
57+
* @return
58+
*/
5559
protected static List<List<String>> reworkListAsContent(List<String> contentList) {
5660

5761
List<List<String>> contentReworked =new ArrayList<>();

arc-web/src/main/java/fr/insee/arc/web/gui/export/dao/ExportDao.java

Lines changed: 42 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616
import org.apache.commons.lang3.StringUtils;
1717
import org.springframework.stereotype.Component;
1818

19+
import com.fasterxml.jackson.databind.ObjectMapper;
20+
1921
import fr.insee.arc.core.dataobjects.ArcPreparedStatementBuilder;
2022
import fr.insee.arc.core.dataobjects.ColumnEnum;
2123
import fr.insee.arc.core.dataobjects.DataObjectService;
@@ -163,21 +165,20 @@ public ResultSet exportFileFilteredOrdered(Statement stmt, int n, List<String> t
163165
* @throws IOException
164166
* @throws SQLException
165167
*/
166-
public void exportFile(Map<String, List<String>> h, int n, BufferedWriter bw, FileOutputStream fw)
168+
public void exportFile(Map<String, List<String>> exportparameter, int n, BufferedWriter bw, FileOutputStream fw)
167169
throws ArcException, IOException, SQLException {
168-
List<String> tablesToExport = h.get("table_to_export");
169-
List<String> headers = h.get("headers");
170-
List<String> nulls = h.get("nulls");
171-
List<String> filterTable = h.get("filter_table");
172-
List<String> orderTable = h.get("order_table");
173-
List<String> howToExport = h.get("nomenclature_export");
174-
List<String> headersToScan = h.get("columns_array_header");
175-
List<String> valuesToScan = h.get("columns_array_value");
170+
List<String> tablesToExport = exportparameter.get("table_to_export");
171+
List<String> headers = exportparameter.get("headers");
172+
List<String> nulls = exportparameter.get("nulls");
173+
List<String> filterTable = exportparameter.get("filter_table");
174+
List<String> orderTable = exportparameter.get("order_table");
175+
List<String> howToExport = exportparameter.get("nomenclature_export");
176+
List<String> jsonKeyValueToConvert = exportparameter.get("json_key_value");
176177

177178
Map<String, Integer> pos = new HashMap<>();
178179
List<String> headerLine = new ArrayList<>();
179180

180-
h = exportFileRetrieveRules(n, howToExport, tablesToExport, this.dataObjectService.getSandboxSchema());
181+
Map<String, List<String>> h = exportFileRetrieveRules(n, howToExport, tablesToExport, this.dataObjectService.getSandboxSchema());
181182

182183
if (h.isEmpty()) {
183184
throw new ArcException(ArcExceptionMessage.GUI_EXPORT_TABLE_NOT_EXISTS);
@@ -208,33 +209,32 @@ public void exportFile(Map<String, List<String>> h, int n, BufferedWriter bw, Fi
208209
try (ResultSet res = exportFileFilteredOrdered(stmt, n, tablesToExport, filterTable, orderTable, this.dataObjectService.getSandboxSchema())) {
209210
ResultSetMetaData rsmd = res.getMetaData();
210211

211-
ArrayList<String> output;
212-
String[] tabH;
213-
String[] tabV;
214212
String colName;
215213
while (res.next()) {
216214
// reinitialiser l'arraylist de sortie
217-
output = new ArrayList<>();
215+
ArrayList<String> output = new ArrayList<>();
218216
for (int k = 0; k < maxPos; k++) {
219217
output.add("");
220218
}
221-
219+
222220
boolean todo = false;
223-
tabH = null;
224-
tabV = null;
221+
222+
List<String> tabH=new ArrayList<>();
223+
List<String> tabV=new ArrayList<>();
224+
225+
225226
for (int i = 1; i <= rsmd.getColumnCount(); i++) {
226227
colName = rsmd.getColumnLabel(i).toLowerCase();
227228

228229
todo = true;
229230
// cas ou on est dans un tableau
230-
if (todo && colName.equals(headersToScan.get(n))) {
231-
todo = false;
232-
tabH = (String[]) res.getArray(i).getArray();
233-
}
234-
if (todo && colName.equals(valuesToScan.get(n))) {
231+
if (todo && colName.equals(jsonKeyValueToConvert.get(n))) {
235232
todo = false;
236-
tabV = (String[]) res.getArray(i).getArray();
233+
234+
Map<String,String> m= convertKeyValueJsonToArray(res.getString(i));
235+
m.entrySet().stream().forEach(t-> { tabH.add(t.getKey()); tabV.add(t.getValue());});
237236
}
237+
238238
if (todo) {
239239
todo = false;
240240
if (pos.get(colName) != null) {
@@ -247,12 +247,12 @@ public void exportFile(Map<String, List<String>> h, int n, BufferedWriter bw, Fi
247247
}
248248

249249
// traitement des variables tableaux
250-
if (tabH != null && tabV != null) {
251-
for (int k = 0; k < tabH.length; k++) {
252-
if (pos.get(tabH[k].toLowerCase()) != null) {
250+
if (!tabH.isEmpty() && !tabV.isEmpty()) {
251+
for (int k = 0; k < tabH.size(); k++) {
252+
if (pos.get(tabH.get(k).toLowerCase()) != null) {
253253
// if nulls value musn't be quoted as "null" and element is null then don't write
254-
if (!(StringUtils.isEmpty(nulls.get(n)) && StringUtils.isEmpty(tabV[k]))) {
255-
output.set(pos.get(tabH[k].toLowerCase()), tabV[k]);
254+
if (!(StringUtils.isEmpty(nulls.get(n)) && StringUtils.isEmpty(tabV.get(k)))) {
255+
output.set(pos.get(tabH.get(k).toLowerCase()), tabV.get(k));
256256
}
257257
}
258258
}
@@ -271,6 +271,20 @@ public void exportFile(Map<String, List<String>> h, int n, BufferedWriter bw, Fi
271271
}
272272

273273

274+
@SuppressWarnings("unchecked")
275+
private Map<String,String> convertKeyValueJsonToArray(String keyValueJson) {
276+
ObjectMapper mapper = new ObjectMapper();
277+
try {
278+
return mapper.readValue(keyValueJson, Map.class);
279+
}
280+
catch (Exception e)
281+
{
282+
System.out.println("not deserializable");
283+
}
284+
return new HashMap<>();
285+
286+
}
287+
274288
public VObjectService getvObjectService() {
275289
return vObjectService;
276290
}

arc-web/src/main/java/fr/insee/arc/web/gui/export/model/ViewExport.java

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
import java.util.HashMap;
44

55
import fr.insee.arc.core.dataobjects.ArcPreparedStatementBuilder;
6+
import fr.insee.arc.core.dataobjects.ColumnEnum;
7+
import fr.insee.arc.core.dataobjects.ViewEnum;
68
import fr.insee.arc.web.gui.all.util.ConstantVObject;
79
import fr.insee.arc.web.gui.all.util.VObject;
810
import fr.insee.arc.web.gui.all.util.ConstantVObject.ColumnRendering;
@@ -25,19 +27,17 @@ public ViewExport() {
2527
private static final long serialVersionUID = -3124381932840827423L;
2628

2729
{
28-
put("file_name", new ColumnRendering(true, "Nom du fichier à créer", "11%", "text", null, true));
29-
put("zip", new ColumnRendering(true, "Format d'export", "4%", "select", new ArcPreparedStatementBuilder("select id, val from arc.ext_export_format order by id"), true));
30-
put("headers", new ColumnRendering(true, "Créer la ligne d'entête ?", "10%", "text", null, true));
31-
put("nulls", new ColumnRendering(true, "Mettre null pour les valeurs à null ?", "10%", "text", null, true));
32-
put("table_to_export", new ColumnRendering(true, "Table à exporter", "11%", "text", null, true));
33-
put("nomenclature_export", new ColumnRendering(true, "Nomenclature de définition de l'export", "11%", "text", null, true));
34-
put("filter_table", new ColumnRendering(true, "Filtre", "11%", "text", null, true));
35-
put("order_table", new ColumnRendering(true, "Tri", "11%", "text", null, true));
36-
put("columns_array_header", new ColumnRendering(true, "Colonne tableau contenant des entetes", "11%", "text", null, true));
37-
put("columns_array_value", new ColumnRendering(true, "Colonne tableau contenant des valeurs", "11%", "text", null, true));
38-
put("etat", new ColumnRendering(true, "Etat du dernier export", "10%", "text", null, false));
39-
40-
30+
put(ColumnEnum.TIMESTAMP_DIRECTORY.getColumnName(), new ColumnRendering(true, "label.export.timestamp", "8%", "text", null, true));
31+
put(ColumnEnum.FILE_NAME.getColumnName(), new ColumnRendering(true, "label.export.file.name", "15%", "text", null, true));
32+
put(ColumnEnum.ZIP.getColumnName(), new ColumnRendering(true, "label.export.file.format", "6%", "select", new ArcPreparedStatementBuilder("select id, val from arc.ext_export_format order by id"), true));
33+
put(ColumnEnum.HEADERS.getColumnName(), new ColumnRendering(true, "label.export.table.headers", "8%", "text", null, true));
34+
put(ColumnEnum.NULLS.getColumnName(), new ColumnRendering(true, "label.export.table.nulls", "8%", "text", null, true));
35+
put(ColumnEnum.TABLE_TO_EXPORT.getColumnName(), new ColumnRendering(true, "label.export.table.name", "15%", "text", null, true));
36+
put(ColumnEnum.NOMENCLATURE_EXPORT.getColumnName(), new ColumnRendering(true, "label.export.file.schema", "15%", "text", null, true));
37+
put(ColumnEnum.FILTER_TABLE.getColumnName(), new ColumnRendering(true, "label.export.table.filter", "10%", "text", null, true));
38+
put(ColumnEnum.ORDER_TABLE.getColumnName(), new ColumnRendering(true, "label.export.table.order", "10%", "text", null, true));
39+
put(ColumnEnum.JSON_KEY_VALUE.getColumnName(), new ColumnRendering(true, "label.export.table.json", "15%", "text", null, true));
40+
put(ColumnEnum.ETAT.getColumnName(), new ColumnRendering(true, "label.export.etat", "15%", "text", null, true));
4141
}
4242
}));
4343
}

arc-web/src/main/java/fr/insee/arc/web/gui/export/model/ViewExportOption.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,12 +21,12 @@ public ViewExportOption() {
2121
new HashMap<String, ColumnRendering>() {
2222
private static final long serialVersionUID = -4260429835977421646L;
2323
{
24-
put("nom_table_metier", new ColumnRendering(true, "label.tablename", "80%", "text", null, true));
25-
put("export_parquet_option", new ColumnRendering(true, "label.export.parquet", "10%",
24+
put("nom_table_metier", new ColumnRendering(true, "label.tablename", "60%", "text", null, true));
25+
put("export_parquet_option", new ColumnRendering(true, "label.export.parquet", "20%",
2626
"select",
2727
new ArcPreparedStatementBuilder("select id, val from arc.ext_etat order by id desc")
2828
, true));
29-
put("export_coordinator_option", new ColumnRendering(true, "label.export.coordinator", "10%",
29+
put("export_coordinator_option", new ColumnRendering(true, "label.export.coordinator", "20%",
3030
"select",
3131
new ArcPreparedStatementBuilder("select id, val from arc.ext_etat order by id desc")
3232
, true));

arc-web/src/main/java/fr/insee/arc/web/gui/export/service/ServiceViewExport.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ public String startExport(Model model) {
8888
dao.startExportUpdateState(fileName, fileIndex, false);
8989

9090
switch (zip.get(fileIndex)) {
91-
case "1": // Zip
91+
case "0": // Zip
9292
exportZip(dirOut, rules, fileIndex);
9393
break;
9494
case "2": // GZ

0 commit comments

Comments
 (0)