001package com.nimbusds.oauth2.sdk.client;
002
003
004import net.jcip.annotations.Immutable;
005
006import com.nimbusds.oauth2.sdk.ParseException;
007import com.nimbusds.oauth2.sdk.SuccessResponse;
008import com.nimbusds.oauth2.sdk.http.CommonContentTypes;
009import com.nimbusds.oauth2.sdk.http.HTTPResponse;
010
011
012/**
013 * Client information response.
014 *
015 * <p>Example HTTP response:
016 *
017 * <pre>
018 * HTTP/1.1 200 OK
019 * Content-Type: application/json
020 * Cache-Control: no-store
021 * Pragma: no-cache
022 *
023 * {
024 *  "registration_access_token"  : "reg-23410913-abewfq.123483",
025 *  "registration_client_uri"    : "https://server.example.com/register/s6BhdRkqt3",
026 *  "client_id"                  : "s6BhdRkqt3",
027 *  "client_secret"              : "cf136dc3c1fc93f31185e5885805d",
028 *  "client_id_issued_at"        : 2893256800
029 *  "client_secret_expires_at"   : 2893276800
030 *  "client_name"                : "My Example Client",
031 *  "client_name#ja-Jpan-JP"     : "\u30AF\u30E9\u30A4\u30A2\u30F3\u30C8\u540D",
032 *  "redirect_uris"              : [ "https://client.example.org/callback",
033 *                                   "https://client.example.org/callback2" ]
034 *  "scope"                      : "read write dolphin",
035 *  "grant_types"                : [ "authorization_code", "refresh_token" ]
036 *  "token_endpoint_auth_method" : "client_secret_basic",
037 *  "logo_uri"                   : "https://client.example.org/logo.png",
038 *  "jwks_uri"                   : "https://client.example.org/my_public_keys.jwks"
039 * }
040 * </pre>
041 *
042 * <p>Related specifications:
043 *
044 * <ul>
045 *     <li>OAuth 2.0 Dynamic Client Registration Management Protocol
046 *         (draft-ietf-oauth-dyn-reg-management-04), section 3.1.
047 *     <li>OAuth 2.0 Dynamic Client Registration Protocol
048 *         (draft-ietf-oauth-dyn-reg-20), section 2.
049 * </ul>
050 */
051@Immutable
052public class ClientInformationResponse 
053        extends ClientRegistrationResponse
054        implements SuccessResponse {
055
056
057        /**
058         * The client information.
059         */
060        private ClientInformation clientInfo;
061
062
063        /**
064         * Creates a new client information response.
065         *
066         * @param clientInfo The client information. Must not be {@code null}.
067         */
068        public ClientInformationResponse(final ClientInformation clientInfo) {
069
070                if (clientInfo == null)
071                        throw new IllegalArgumentException("The client information must not be null");
072
073                this.clientInfo = clientInfo;
074        }
075
076
077        /**
078         * Gets the client information.
079         *
080         * @return The client information.
081         */
082        public ClientInformation getClientInformation() {
083
084                return clientInfo;
085        }
086
087
088        @Override
089        public HTTPResponse toHTTPResponse() {
090        
091                HTTPResponse httpResponse = new HTTPResponse(HTTPResponse.SC_OK);
092                httpResponse.setContentType(CommonContentTypes.APPLICATION_JSON);
093                httpResponse.setCacheControl("no-store");
094                httpResponse.setPragma("no-cache");
095                httpResponse.setContent(clientInfo.toJSONObject().toString());
096                return httpResponse;
097        }
098
099
100        /**
101         * Parses a client information response from the specified 
102         * HTTP response.
103         *
104         * @param httpResponse The HTTP response. Must not be {@code null}.
105         *
106         * @return The client information response.
107         *
108         * @throws ParseException If the HTTP response couldn't be parsed to a
109         *                        client information response.
110         */
111        public static ClientInformationResponse parse(final HTTPResponse httpResponse)
112                throws ParseException {
113
114                httpResponse.ensureStatusCode(HTTPResponse.SC_OK, HTTPResponse.SC_CREATED);
115                ClientInformation clientInfo = ClientInformation.parse(httpResponse.getContentAsJSONObject());
116                return new ClientInformationResponse(clientInfo);
117        }
118}