001// Generated by delombok at Fri Oct 04 16:05:59 CEST 2024
002/*
003 * Copyright (c) 2010-2024 Mark Allen, Norbert Bartels.
004 *
005 * Permission is hereby granted, free of charge, to any person obtaining a copy
006 * of this software and associated documentation files (the "Software"), to deal
007 * in the Software without restriction, including without limitation the rights
008 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
009 * copies of the Software, and to permit persons to whom the Software is
010 * furnished to do so, subject to the following conditions:
011 *
012 * The above copyright notice and this permission notice shall be included in
013 * all copies or substantial portions of the Software.
014 *
015 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
016 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
017 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
018 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
019 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
020 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
021 * THE SOFTWARE.
022 */
023package com.restfb;
024
025import static com.restfb.util.UrlUtils.extractParametersFromQueryString;
026import static java.lang.String.format;
027import java.util.Date;
028import java.util.List;
029import java.util.Map;
030import java.util.Optional;
031import com.restfb.util.ReflectionUtils;
032
033/**
034 * Represents an access token/expiration date pair.
035 * <p>
036 * Facebook returns these types when performing access token-related operations - see
037 * {@link FacebookClient#convertSessionKeysToAccessTokens(String, String, String...)},
038 * {@link FacebookClient#obtainAppAccessToken(String, String)}, and
039 * {@link FacebookClient#obtainExtendedAccessToken(String, String, String)} for details.
040 *
041 * @author <a href="http://restfb.com">Mark Allen</a>
042 */
043public class AccessToken {
044    /**
045     * The access token's value.
046     */
047    @Facebook("access_token")
048    private String accessToken;
049    @Facebook("expires_in")
050    private Long rawExpires;
051    /**
052     * The date on which the access token expires.
053     */
054    private Date expires;
055    /**
056     * The token type of this access token provided by Facebook
057     */
058    @Facebook("token_type")
059    private String tokenType;
060    @Facebook("user_id")
061    private String userId;
062    private FacebookClient client;
063
064    public void setClient(FacebookClient client) {
065        this.client = client;
066    }
067
068    public FacebookClient getClient() {
069        return Optional.ofNullable(client).orElse(null);
070    }
071
072    /**
073     * Given a query string of the form {@code access_token=XXX} or {@code access_token=XXX&expires=YYY}, return an
074     * {@code AccessToken} instance.
075     * <p>
076     * The {@code queryString} is required to contain an {@code access_token} parameter with a non-{@code null} value.
077     * The {@code expires} value is optional and should be the number of seconds since the epoch. If the {@code expires}
078     * value cannot be parsed, the returned {@code AccessToken} will have a {@code null} {@code expires} value.
079     *
080     * @param queryString The Facebook query string out of which to parse an {@code AccessToken} instance.
081     * @return An {@code AccessToken} instance which corresponds to the given {@code queryString}.
082     * @throws IllegalArgumentException If no {@code access_token} parameter is present in the query string.
083     * @since 1.6.10
084     */
085    public static AccessToken fromQueryString(String queryString) {
086        // Query string can be of the form 'access_token=XXX' or
087        // 'access_token=XXX&expires=YYY'
088        Map<String, List<String>> urlParameters = extractParametersFromQueryString(queryString);
089        String extendedAccessToken = null;
090        String tokenType = null;
091        if (urlParameters.containsKey("access_token")) {
092            extendedAccessToken = urlParameters.get("access_token").get(0);
093        }
094        if (urlParameters.containsKey("token_type")) {
095            tokenType = urlParameters.get("token_type").get(0);
096        }
097        if (extendedAccessToken == null) {
098            throw new IllegalArgumentException(format("Was expecting a query string of the form \'access_token=XXX\' or \'access_token=XXX&expires=YYY\'. Instead, the query string was \'%s\'", queryString));
099        }
100        Date expires = null;
101        // If an expires or expires_in value was provided and it's a valid long, great - use it.
102        // Otherwise ignore it.
103        String rawExpires = null;
104        if (urlParameters.containsKey("expires")) {
105            rawExpires = urlParameters.get("expires").get(0);
106        }
107        if (urlParameters.containsKey("expires_in")) {
108            rawExpires = urlParameters.get("expires_in").get(0);
109        }
110        if (rawExpires != null && rawExpires.trim().matches("\\d+")) {
111            expires = new Date(new Date().getTime() + Long.parseLong(rawExpires) * 1000L);
112        }
113        AccessToken accessToken = new AccessToken();
114        accessToken.accessToken = extendedAccessToken;
115        accessToken.expires = expires;
116        accessToken.tokenType = tokenType;
117        return accessToken;
118    }
119
120    @Override
121    public int hashCode() {
122        return ReflectionUtils.hashCode(this);
123    }
124
125    @Override
126    public boolean equals(Object that) {
127        return ReflectionUtils.equals(this, that);
128    }
129
130    @Override
131    public String toString() {
132        return ReflectionUtils.toString(this);
133    }
134
135    @JsonMapper.JsonMappingCompleted
136    void convertExpires() {
137        if (rawExpires != null) {
138            expires = new Date(new Date().getTime() + 1000L * rawExpires);
139        }
140    }
141
142    /**
143     * The access token's value.
144     *
145     * @return The access token's value.
146     */
147    @java.lang.SuppressWarnings("all")
148    public String getAccessToken() {
149        return this.accessToken;
150    }
151
152    /**
153     * The date on which the access token expires.
154     *
155     * @return The date on which the access token expires.
156     */
157    @java.lang.SuppressWarnings("all")
158    public Date getExpires() {
159        return this.expires;
160    }
161
162    /**
163     * The token type of this access token provided by Facebook
164     *
165     * @return the access token type
166     */
167    @java.lang.SuppressWarnings("all")
168    public String getTokenType() {
169        return this.tokenType;
170    }
171
172    @java.lang.SuppressWarnings("all")
173    public String getUserId() {
174        return this.userId;
175    }
176
177    @java.lang.SuppressWarnings("all")
178    public void setUserId(final String userId) {
179        this.userId = userId;
180    }
181}