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.api.model.common;
015
016import org.gbif.api.util.IdentifierUtils;
017import org.gbif.api.vocabulary.IdentifierType;
018
019import java.util.Objects;
020import java.util.StringJoiner;
021
022import javax.annotation.Nullable;
023import javax.validation.constraints.NotNull;
024
025import io.swagger.v3.oas.annotations.media.Schema;
026
027/**
028 * Identifier Model Object represents an alternative identifier for an occurrence or name usage.
029 *
030 * @see <a href="http://rs.gbif.org/extension/gbif/1.0/identifier.xml">Identifier Definition</a>
031 */
032public class Identifier {
033
034  private String identifier;
035  private String title;
036  private IdentifierType type;
037
038  /**
039   * Other known identifier used for the same taxon. Can be a URL pointing to a webpage, an XML or RDF document, a DOI,
040   * UUID or any other identifer.
041   * <blockquote>
042   * <p>
043   * <i>Example:</i> urn:lsid:ipni.org:names:692570-1:1.4
044   * </p>
045   * </blockquote>
046   *
047   * @return the identifier.
048   */
049  @Schema(description = "Other known identifier used for the same taxon. Can be a URL pointing to a webpage, an XML or " +
050    "RDF document, a DOI UUID or any other identifier.")
051  @NotNull
052  public String getIdentifier() {
053    return identifier;
054  }
055
056  /**
057   * @param identifier the identifier to set
058   */
059  public void setIdentifier(String identifier) {
060    this.identifier = identifier;
061  }
062
063  /**
064   * The optional title of an identifier, mostly for linking.
065   *
066   * @return the title
067   */
068  @Schema(description = "The optional title of an identifier, mostly for linking.")
069  @Nullable
070  public String getTitle() {
071    return title;
072  }
073
074  /**
075   * @param title the identifier title to set
076   */
077  public void setTitle(String title) {
078    this.title = title;
079  }
080
081  /**
082   * Type of identifier.
083   *
084   * @return the type
085   *
086   * @see IdentifierType
087   */
088  @Schema(description = "Type of identifier.")
089  @NotNull
090  public IdentifierType getType() {
091    return type;
092  }
093
094  /**
095   * @param type the type to set
096   */
097  public void setType(IdentifierType type) {
098    this.type = type;
099  }
100
101  /**
102   * Creates an HTTP link for an identifier if possible by passing it to some known resolvers for the specific id type.
103   * If no link can be constructed, null is returned.
104   *
105   * @return the url or null if it cannot be created
106   *
107   * @see org.gbif.api.util.IdentifierUtils#getIdentifierLink(String, org.gbif.api.vocabulary.IdentifierType)
108   */
109  @Schema(description = "An HTTP link for an identifier, if a suitable, known resolver exists for the identifier type.")
110  @Nullable
111  public String getIdentifierLink() {
112    return IdentifierUtils.getIdentifierLink(identifier, type);
113  }
114
115  @Override
116  public boolean equals(Object o) {
117    if (this == o) {
118      return true;
119    }
120    if (o == null || getClass() != o.getClass()) {
121      return false;
122    }
123    Identifier that = (Identifier) o;
124    return Objects.equals(identifier, that.identifier) &&
125      Objects.equals(title, that.title) &&
126      type == that.type;
127  }
128
129  @Override
130  public int hashCode() {
131    return Objects.hash(identifier, title, type);
132  }
133
134  @Override
135  public String toString() {
136    return new StringJoiner(", ", Identifier.class.getSimpleName() + "[", "]")
137      .add("identifier='" + identifier + "'")
138      .add("title='" + title + "'")
139      .add("type=" + type)
140      .toString();
141  }
142}