001/*
002 * Licensed under the Apache License, Version 2.0 (the "License");
003 * you may not use this file except in compliance with the License.
004 * You may obtain a copy of the License at
005 *
006 *     http://www.apache.org/licenses/LICENSE-2.0
007 *
008 * Unless required by applicable law or agreed to in writing, software
009 * distributed under the License is distributed on an "AS IS" BASIS,
010 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
011 * See the License for the specific language governing permissions and
012 * limitations under the License.
013 */
014package org.gbif.common.parsers.core;
015
016import org.gbif.api.vocabulary.OccurrenceIssue;
017
018import java.util.ArrayList;
019import java.util.Arrays;
020import java.util.Collection;
021import java.util.Collections;
022import java.util.EnumSet;
023import java.util.List;
024import java.util.Objects;
025import java.util.Set;
026
027public class OccurrenceParseResult<T> extends ParseResult<T> {
028  private final Set<OccurrenceIssue> issues = EnumSet.noneOf(OccurrenceIssue.class);
029
030  public OccurrenceParseResult(STATUS status, CONFIDENCE confidence, T payload, List<T> alternativePayloads, Throwable error, Collection<OccurrenceIssue> issues) {
031    super(status, confidence, payload, alternativePayloads, error);
032    if (issues != null) {
033      // add non nulls only
034      issues.stream()
035          .filter(Objects::nonNull)
036          .forEach(this.issues::add);
037    }
038  }
039
040  public OccurrenceParseResult(STATUS status, CONFIDENCE confidence, T payload, List<T> alternativePayloads, Throwable error) {
041    super(status, confidence, payload, alternativePayloads, error);
042  }
043
044  public OccurrenceParseResult(ParseResult<T> result) {
045    super(result.getStatus(), result.getConfidence(), result.getPayload(), result.getAlternativePayloads(), result.getError());
046  }
047
048  /**
049   * @param <T>       The generic type of the payload
050   * @param confidence The confidence in the result
051   * @param payload    The payload of the parse result
052   *
053   * @return The new ParseResult which has no error and status of SUCCESS
054   */
055  public static <T> OccurrenceParseResult<T> success(CONFIDENCE confidence, T payload) {
056    return new OccurrenceParseResult<>(STATUS.SUCCESS, confidence, payload, null, null);
057  }
058
059  /**
060   * @return A new parse response with only the status set to FAIL
061   */
062  public static <T> OccurrenceParseResult<T> fail() {
063    return new OccurrenceParseResult<>(STATUS.FAIL, null, null, null, null);
064  }
065
066  /**
067   * @return A new parse response configured to indicate an error
068   */
069  public static <T> OccurrenceParseResult<T> error() {
070    return new OccurrenceParseResult<>(STATUS.ERROR, null, null, null, null);
071  }
072
073  /**
074   * @param cause The cause of the error
075   *
076   * @return A new parse response configured with error and the cause
077   */
078  public static <T> OccurrenceParseResult<T> error(Throwable cause) {
079    return new OccurrenceParseResult<>(STATUS.ERROR, null, null, null, cause);
080  }
081
082  public static <T> OccurrenceParseResult<T> success(CONFIDENCE confidence, T payload, OccurrenceIssue issue) {
083    return new OccurrenceParseResult<>(STATUS.SUCCESS, confidence, payload, null, null, new ArrayList<>(Collections.singletonList(issue)));
084  }
085
086  public static <T> OccurrenceParseResult<T> success(CONFIDENCE confidence, T payload, OccurrenceIssue ... issues) {
087    return new OccurrenceParseResult<>(STATUS.SUCCESS, confidence, payload, null, null, new ArrayList<>(Arrays.asList(issues)));
088  }
089
090  public static <T> OccurrenceParseResult<T> success(CONFIDENCE confidence, T payload, Collection<OccurrenceIssue> issues) {
091    return new OccurrenceParseResult<>(STATUS.SUCCESS, confidence, payload, null, null, issues);
092  }
093
094  public static <T> OccurrenceParseResult<T> fail(OccurrenceIssue issue) {
095    return new OccurrenceParseResult<>(STATUS.FAIL, null, null, null, null, new ArrayList<>(Collections.singletonList(issue)));
096  }
097
098  public static <T> OccurrenceParseResult<T> fail(OccurrenceIssue ... issues) {
099    return new OccurrenceParseResult<>(STATUS.FAIL, null, null, null, null, new ArrayList<>(Arrays.asList(issues)));
100  }
101
102  public static <T> OccurrenceParseResult<T> fail(Collection<OccurrenceIssue> issues) {
103    return new OccurrenceParseResult<>(STATUS.FAIL, null, null, null, null, issues);
104  }
105
106  /**
107   * This creates a ParseResult indicating a parse failure but it also has a payload. Depending on the context this
108   * may provide additional information about the failure.
109   *
110   * @param payload the payload of the parse result
111   * @param <T>    the generic type of the payload
112   *
113   * @return the new parse response which has a status of FAIL and an additional payload.
114   */
115  public static <T> OccurrenceParseResult<T> fail(T payload, Collection<OccurrenceIssue> issues) {
116    return new OccurrenceParseResult<>(STATUS.FAIL, null, payload, null, null, issues);
117  }
118
119  public static <T> OccurrenceParseResult<T> fail(T payload, OccurrenceIssue ... issues) {
120    return new OccurrenceParseResult<>(STATUS.FAIL, null, payload, null, null, new ArrayList<>(Arrays.asList(issues)));
121  }
122
123  /**
124   * This creates a ParseResult indicating a parse failure but it also has a payload. Depending on the context this
125   * may provide additional information about the failure.
126   *
127   * @param payload the payload of the parse result
128   * @param <T>    the generic type of the payload
129   *
130   * @return the new parse response which has a status of FAIL and an additional payload.
131   */
132  public static <T> OccurrenceParseResult<T> fail(T payload, OccurrenceIssue issue) {
133    return new OccurrenceParseResult<>(STATUS.FAIL, null, payload, null, null, new ArrayList<>(Collections.singletonList(issue)));
134  }
135
136
137  public Set<OccurrenceIssue> getIssues() {
138    return issues;
139  }
140
141  public void addIssue(OccurrenceIssue issue) {
142    Objects.requireNonNull(issue);
143    issues.add(issue);
144  }
145
146}