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}