Skip to content

Commit 7cb62ec

Browse files
authored
feat(cnig): at least one prescription (#430)
1 parent e47b16e commit 7cb62ec

5 files changed

Lines changed: 145 additions & 126 deletions

File tree

validator-core/src/main/resources/error-code.json

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -196,13 +196,13 @@
196196
"documentation": "Voir la documentation de PostGIS : http://www.postgis.fr/chrome/site/docs/workshop-foss4g/doc/validity.html"
197197
},
198198
{
199-
"name":"ATTRIBUTE_GEOMETRY_INVALID_DATA_EXTENT",
199+
"name": "ATTRIBUTE_GEOMETRY_INVALID_DATA_EXTENT",
200200
"level": "ERROR",
201201
"message": "Les coordonnées de la géométrie de l'objet ne correspondent pas à la zone attendue.",
202202
"documentation": ""
203203
},
204204
{
205-
"name":"ATTRIBUTE_GEOMETRY_INVALID_INTERNAL",
205+
"name": "ATTRIBUTE_GEOMETRY_INVALID_INTERNAL",
206206
"level": "ERROR",
207207
"message": "Le processus de validation des géométries ne peut pas se résoudre. Essayez de simplifier vos géométries : https://postgis.net/docs/ST_Simplify.html",
208208
"documentation": ""
@@ -735,6 +735,12 @@
735735
"message": "Aucune assiette trouvée.",
736736
"documentation": "Selon la catégorie de SUP des géométries sont autorisées, au moins une doit être présente."
737737
},
738+
{
739+
"name": "CNIG_PRESCRIPTION_NOT_FOUND",
740+
"level": "WARNING",
741+
"message": "Aucune prescription trouvée.",
742+
"documentation": "Selon la catégorie de document, au moins une doit être présente."
743+
},
738744
{
739745
"name": "CNIG_TXT_REGEXP_INVALID",
740746
"level": "ERROR",
@@ -819,12 +825,12 @@
819825
"message": "Les {TABLE_NAME} {LIST_ID_ISO_HT} ne constituent pas une partition de {ID_S_INOND}. Leurs périmètres s'intersectent.",
820826
"documentation": "Cf. standard DI 2.0. Contrainte B.1.3 Topologie de graphe."
821827
},
822-
{
823-
"name": "DGPR_ISO_HT_GEOM_ERROR",
824-
"level": "ERROR",
825-
"message": "Une ou plusieurs géométries sont invalides. Il n'est pas possible de tester le partitionnement des surfaces inondables par les iso_ht / iso_db. Erreur complète : {POSTGIS_ERROR}",
826-
"documentation": "Cf. standard DI 2.0. Contrainte B.1.3 Topologie de graphe."
827-
},
828+
{
829+
"name": "DGPR_ISO_HT_GEOM_ERROR",
830+
"level": "ERROR",
831+
"message": "Une ou plusieurs géométries sont invalides. Il n'est pas possible de tester le partitionnement des surfaces inondables par les iso_ht / iso_db. Erreur complète : {POSTGIS_ERROR}",
832+
"documentation": "Cf. standard DI 2.0. Contrainte B.1.3 Topologie de graphe."
833+
},
828834
{
829835
"name": "DGPR_UNMATCHED_SCENARIO",
830836
"level": "ERROR",

validator-plugin-cnig/src/main/java/fr/ign/validator/cnig/CnigPlugin.java

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import fr.ign.validator.cnig.validation.attribute.RegexpTxtValidator;
1515
import fr.ign.validator.cnig.validation.document.AtLeastOneAssietteValidator;
1616
import fr.ign.validator.cnig.validation.document.AtLeastOneGenerateurValidator;
17+
import fr.ign.validator.cnig.validation.document.AtLeastOnePrescriptionValidator;
1718
import fr.ign.validator.cnig.validation.document.AtLeastOneWritingMaterialValidator;
1819
import fr.ign.validator.cnig.validation.document.DocumentNameValidator;
1920
import fr.ign.validator.cnig.validation.document.FileExtensionValidator;
@@ -73,10 +74,7 @@ public void setup(Context context) {
7374
* PostProcess - Compute document.tag.typeref (must run before
7475
* document-info.json generation)
7576
*/
76-
context.addListenerBefore(
77-
new DocUrbaPostProcess(),
78-
DocumentInfoExtractorPostProcess.class
79-
);
77+
context.addListenerBefore(new DocUrbaPostProcess(), DocumentInfoExtractorPostProcess.class);
8078

8179
/*
8280
* PostProcess - DOC_URBA_COM validation for PLUi
@@ -95,6 +93,7 @@ public void setup(Context context) {
9593
context.addListener(new AtLeastOneWritingMaterialValidator());
9694
context.addListener(new AtLeastOneGenerateurValidator());
9795
context.addListener(new AtLeastOneAssietteValidator());
96+
context.addListener(new AtLeastOnePrescriptionValidator());
9897
if (context.isFlatValidation()) {
9998
context.addListener(new FileExtensionValidator());
10099
} else {

validator-plugin-cnig/src/main/java/fr/ign/validator/cnig/error/CnigErrorCodes.java

Lines changed: 36 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,8 @@ public class CnigErrorCodes {
2020
/**
2121
* Overrides CORE_TABLE_MISSING_NULLABLE_ATTRIBUTE
2222
*/
23-
public static final ErrorCode CNIG_TABLE_MISSING_PRESENCE_OPTIONAL_ATTRIBUTE = ErrorCode.valueOf(
24-
"CNIG_TABLE_MISSING_PRESENCE_OPTIONAL_ATTRIBUTE"
25-
);
23+
public static final ErrorCode CNIG_TABLE_MISSING_PRESENCE_OPTIONAL_ATTRIBUTE = ErrorCode
24+
.valueOf("CNIG_TABLE_MISSING_PRESENCE_OPTIONAL_ATTRIBUTE");
2625

2726
/**
2827
* DU - Reported when ZONE_URBA.IDURBA doesn't match any format
@@ -44,96 +43,74 @@ public class CnigErrorCodes {
4443
/**
4544
* DU/PLUi- Reported when less than one row are found in DOC_URBA_COM
4645
*/
47-
public static final ErrorCode CNIG_DOC_URBA_COM_UNEXPECTED_SIZE = ErrorCode.valueOf(
48-
"CNIG_DOC_URBA_COM_UNEXPECTED_SIZE"
49-
);
46+
public static final ErrorCode CNIG_DOC_URBA_COM_UNEXPECTED_SIZE = ErrorCode
47+
.valueOf("CNIG_DOC_URBA_COM_UNEXPECTED_SIZE");
5048

5149
/**
5250
* SCOT - Reported when number of rows in PERIMETRE_SCOT is not 1
5351
*/
54-
public static final ErrorCode CNIG_PERIMETRE_SCOT_UNEXPECTED_SIZE = ErrorCode.valueOf(
55-
"CNIG_PERIMETRE_SCOT_UNEXPECTED_SIZE"
56-
);
52+
public static final ErrorCode CNIG_PERIMETRE_SCOT_UNEXPECTED_SIZE = ErrorCode
53+
.valueOf("CNIG_PERIMETRE_SCOT_UNEXPECTED_SIZE");
5754

5855
/**
5956
* SUP - Reported when IDGEN is not unique in GENERATEUR_SUP_P/L/S tables
6057
*/
61-
public static final ErrorCode CNIG_SUP_IDGEN_NOT_UNIQUE = ErrorCode.valueOf(
62-
"CNIG_SUP_IDGEN_NOT_UNIQUE"
63-
);
58+
public static final ErrorCode CNIG_SUP_IDGEN_NOT_UNIQUE = ErrorCode.valueOf("CNIG_SUP_IDGEN_NOT_UNIQUE");
6459
/**
6560
* SUP - Reported when IDASS is not unique in ASSIETTE_SUP_P/L/S tables
6661
*/
67-
public static final ErrorCode CNIG_SUP_IDASS_NOT_UNIQUE = ErrorCode.valueOf(
68-
"CNIG_SUP_IDASS_NOT_UNIQUE"
69-
);
62+
public static final ErrorCode CNIG_SUP_IDASS_NOT_UNIQUE = ErrorCode.valueOf("CNIG_SUP_IDASS_NOT_UNIQUE");
7063
/**
7164
* SUP - Reported when IDGEN referenced by an ASSIETTE_SUP_P/L/S table is not
7265
* found in GENERATEUR_SUP_P/L/S table.
7366
*/
74-
public static final ErrorCode CNIG_SUP_IDGEN_NOT_FOUND = ErrorCode.valueOf(
75-
"CNIG_SUP_IDGEN_NOT_FOUND"
76-
);
67+
public static final ErrorCode CNIG_SUP_IDGEN_NOT_FOUND = ErrorCode.valueOf("CNIG_SUP_IDGEN_NOT_FOUND");
7768
/**
7869
* SUP - reported when no generateur / assiette file found
7970
*/
8071
public static final ErrorCode CNIG_GENERATEUR_SUP_NOT_FOUND = ErrorCode.valueOf("CNIG_GENERATEUR_SUP_NOT_FOUND");
8172
public static final ErrorCode CNIG_ASSIETTE_SUP_NOT_FOUND = ErrorCode.valueOf("CNIG_ASSIETTE_SUP_NOT_FOUND");
8273

83-
public static final ErrorCode CNIG_METADATA_SPECIFICATION_NOT_FOUND = ErrorCode.valueOf(
84-
"CNIG_METADATA_SPECIFICATION_NOT_FOUND"
85-
);
74+
public static final ErrorCode CNIG_PRESCRIPTION_NOT_FOUND = ErrorCode.valueOf("CNIG_PRESCRIPTION_NOT_FOUND");
75+
76+
public static final ErrorCode CNIG_METADATA_SPECIFICATION_NOT_FOUND = ErrorCode
77+
.valueOf("CNIG_METADATA_SPECIFICATION_NOT_FOUND");
8678

8779
public static final ErrorCode CNIG_METADATA_TYPE_INVALID = ErrorCode.valueOf("CNIG_METADATA_TYPE_INVALID");
88-
public static final ErrorCode CNIG_METADATA_DATEOFLASTREVISION_NOT_FOUND = ErrorCode.valueOf(
89-
"CNIG_METADATA_DATEOFLASTREVISION_NOT_FOUND"
90-
);
91-
92-
public static final ErrorCode CNIG_METADATA_REFERENCESYSTEMIDENTIFIER_NOT_FOUND = ErrorCode.valueOf(
93-
"CNIG_METADATA_REFERENCESYSTEMIDENTIFIER_NOT_FOUND"
94-
);
95-
public static final ErrorCode CNIG_METADATA_REFERENCESYSTEMIDENTIFIER_CODE_NOT_FOUND = ErrorCode.valueOf(
96-
"CNIG_METADATA_REFERENCESYSTEMIDENTIFIER_CODE_NOT_FOUND"
97-
);
98-
public static final ErrorCode CNIG_METADATA_REFERENCESYSTEMIDENTIFIER_CODE_INVALID = ErrorCode.valueOf(
99-
"CNIG_METADATA_REFERENCESYSTEMIDENTIFIER_CODE_INVALID"
100-
);
101-
public static final ErrorCode CNIG_METADATA_REFERENCESYSTEMIDENTIFIER_URI_NOT_FOUND = ErrorCode.valueOf(
102-
"CNIG_METADATA_REFERENCESYSTEMIDENTIFIER_URI_NOT_FOUND"
103-
);
104-
public static final ErrorCode CNIG_METADATA_REFERENCESYSTEMIDENTIFIER_URI_UNEXPECTED = ErrorCode.valueOf(
105-
"CNIG_METADATA_REFERENCESYSTEMIDENTIFIER_URI_UNEXPECTED"
106-
);
107-
108-
public static final ErrorCode CNIG_METADATA_KEYWORD_NOT_FOUND = ErrorCode.valueOf(
109-
"CNIG_METADATA_KEYWORD_NOT_FOUND"
110-
);
111-
public static final ErrorCode CNIG_METADATA_KEYWORD_INVALID = ErrorCode.valueOf(
112-
"CNIG_METADATA_KEYWORD_INVALID"
113-
);
80+
public static final ErrorCode CNIG_METADATA_DATEOFLASTREVISION_NOT_FOUND = ErrorCode
81+
.valueOf("CNIG_METADATA_DATEOFLASTREVISION_NOT_FOUND");
82+
83+
public static final ErrorCode CNIG_METADATA_REFERENCESYSTEMIDENTIFIER_NOT_FOUND = ErrorCode
84+
.valueOf("CNIG_METADATA_REFERENCESYSTEMIDENTIFIER_NOT_FOUND");
85+
public static final ErrorCode CNIG_METADATA_REFERENCESYSTEMIDENTIFIER_CODE_NOT_FOUND = ErrorCode
86+
.valueOf("CNIG_METADATA_REFERENCESYSTEMIDENTIFIER_CODE_NOT_FOUND");
87+
public static final ErrorCode CNIG_METADATA_REFERENCESYSTEMIDENTIFIER_CODE_INVALID = ErrorCode
88+
.valueOf("CNIG_METADATA_REFERENCESYSTEMIDENTIFIER_CODE_INVALID");
89+
public static final ErrorCode CNIG_METADATA_REFERENCESYSTEMIDENTIFIER_URI_NOT_FOUND = ErrorCode
90+
.valueOf("CNIG_METADATA_REFERENCESYSTEMIDENTIFIER_URI_NOT_FOUND");
91+
public static final ErrorCode CNIG_METADATA_REFERENCESYSTEMIDENTIFIER_URI_UNEXPECTED = ErrorCode
92+
.valueOf("CNIG_METADATA_REFERENCESYSTEMIDENTIFIER_URI_UNEXPECTED");
93+
94+
public static final ErrorCode CNIG_METADATA_KEYWORD_NOT_FOUND = ErrorCode
95+
.valueOf("CNIG_METADATA_KEYWORD_NOT_FOUND");
96+
public static final ErrorCode CNIG_METADATA_KEYWORD_INVALID = ErrorCode.valueOf("CNIG_METADATA_KEYWORD_INVALID");
11497

11598
/**
11699
* Report geometry not suitable for web broadcasting
117100
*/
118-
public static final ErrorCode CNIG_GEOMETRY_COMPLEXITY_WARNING = ErrorCode.valueOf(
119-
"CNIG_GEOMETRY_COMPLEXITY_WARNING"
120-
);
121-
public static final ErrorCode CNIG_GEOMETRY_COMPLEXITY_ERROR = ErrorCode.valueOf(
122-
"CNIG_GEOMETRY_COMPLEXITY_ERROR"
123-
);
101+
public static final ErrorCode CNIG_GEOMETRY_COMPLEXITY_WARNING = ErrorCode
102+
.valueOf("CNIG_GEOMETRY_COMPLEXITY_WARNING");
103+
public static final ErrorCode CNIG_GEOMETRY_COMPLEXITY_ERROR = ErrorCode.valueOf("CNIG_GEOMETRY_COMPLEXITY_ERROR");
124104

125105
/**
126106
* Report geometry outsite the declared document emprise
127107
*/
128-
public static final ErrorCode CNIG_GEOMETRY_OUTSIDE_DOCUMENT_EMPRISE_ERROR = ErrorCode.valueOf(
129-
"CNIG_GEOMETRY_OUTSIDE_DOCUMENT_EMPRISE_ERROR"
130-
);
108+
public static final ErrorCode CNIG_GEOMETRY_OUTSIDE_DOCUMENT_EMPRISE_ERROR = ErrorCode
109+
.valueOf("CNIG_GEOMETRY_OUTSIDE_DOCUMENT_EMPRISE_ERROR");
131110

132111
/**
133112
* To report "88" instead of "088"
134113
*/
135-
public static final ErrorCode CNIG_SUP_BAD_TERRITORY_CODE = ErrorCode.valueOf(
136-
"CNIG_SUP_BAD_TERRITORY_CODE"
137-
);
114+
public static final ErrorCode CNIG_SUP_BAD_TERRITORY_CODE = ErrorCode.valueOf("CNIG_SUP_BAD_TERRITORY_CODE");
138115

139116
}
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
package fr.ign.validator.cnig.validation.document;
2+
3+
import org.apache.logging.log4j.LogManager;
4+
import org.apache.logging.log4j.Logger;
5+
import org.apache.logging.log4j.Marker;
6+
import org.apache.logging.log4j.MarkerManager;
7+
8+
import fr.ign.validator.Context;
9+
import fr.ign.validator.ValidatorListener;
10+
import fr.ign.validator.cnig.error.CnigErrorCodes;
11+
import fr.ign.validator.cnig.model.DocumentModelName;
12+
import fr.ign.validator.data.Document;
13+
import fr.ign.validator.data.DocumentFile;
14+
import fr.ign.validator.model.FileModel;
15+
import fr.ign.validator.model.TableModel;
16+
import fr.ign.validator.validation.Validator;
17+
18+
public class AtLeastOnePrescriptionValidator implements Validator<Document>, ValidatorListener {
19+
20+
public static final Logger log = LogManager.getRootLogger();
21+
public static final Marker MARKER = MarkerManager.getMarker("AtLeastOnePrescriptionValidator");
22+
23+
@Override
24+
public void validate(Context context, Document document) {
25+
boolean hasPrescription = false;
26+
for (FileModel fileModel : document.getDocumentModel().getFileModels()) {
27+
if (fileModel.getName().contains("PRESCRIPTION")) {
28+
hasPrescription = true;
29+
}
30+
}
31+
if (!hasPrescription) {
32+
log.info(MARKER, "Skip control if document model has no PRESCRIPTION table.");
33+
return;
34+
}
35+
log.info(MARKER, "Ensure that document contains at least one PRESCRIPTION file...");
36+
int count = 0;
37+
for (DocumentFile documentFile : document.getDocumentFiles()) {
38+
if (!(documentFile.getFileModel() instanceof TableModel)) {
39+
continue;
40+
}
41+
if (documentFile.getFileModel().getName().contains("PRESCRIPTION")) {
42+
count++;
43+
}
44+
}
45+
log.info(MARKER, "Found {} PRESCRIPTION file(s).", count);
46+
if (count == 0) {
47+
context.report(CnigErrorCodes.CNIG_PRESCRIPTION_NOT_FOUND);
48+
}
49+
}
50+
51+
@Override
52+
public void beforeMatching(Context context, Document document) throws Exception {
53+
54+
}
55+
56+
@Override
57+
public void beforeValidate(Context context, Document document) throws Exception {
58+
document.getDocumentModel().addValidator(this);
59+
}
60+
61+
@Override
62+
public void afterValidate(Context context, Document document) throws Exception {
63+
64+
}
65+
66+
}

0 commit comments

Comments
 (0)