001package org.gbif.api.vocabulary; 002 003import static org.gbif.api.vocabulary.InterpretationRemarkSeverity.INFO; 004 005import java.util.Arrays; 006import java.util.Collections; 007import java.util.HashSet; 008import java.util.Set; 009import org.gbif.api.util.AnnotationUtils; 010import org.gbif.dwc.terms.EcoTerm; 011import org.gbif.dwc.terms.Term; 012 013public enum EventIssue implements InterpretationRemark { 014 /** See {@link OccurrenceIssue#ZERO_COORDINATE}. */ 015 ZERO_COORDINATE(OccurrenceIssue.ZERO_COORDINATE), 016 /** See {@link OccurrenceIssue#COORDINATE_OUT_OF_RANGE}. */ 017 COORDINATE_OUT_OF_RANGE(OccurrenceIssue.COORDINATE_OUT_OF_RANGE), 018 /** See {@link OccurrenceIssue#COORDINATE_INVALID}. */ 019 COORDINATE_INVALID(OccurrenceIssue.COORDINATE_INVALID), 020 /** See {@link OccurrenceIssue#COORDINATE_ROUNDED}. */ 021 COORDINATE_ROUNDED(OccurrenceIssue.COORDINATE_ROUNDED), 022 /** See {@link OccurrenceIssue#GEODETIC_DATUM_INVALID}. */ 023 GEODETIC_DATUM_INVALID(OccurrenceIssue.GEODETIC_DATUM_INVALID), 024 /** See {@link OccurrenceIssue#GEODETIC_DATUM_ASSUMED_WGS84}. */ 025 GEODETIC_DATUM_ASSUMED_WGS84(OccurrenceIssue.GEODETIC_DATUM_ASSUMED_WGS84), 026 /** See {@link OccurrenceIssue#COORDINATE_REPROJECTED}. */ 027 COORDINATE_REPROJECTED(OccurrenceIssue.COORDINATE_REPROJECTED), 028 /** See {@link OccurrenceIssue#COORDINATE_REPROJECTION_FAILED}. */ 029 COORDINATE_REPROJECTION_FAILED(OccurrenceIssue.COORDINATE_REPROJECTION_FAILED), 030 /** See {@link OccurrenceIssue#COORDINATE_REPROJECTION_SUSPICIOUS}. */ 031 COORDINATE_REPROJECTION_SUSPICIOUS(OccurrenceIssue.COORDINATE_REPROJECTION_SUSPICIOUS), 032 /** See {@link OccurrenceIssue#COORDINATE_ACCURACY_INVALID}. */ 033 @Deprecated // see POR-3061 034 COORDINATE_ACCURACY_INVALID(OccurrenceIssue.COORDINATE_ACCURACY_INVALID), 035 /** See {@link OccurrenceIssue#COORDINATE_PRECISION_INVALID}. */ 036 COORDINATE_PRECISION_INVALID(OccurrenceIssue.COORDINATE_PRECISION_INVALID), 037 /** See {@link OccurrenceIssue#COORDINATE_UNCERTAINTY_METERS_INVALID}. */ 038 COORDINATE_UNCERTAINTY_METERS_INVALID(OccurrenceIssue.COORDINATE_UNCERTAINTY_METERS_INVALID), 039 /** See {@link OccurrenceIssue#COORDINATE_PRECISION_UNCERTAINTY_MISMATCH}. */ 040 @Deprecated // see POR-1804 041 COORDINATE_PRECISION_UNCERTAINTY_MISMATCH( 042 OccurrenceIssue.COORDINATE_PRECISION_UNCERTAINTY_MISMATCH), 043 /** See {@link OccurrenceIssue#FOOTPRINT_SRS_INVALID}. */ 044 FOOTPRINT_SRS_INVALID(OccurrenceIssue.FOOTPRINT_SRS_INVALID), 045 /** See {@link OccurrenceIssue#FOOTPRINT_WKT_MISMATCH}. */ 046 FOOTPRINT_WKT_MISMATCH(OccurrenceIssue.FOOTPRINT_WKT_MISMATCH), 047 /** See {@link OccurrenceIssue#FOOTPRINT_WKT_INVALID}. */ 048 FOOTPRINT_WKT_INVALID(OccurrenceIssue.FOOTPRINT_WKT_INVALID), 049 /** See {@link OccurrenceIssue#COUNTRY_COORDINATE_MISMATCH}. */ 050 COUNTRY_COORDINATE_MISMATCH(OccurrenceIssue.COUNTRY_COORDINATE_MISMATCH), 051 /** See {@link OccurrenceIssue#COUNTRY_MISMATCH}. */ 052 COUNTRY_MISMATCH(OccurrenceIssue.COUNTRY_MISMATCH), 053 /** See {@link OccurrenceIssue#COUNTRY_INVALID}. */ 054 COUNTRY_INVALID(OccurrenceIssue.COUNTRY_INVALID), 055 /** See {@link OccurrenceIssue#COUNTRY_DERIVED_FROM_COORDINATES}. */ 056 COUNTRY_DERIVED_FROM_COORDINATES(OccurrenceIssue.COUNTRY_DERIVED_FROM_COORDINATES), 057 /** See {@link OccurrenceIssue#CONTINENT_COORDINATE_MISMATCH}. */ 058 CONTINENT_COORDINATE_MISMATCH(OccurrenceIssue.CONTINENT_COORDINATE_MISMATCH), 059 /** See {@link OccurrenceIssue#CONTINENT_COUNTRY_MISMATCH}. */ 060 CONTINENT_COUNTRY_MISMATCH(OccurrenceIssue.CONTINENT_COUNTRY_MISMATCH), 061 /** See {@link OccurrenceIssue#CONTINENT_INVALID}. */ 062 CONTINENT_INVALID(OccurrenceIssue.CONTINENT_INVALID), 063 /** See {@link OccurrenceIssue#CONTINENT_DERIVED_FROM_COUNTRY}. */ 064 CONTINENT_DERIVED_FROM_COUNTRY(OccurrenceIssue.CONTINENT_DERIVED_FROM_COUNTRY), 065 /** See {@link OccurrenceIssue#CONTINENT_DERIVED_FROM_COORDINATES}. */ 066 CONTINENT_DERIVED_FROM_COORDINATES(OccurrenceIssue.CONTINENT_DERIVED_FROM_COORDINATES), 067 /** See {@link OccurrenceIssue#PRESUMED_SWAPPED_COORDINATE}. */ 068 PRESUMED_SWAPPED_COORDINATE(OccurrenceIssue.PRESUMED_SWAPPED_COORDINATE), 069 /** See {@link OccurrenceIssue#PRESUMED_NEGATED_LONGITUDE}. */ 070 PRESUMED_NEGATED_LONGITUDE(OccurrenceIssue.PRESUMED_NEGATED_LONGITUDE), 071 /** See {@link OccurrenceIssue#PRESUMED_NEGATED_LATITUDE}. */ 072 PRESUMED_NEGATED_LATITUDE(OccurrenceIssue.PRESUMED_NEGATED_LATITUDE), 073 /** See {@link OccurrenceIssue#SUSPECTED_SWAPPED_COORDINATE}. */ 074 SUSPECTED_SWAPPED_COORDINATE(OccurrenceIssue.PRESUMED_SWAPPED_COORDINATE), 075 /** See {@link OccurrenceIssue#SUSPECTED_NEGATED_LONGITUDE}. */ 076 SUSPECTED_NEGATED_LONGITUDE(OccurrenceIssue.PRESUMED_NEGATED_LONGITUDE), 077 /** See {@link OccurrenceIssue#SUSPECTED_NEGATED_LATITUDE}. */ 078 SUSPECTED_NEGATED_LATITUDE(OccurrenceIssue.PRESUMED_NEGATED_LATITUDE), 079 /** See {@link OccurrenceIssue#RECORDED_DATE_MISMATCH}. */ 080 RECORDED_DATE_MISMATCH(OccurrenceIssue.RECORDED_DATE_MISMATCH), 081 /** See {@link OccurrenceIssue#RECORDED_DATE_INVALID}. */ 082 RECORDED_DATE_INVALID(OccurrenceIssue.RECORDED_DATE_INVALID), 083 /** See {@link OccurrenceIssue#RECORDED_DATE_UNLIKELY}. */ 084 RECORDED_DATE_UNLIKELY(OccurrenceIssue.RECORDED_DATE_UNLIKELY), 085 /** See {@link OccurrenceIssue#TAXON_MATCH_FUZZY}. */ 086 TAXON_MATCH_FUZZY(OccurrenceIssue.TAXON_MATCH_FUZZY), 087 /** See {@link OccurrenceIssue#TAXON_MATCH_HIGHERRANK}. */ 088 TAXON_MATCH_HIGHERRANK(OccurrenceIssue.TAXON_MATCH_HIGHERRANK), 089 /** See {@link OccurrenceIssue#TAXON_MATCH_AGGREGATE}. */ 090 TAXON_MATCH_AGGREGATE(OccurrenceIssue.TAXON_MATCH_AGGREGATE), 091 /** See {@link OccurrenceIssue#TAXON_MATCH_SCIENTIFIC_NAME_ID_IGNORED}. */ 092 TAXON_MATCH_SCIENTIFIC_NAME_ID_IGNORED(OccurrenceIssue.TAXON_MATCH_SCIENTIFIC_NAME_ID_IGNORED), 093 /** See {@link OccurrenceIssue#TAXON_MATCH_TAXON_CONCEPT_ID_IGNORED}. */ 094 TAXON_MATCH_TAXON_CONCEPT_ID_IGNORED(OccurrenceIssue.TAXON_MATCH_TAXON_CONCEPT_ID_IGNORED), 095 /** See {@link OccurrenceIssue#TAXON_MATCH_TAXON_ID_IGNORED}. */ 096 TAXON_MATCH_TAXON_ID_IGNORED(OccurrenceIssue.TAXON_MATCH_TAXON_ID_IGNORED), 097 /** See {@link OccurrenceIssue#SCIENTIFIC_NAME_ID_NOT_FOUND}. */ 098 SCIENTIFIC_NAME_ID_NOT_FOUND(OccurrenceIssue.SCIENTIFIC_NAME_ID_NOT_FOUND), 099 /** See {@link OccurrenceIssue#TAXON_CONCEPT_ID_NOT_FOUND}. */ 100 TAXON_CONCEPT_ID_NOT_FOUND(OccurrenceIssue.TAXON_CONCEPT_ID_NOT_FOUND), 101 /** See {@link OccurrenceIssue#TAXON_ID_NOT_FOUND}. */ 102 TAXON_ID_NOT_FOUND(OccurrenceIssue.TAXON_ID_NOT_FOUND), 103 /** See {@link OccurrenceIssue#SCIENTIFIC_NAME_AND_ID_INCONSISTENT}. */ 104 SCIENTIFIC_NAME_AND_ID_INCONSISTENT(OccurrenceIssue.SCIENTIFIC_NAME_AND_ID_INCONSISTENT), 105 /** See {@link OccurrenceIssue#TAXON_MATCH_NONE}. */ 106 TAXON_MATCH_NONE(OccurrenceIssue.TAXON_MATCH_NONE), 107 /** See {@link OccurrenceIssue#TAXON_MATCH_NAME_AND_ID_AMBIGUOUS}. */ 108 TAXON_MATCH_NAME_AND_ID_AMBIGUOUS(OccurrenceIssue.TAXON_MATCH_NAME_AND_ID_AMBIGUOUS), 109 /** See {@link OccurrenceIssue#DEPTH_NOT_METRIC}. */ 110 DEPTH_NOT_METRIC(OccurrenceIssue.DEPTH_NOT_METRIC), 111 /** See {@link OccurrenceIssue#DEPTH_UNLIKELY}. */ 112 DEPTH_UNLIKELY(OccurrenceIssue.DEPTH_UNLIKELY), 113 /** See {@link OccurrenceIssue#DEPTH_MIN_MAX_SWAPPED}. */ 114 DEPTH_MIN_MAX_SWAPPED(OccurrenceIssue.DEPTH_MIN_MAX_SWAPPED), 115 /** See {@link OccurrenceIssue#DEPTH_NON_NUMERIC}. */ 116 DEPTH_NON_NUMERIC(OccurrenceIssue.DEPTH_NON_NUMERIC), 117 /** See {@link OccurrenceIssue#ELEVATION_UNLIKELY}. */ 118 ELEVATION_UNLIKELY(OccurrenceIssue.ELEVATION_UNLIKELY), 119 /** See {@link OccurrenceIssue#ELEVATION_MIN_MAX_SWAPPED}. */ 120 ELEVATION_MIN_MAX_SWAPPED(OccurrenceIssue.ELEVATION_MIN_MAX_SWAPPED), 121 /** See {@link OccurrenceIssue#ELEVATION_NOT_METRIC}. */ 122 ELEVATION_NOT_METRIC(OccurrenceIssue.ELEVATION_NOT_METRIC), 123 /** See {@link OccurrenceIssue#ELEVATION_NON_NUMERIC}. */ 124 ELEVATION_NON_NUMERIC(OccurrenceIssue.ELEVATION_NON_NUMERIC), 125 /** See {@link OccurrenceIssue#MODIFIED_DATE_INVALID}. */ 126 MODIFIED_DATE_INVALID(OccurrenceIssue.MODIFIED_DATE_INVALID), 127 /** See {@link OccurrenceIssue#MODIFIED_DATE_UNLIKELY}. */ 128 MODIFIED_DATE_UNLIKELY(OccurrenceIssue.MODIFIED_DATE_UNLIKELY), 129 /** See {@link OccurrenceIssue#IDENTIFIED_DATE_UNLIKELY}. */ 130 IDENTIFIED_DATE_UNLIKELY(OccurrenceIssue.IDENTIFIED_DATE_UNLIKELY), 131 /** See {@link OccurrenceIssue#IDENTIFIED_DATE_INVALID}. */ 132 IDENTIFIED_DATE_INVALID(OccurrenceIssue.IDENTIFIED_DATE_INVALID), 133 134 /** See {@link OccurrenceIssue#TYPE_STATUS_INVALID}. */ 135 TYPE_STATUS_INVALID(OccurrenceIssue.TYPE_STATUS_INVALID), 136 /** See {@link OccurrenceIssue#SUSPECTED_TYPE}. */ 137 SUSPECTED_TYPE(OccurrenceIssue.SUSPECTED_TYPE), 138 /** See {@link OccurrenceIssue#MULTIMEDIA_DATE_INVALID}. */ 139 MULTIMEDIA_DATE_INVALID(OccurrenceIssue.MULTIMEDIA_DATE_INVALID), 140 /** See {@link OccurrenceIssue#MULTIMEDIA_URI_INVALID}. */ 141 MULTIMEDIA_URI_INVALID(OccurrenceIssue.MULTIMEDIA_URI_INVALID), 142 /** See {@link OccurrenceIssue#REFERENCES_URI_INVALID}. */ 143 REFERENCES_URI_INVALID(OccurrenceIssue.REFERENCES_URI_INVALID), 144 /** See {@link OccurrenceIssue#INTERPRETATION_ERROR}. */ 145 INTERPRETATION_ERROR(OccurrenceIssue.INTERPRETATION_ERROR), 146 /** See {@link OccurrenceIssue#GEOREFERENCED_DATE_UNLIKELY}. */ 147 GEOREFERENCED_DATE_UNLIKELY(OccurrenceIssue.GEOREFERENCED_DATE_UNLIKELY), 148 /** See {@link OccurrenceIssue#GEOREFERENCED_DATE_INVALID}. */ 149 GEOREFERENCED_DATE_INVALID(OccurrenceIssue.GEOREFERENCED_DATE_INVALID), 150 151 /** 152 * The geospatial scope area is always greater than or equal to the total area sampled as stated 153 * in the (<a href="https://eco.tdwg.org/list/#eco_geospatialScopeAreaValue">term definition</a>). 154 */ 155 GEOSPATIAL_SCOPE_AREA_LOWER_THAN_TOTAL_AREA_SAMPLED( 156 INFO, EcoTerm.geospatialScopeAreaValue, EcoTerm.totalAreaSampledValue), 157 158 /** An eco:eventDurationValue must have a corresponding eco:eventDurationUnit. */ 159 EVENT_DURATION_UNIT_MISSING(INFO, EcoTerm.eventDurationUnit), 160 161 /** An eco:geospatialScopeAreaValue must have a corresponding eco:geospatialScopeAreaUnit. */ 162 GEOSPATIAL_SCOPE_AREA_UNIT_MISSING(INFO, EcoTerm.geospatialScopeAreaUnit), 163 164 /** An eco:samplingEffortValue must have a corresponding eco:samplingEffortUnit. */ 165 SAMPLING_EFFORT_UNIT_MISSING(INFO, EcoTerm.samplingEffortUnit), 166 167 /** An eco:totalAreaSampledValue must have a corresponding eco:totalAreaSampledUnit. */ 168 TOTAL_AREA_SAMPLED_UNIT_MISSING(INFO, EcoTerm.samplingEffortUnit), 169 170 /** Non target taxa has been provided but the eco:hasNonTargetTaxa is set to false. */ 171 HAS_NON_TARGET_TAXA_MISMATCH(INFO, EcoTerm.hasNonTargetTaxa), 172 173 /** Material sample types have been provided but the eco:hasMaterialSamples is set to false. */ 174 HAS_MATERIAL_SAMPLES_MISMATCH(INFO, EcoTerm.hasMaterialSamples), 175 176 /** Some target taxonomic scope has been excluded. */ 177 TARGET_TAXONOMIC_SCOPE_EXCLUDED( 178 INFO, EcoTerm.targetTaxonomicScope, EcoTerm.excludedTaxonomicScope), 179 180 /** Some target habitat scope has been excluded. */ 181 TARGET_HABITAT_SCOPE_EXCLUDED(INFO, EcoTerm.targetHabitatScope, EcoTerm.excludedHabitatScope), 182 183 /** Some target life stage scope has been excluded. */ 184 TARGET_LIFE_STAGE_SCOPE_EXCLUDED( 185 INFO, EcoTerm.targetLifeStageScope, EcoTerm.excludedLifeStageScope), 186 187 /** Some target degree of establishment scope has been excluded. */ 188 TARGET_DEGREE_OF_ESTABLISHMENT_EXCLUDED( 189 INFO, EcoTerm.targetDegreeOfEstablishmentScope, EcoTerm.excludedDegreeOfEstablishmentScope), 190 191 /** Some target growth form scope has been excluded. */ 192 TARGET_GROWTH_FORM_EXCLUDED(INFO, EcoTerm.targetGrowthFormScope, EcoTerm.excludedGrowthFormScope), 193 194 /** Invalid value for numeric fields in Humboldt extension. */ 195 SITE_COUNT_INVALID(INFO, EcoTerm.siteCount), 196 GEOSPATIAL_SCOPE_AREA_VALUE_INVALID(INFO, EcoTerm.geospatialScopeAreaValue), 197 TOTAL_AREA_SAMPLED_VALUE_INVALID(INFO, EcoTerm.totalAreaSampledValue), 198 EVENT_DURATION_VALUE_INVALID(INFO, EcoTerm.eventDurationValue), 199 SAMPLING_EFFORT_VALUE_INVALID(INFO, EcoTerm.samplingEffortValue), 200 ABUNDANCE_CAP_INVALID(INFO, EcoTerm.abundanceCap), 201 202 /** Invalid value for boolean fields in Humboldt extension. */ 203 IS_TAXONOMIC_SCOPE_FULLY_REPORTED_INVALID(INFO, EcoTerm.isTaxonomicScopeFullyReported), 204 IS_ABSENCE_REPORTED_INVALID(INFO, EcoTerm.isAbsenceReported), 205 HAS_NON_TARGET_TAXA_INVALID(INFO, EcoTerm.hasNonTargetTaxa), 206 ARE_NON_TARGET_TAXA_FULLY_REPORTED_INVALID(INFO, EcoTerm.areNonTargetTaxaFullyReported), 207 IS_LIFE_STAGE_SCOPE_FULLY_REPORTED_INVALID(INFO, EcoTerm.isLifeStageScopeFullyReported), 208 IS_DEGREE_OF_ESTABLISHMENT_SCOPE_FULLY_REPORTED_INVALID( 209 INFO, EcoTerm.isDegreeOfEstablishmentScopeFullyReported), 210 IS_GROWTH_FORM_SCOPE_FULLY_REPORTED_INVALID(INFO, EcoTerm.isGrowthFormScopeFullyReported), 211 HAS_NON_TARGET_ORGANISMS_INVALID(INFO, EcoTerm.hasNonTargetOrganisms), 212 IS_ABUNDANCE_REPORTED_INVALID(INFO, EcoTerm.isAbundanceReported), 213 IS_ABUNDANCE_CAP_REPORTED_INVALID(INFO, EcoTerm.isAbundanceCapReported), 214 IS_VEGETATION_COVER_REPORTED_INVALID(INFO, EcoTerm.isVegetationCoverReported), 215 IS_LEAST_SPECIFIC_TARGET_CATEGORY_QUANTITY_INCLUSIVE_INVALID( 216 INFO, EcoTerm.isLeastSpecificTargetCategoryQuantityInclusive), 217 HAS_VOUCHERS_INVALID(INFO, EcoTerm.hasVouchers), 218 HAS_MATERIAL_SAMPLES_INVALID(INFO, EcoTerm.hasMaterialSamples), 219 IS_SAMPLING_EFFORT_REPORTED_INVALID(INFO, EcoTerm.isSamplingEffortReported); 220 221 private final Set<Term> relatedTerms; 222 private final InterpretationRemarkSeverity severity; 223 private final boolean isDeprecated; 224 225 EventIssue(OccurrenceIssue occurrenceIssue) { 226 this.severity = occurrenceIssue.getSeverity(); 227 this.relatedTerms = occurrenceIssue.getRelatedTerms(); 228 this.isDeprecated = occurrenceIssue.isDeprecated(); 229 } 230 231 /** {@link EventIssue} not linked to any specific {@link Term}. */ 232 EventIssue(InterpretationRemarkSeverity severity) { 233 this.severity = severity; 234 this.relatedTerms = Collections.emptySet(); 235 this.isDeprecated = AnnotationUtils.isFieldDeprecated(EventIssue.class, this.name()); 236 } 237 238 /** {@link EventIssue} linked to the provided {@link Term}. */ 239 EventIssue(InterpretationRemarkSeverity severity, Term... relatedTerms) { 240 this.severity = severity; 241 this.relatedTerms = Collections.unmodifiableSet(new HashSet<>(Arrays.asList(relatedTerms))); 242 this.isDeprecated = AnnotationUtils.isFieldDeprecated(EventIssue.class, this.name()); 243 } 244 245 @Override 246 public String getId() { 247 return name(); 248 } 249 250 @Override 251 public Set<Term> getRelatedTerms() { 252 return relatedTerms; 253 } 254 255 @Override 256 public InterpretationRemarkSeverity getSeverity() { 257 return severity; 258 } 259 260 @Override 261 public boolean isDeprecated() { 262 return isDeprecated; 263 } 264}