001/*
002 * CDDL HEADER START
003 *
004 * The contents of this file are subject to the terms of the
005 * Common Development and Distribution License, Version 1.0 only
006 * (the "License").  You may not use this file except in compliance
007 * with the License.
008 *
009 * You can obtain a copy of the license at
010 * trunk/ds/resource/legal-notices/cddl.txt
011 * or http://www.opensource.org/licenses/cddl1.php.
012 * See the License for the specific language governing permissions
013 * and limitations under the License.
014 *
015 * When distributing Covered Code, include this CDDL HEADER in each
016 * file and include the License file at
017 * trunk/ds/resource/legal-notices/cddl.txt.  If applicable,
018 * add the following below this CDDL HEADER, with the fields enclosed
019 * by brackets "[]" replaced with your own identifying information:
020 *      Portions Copyright [yyyy] [name of copyright owner]
021 *
022 * CDDL HEADER END
023 *
024 *
025 *      Copyright 2010-2016 UnboundID Corp.
026 */
027package com.unboundid.directory.sdk.broker.types;
028
029import com.unboundid.util.Validator;
030
031import java.util.Date;
032import java.util.Set;
033
034/**
035 * Abstract class for an OAuth 2 token.
036 */
037public abstract class Token
038{
039  // The application ID that has been authorized.
040  private final String applicationId;
041  // The set of scope IDs for which the application has requested or authorized.
042  private final Set<String> scopeIds;
043  // The time that this token was generated.
044  private final Date generateTimestamp;
045  // The maximum length of time in seconds that this token will be
046  // considered valid.
047  private final long maxValiditySeconds;
048  // A value of this token that will be exposed to clients.
049  private volatile String value;
050
051  /**
052   * Construct a new Token instance.
053   *
054   * @param applicationId The application ID with which this token is
055   *                      associated. Must not be null.
056   * @param scopeIds The set of scopes for which the client has been authorized.
057   *                 Must not be null.
058   * @param generateTimestamp The time that this token was generated. Must not
059   *                          be null.
060   * @param maxValiditySeconds The maximum length of time in seconds that this
061   *                           token will be considered valid. Must not be null.
062   */
063  protected Token(final String applicationId, final Set<String> scopeIds,
064                  final Date generateTimestamp,
065                  final long maxValiditySeconds)
066  {
067    Validator.ensureNotNull(applicationId, scopeIds, generateTimestamp,
068        maxValiditySeconds);
069    this.scopeIds = scopeIds;
070    this.applicationId = applicationId;
071    this.generateTimestamp = generateTimestamp;
072    this.maxValiditySeconds = maxValiditySeconds;
073  }
074
075  /**
076   * Retrieves the application ID with which this token is associated.
077   *
078   * @return The application ID with which this token is associated.
079   */
080  public String getApplicationId()
081  {
082    return applicationId;
083  }
084
085  /**
086   * Retrieves the set of scope IDs for which the client has been authorized.
087   *
088   * @return The set of scope IDs for which the client has been authorized.
089   */
090  public Set<String> getScopeIds()
091  {
092    return scopeIds;
093  }
094
095  /**
096   * Retrieves the time that this token was generated.
097   *
098   * @return The time that this token was generated.
099   */
100  public Date getGenerateTimestamp()
101  {
102    return generateTimestamp;
103  }
104
105  /**
106   * Retrieves the maximum length of time in seconds that this code will be
107   * considered valid.
108   *
109   * @return The maximum length of time in seconds that this code will be
110   *         considered valid.
111   */
112  public long getMaxValiditySeconds()
113  {
114    return maxValiditySeconds;
115  }
116
117  /**
118   * Retrieves the string value of this token that should be returned to
119   * the client.
120   *
121   * @return The string value of this token that should be returned to
122   *         the client.
123   */
124  public String getValue()
125  {
126    return value;
127  }
128
129  /**
130   * Sets the string value of this token that should be returned to the
131   * client.
132   *
133   * @param value The string value of this token that should be returned
134   *              to the client.
135   */
136  public void setValue(final String value)
137  {
138    Validator.ensureNotNull(value);
139    this.value = value;
140  }
141
142  /**
143   * Indicates whether this token is expired.
144   *
145   * @return {@code true} if this token is expired, or
146   *         {@code false} if not.
147   */
148  public boolean isExpired()
149  {
150    final long generateTS = generateTimestamp.getTime();
151    final long expirationTime = (generateTS + (1000L * maxValiditySeconds));
152    final long currentTime = System.currentTimeMillis();
153    return currentTime > expirationTime;
154  }
155
156  /**
157   * Retrieves a hash code for this token.
158   *
159   * @return A hash code for this token.
160   */
161  @Override
162  public int hashCode()
163  {
164    final int prime = 31;
165    int result = 1;
166    result = prime * result + (applicationId != null ?
167        applicationId.hashCode() : 0);
168    result = prime * result + (generateTimestamp != null ?
169        generateTimestamp.hashCode() : 0);
170    result = prime * result + (int) (maxValiditySeconds ^
171        (maxValiditySeconds >>> 32));
172    return result;
173  }
174
175  /**
176   * Indicates whether the provided object is equal to this token.
177   *
178   * @param o The object for which to make the determination.
179   *
180   * @return {@code true} if the provided object is equal to this authorization
181   *         code, or {@code false} if not.
182   */
183  @Override
184  public boolean equals(final Object o)
185  {
186    if (this == o)
187    {
188      return true;
189    }
190    if (o == null || getClass() != o.getClass())
191    {
192      return false;
193    }
194
195    Token that = (Token) o;
196
197    if (maxValiditySeconds != that.maxValiditySeconds)
198    {
199      return false;
200    }
201    if (applicationId != null ?
202        !applicationId.equals(that.applicationId) :
203        that.applicationId != null)
204    {
205      return false;
206    }
207    if (generateTimestamp != null ?
208        !generateTimestamp.equals(that.generateTimestamp) :
209        that.generateTimestamp != null)
210    {
211      return false;
212    }
213    if (value != null ? !value.equals(that.value) : that.value != null)
214    {
215      return false;
216    }
217
218    return true;
219  }
220
221  /**
222   * Retrieves a string representation of this token.
223   *
224   * @return A string representation of this token.
225   */
226  @Override()
227  public String toString()
228  {
229    final StringBuilder buffer = new StringBuilder();
230    toString(buffer);
231    return buffer.toString();
232  }
233
234  /**
235   * Appends a string representation of this token to the provided
236   * buffer.
237   *
238   * @param buffer The buffer to which the string representation should be
239   *               appended.
240   */
241  protected abstract void toString(final StringBuilder buffer);
242}