/*
 * Copyright (c) 2007 NTT DATA Corporation
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package jp.terasoluna.rich.functionsample.common.context.support;

import java.util.Locale;

import javax.servlet.http.HttpServletRequest;
import jp.terasoluna.fw.web.rich.context.RequestContext;
import jp.terasoluna.fw.web.rich.context.support.
        AbstractRequestContextSupport;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * 制御情報サポートクラス<br>
 * リクエストヘッダに以下の情報があった時その情報を制御情報クラスに格納する。<br>
 * <br>
 * <table border="1">
 *   <tr>
 *     <td>リクエストキー</td>
 *     <td>使用ユースケース</td>
 *   </tr>
 *   <tr>
 *     <td><code>requestName</code></td>
 *     <td>全ユースケース</td>
 *   </tr>
 *   <tr>
 *     <td><code>userId</code></td>
 *     <td>制御情報管理(UC104)</td>
 *   </tr>
 *   <tr>
 *     <td><code>password</code></td>
 *     <td>制御情報管理(UC104)</td>
 *   </tr>
 *   <tr>
 *     <td>accept-language</td>
 *     <td>DBメッセージ管理(UC110)</td>
 *   </tr>
 * </table>
 * <br>
 * ※注意事項：使用ユースケース以外はリクエストヘッダにこのデータを入力しない事。
 *
 *  
 */
public class RequestContextSupportImpl extends AbstractRequestContextSupport {
    
    /**
     * リクエスト名のキー
     */
    public static final String REQUEST_NAME_KEY  = "requestName";
    
    /**
     * ユーザIDのキー
     */
    public static final String USERID_KEY = "userId";
    
    /**
     * パスワードのキー
     */
    public static final String PASSWORD_KEY  = "password";
    
    /**
     * ロケール言語
     */
    public static final String LANGUAGE_KEY = "language";
    
    /**
     * ロケール国
     */
    public static final String COUNTRY_KEY = "country";
    
    /**
     * ロケールバリアント
     */
    public static final String VARIANT_KEY = "variant";

    /**
     * アクセス時刻のキー
     */
    public static final String ACCESS_DATE_KEY = "accessDate";
    
    /**
     * リクエストコンテキストの情報を基に制御情報を生成する。<br>
     *
     * @param request HTTPサーブレットリクエスト
     * @return リクエストコンテキスト
     */
    @Override
    protected RequestContext doGenerateContext(HttpServletRequest request) {
        
        RequestContext ctx = new RequestContext();
        ctx.setRequestName(
                request.getHeader(RequestContextSupportImpl.REQUEST_NAME_KEY));
        
        //リクエストヘッダ情報取得
        String userId =
            request.getHeader(RequestContextSupportImpl.USERID_KEY);
        String password =
            request.getHeader(RequestContextSupportImpl.PASSWORD_KEY);        
        Locale locale = request.getLocale();
        
        // リクエストヘッダ情報取得（日付型の制御情報）
        Date accessDate = null;
        DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd");
        String accessDateString = request.getHeader(RequestContextSupportImpl.ACCESS_DATE_KEY);
        
        if (accessDateString != null) {
            try {
                accessDate = dateFormat.parse(accessDateString);
            }catch(ParseException e){
                // 実行時例外
            	throw new IllegalStateException();
            }
        }
        
        //制御情報格納クラスに設定
        if (userId != null) {
            ctx.setProperty(RequestContextSupportImpl.USERID_KEY, userId);
        }
        
        if (password != null) {
            ctx.setProperty(
                    RequestContextSupportImpl.PASSWORD_KEY, password);
        }

        // 制御情報格納クラスに設定（日付型の制御情報）
        if (accessDate != null) {
            ctx.setProperty(
                    RequestContextSupportImpl.ACCESS_DATE_KEY, accessDate);
        }
        
        //DBメッセージのロケール情報を制御情報格納クラスに設定
        if (locale != null) {
            ctx.setProperty(RequestContextSupportImpl.LANGUAGE_KEY, 
                    locale.getLanguage());
            ctx.setProperty(RequestContextSupportImpl.COUNTRY_KEY,
                    locale.getCountry());
            ctx.setProperty(RequestContextSupportImpl.VARIANT_KEY,
                    locale.getVariant());
        }
        
        
        
        return ctx;
    }
}
