/*
CreateClientRequest.java
Copyright (c) 2014 NTT DOCOMO,INC.
Released under the MIT license
http://opensource.org/licenses/mit-license.php
*/
package org.deviceconnect.android.manager.request;
import android.content.Intent;
import org.deviceconnect.android.localoauth.ClientData;
import org.deviceconnect.android.localoauth.LocalOAuth2Main;
import org.deviceconnect.android.localoauth.exception.AuthorizationException;
import org.deviceconnect.android.manager.profile.AuthorizationProfile;
import org.deviceconnect.message.DConnectMessage;
import org.deviceconnect.message.DConnectMessage.ErrorCode;
import org.deviceconnect.message.intent.message.IntentDConnectMessage;
import org.restlet.ext.oauth.PackageInfoOAuth;
/**
* LocalOAuth2にクライアントを作成するためのリクエスト.
* @author NTT DOCOMO, INC.
*/
public class CreateClientRequest extends DConnectRequest {
@Override
public boolean hasRequestCode(final int requestCode) {
return false;
}
@Override
public void run() {
String origin = mRequest.getStringExtra(IntentDConnectMessage.EXTRA_ORIGIN);
// Local OAuthでクライアント作成
PackageInfoOAuth packageInfo = new PackageInfoOAuth(origin);
try {
ClientData client = LocalOAuth2Main.createClient(packageInfo);
if (client != null) {
mResponse.putExtra(DConnectMessage.EXTRA_RESULT, DConnectMessage.RESULT_OK);
mResponse.putExtra(AuthorizationProfile.PARAM_CLIENT_ID, client.getClientId());
} else {
setAuthorizationError(mResponse, null);
}
} catch (AuthorizationException e) {
setAuthorizationError(mResponse, e.getMessage());
} catch (IllegalArgumentException e) {
setInvalidRequestParameterError(mResponse, e.getMessage());
}
sendResponse(mResponse);
}
/**
* レスポンスのエラーコードに 認証エラー を設定し、指定されたエラーメッセージを設定する.
*
* @param response レスポンスパラメータ
* @param message エラーメッセージ
*/
private static void setAuthorizationError(final Intent response, final String message) {
setError(response, ErrorCode.AUTHORIZATION, message);
}
/**
* レスポンスのエラーコードに 不正なパラメータエラー を設定し、指定されたエラーメッセージを設定する.
*
* @param response レスポンスパラメータ
* @param message エラーメッセージ
*/
private static void setInvalidRequestParameterError(final Intent response, final String message) {
setError(response, ErrorCode.INVALID_REQUEST_PARAMETER, message);
}
/**
* レスポンスにエラーを設定する.
* <p>
* GotAPI 1.0仕様により、空文字のクライアントIDを設定する.
* </p>
*
* @param response エラーを設定するレスポンスパラメータ
* @param error エラーコード
* @param message エラーメッセージ
*/
private static void setError(final Intent response, final ErrorCode error, final String message) {
response.putExtra(DConnectMessage.EXTRA_RESULT, DConnectMessage.RESULT_ERROR);
response.putExtra(DConnectMessage.EXTRA_ERROR_CODE, error.getCode());
response.putExtra(DConnectMessage.EXTRA_ERROR_MESSAGE, (message == null ? error.toString() : message));
// GotAPI対応: エラーの場合は、空文字のクライアントIDを返す
response.putExtra(AuthorizationProfile.PARAM_CLIENT_ID, "");
}
}