    001/*
    002 * Copyright (c) 2009 The openGion Project.
    003 *
    004 * Licensed under the Apache License, Version 2.0 (the "License");
    005 * you may not use this file except in compliance with the License.
    006 * You may obtain a copy of the License at
    007 *
    008 *     http://www.apache.org/licenses/LICENSE-2.0
    009 *
    010 * Unless required by applicable law or agreed to in writing, software
    011 * distributed under the License is distributed on an "AS IS" BASIS,
    012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
    013 * either express or implied. See the License for the specific language
    014 * governing permissions and limitations under the License.
    015 */
    016package org.opengion.hayabusa.resource;
    017
    018import org.opengion.hayabusa.common.HybsSystem ;
    019import org.opengion.fukurou.util.StringUtil ;
    020import org.opengion.fukurou.util.ApplicationInfo;
    021import org.opengion.fukurou.db.DBUtil;
    022import org.opengion.fukurou.security.HybsCryptography;
    023
    024/**
    025 * 指定のURLをランダムキー化したり、そのキーより実URLへ転送したりします。
    026 *
    027 * 通常のURLは、引数にキーとバリュー値をセットして文字列連結します。そのままでは
    028 * URLが長くなったり、引数の一部を書き換えたりできてしまいます。
    029 * このクラスでは、GE17(URL転送テーブル)に引数付きURLを登録するとともに、
    030 * ランダムキーを作成します。
    031 * また、このランダムキーを元にGE17を検索し、元のURLに転送する機能があります。
    032 *
    033 * @og.rev 4.0.0.0 (2004/12/31) 新規作成
    034 * @og.group リソース管理
    035 *
    036 * @version  4.0
    037 * @author   Kazuhiko Hasegawa
    038 * @since    JDK5.0,
    039 */
    040public final class URLXfer {
    041
    042        // URL転送テーブル(GE17)にデータを書き込むためのSQLです。
    043        private static final String INSERT_SQL = "INSERT INTO GE17 (SYSTEM_ID,RANDOM_KEY,NAME_JA,DYVALID,REDIRECT_URL,"
    044                                                                                        + "FGJ,DYSET,DYUPD,USRSET,USRUPD,PGUPD) "
    045                                                                                        + " VALUES ( ?,?,?,?,?,'1',?,?,?,?,'URLXfer' )" ;
    046
    047        // URL転送テーブル(GE17)からデータを読み込むためのSQLです。
    048        private static final String SELECT_SQL = "SELECT REDIRECT_URL FROM GE17"
    049                                                                                        + " WHERE SYSTEM_ID = ? AND RANDOM_KEY = ? AND DYVALID >= ?" ;
    050
    051        private final String DBID               ;               // ＵＲＬ転送テーブルアクセスの接続先
    052        private final String ADDRESS    ;               // ＵＲＬ転送テーブルアクセスアドレス
    053        private final String SYSTEM_ID  ;               // システムID
    054
    055        /** コネクションにアプリケーション情報を追記するかどうか指定 */
    056        public static final boolean USE_DB_APPLICATION_INFO  = HybsSystem.sysBool( "USE_DB_APPLICATION_INFO" ) ;
    057
    058        // 3.8.7.0 (2006/12/15) アクセスログ取得の為,ApplicationInfoオブジェクトを設定
    059        private final ApplicationInfo appInfo;
    060
    061        /**
    062         * コンストラクター
    063         *
    064         * アドレスが存在しない場合は、初期化メソッドを呼び出します。
    065         *
    066         * @og.rev 3.8.7.0 (2006/12/15) アクセスログ取得の為,ApplicationInfoオブジェクトを設定
    067         */
    068        public URLXfer() {
    069                DBID = HybsSystem.sys( "RESOURCE_DBID" );
    070                ADDRESS = StringUtil.nval(
    071                                                                HybsSystem.sys( "RESOURCE_ADDRESS" ) ,
    072                                                                HybsSystem.sys( "CONTEXT_URL" ) + "jsp/index.jsp"
    073                                        )  + "?XFER=";
    074
    075                SYSTEM_ID = HybsSystem.sys( "SYSTEM_ID" );
    076
    077                // 3.8.7.0 (2006/12/15) アクセスログ取得の為,ApplicationInfoオブジェクトを設定
    078                if( USE_DB_APPLICATION_INFO ) {
    079                        appInfo = new ApplicationInfo();
    080                        // ユーザーID,IPアドレス,ホスト名
    081                        appInfo.setClientInfo( SYSTEM_ID,HybsSystem.HOST_ADRS,HybsSystem.HOST_NAME );
    082                        // 画面ID,操作,プログラムID
    083                        appInfo.setModuleInfo( "URLXfer",null,null );
    084                }
    085                else {
    086                        appInfo = null;
    087                }
    088        }
    089
    090        /**
    091         * URL文字列のデータを元に、URLXferオブジェクトを構築します。
    092         * データをGE17(URL転送テーブル)に登録するとともに、ランダムキーを作成(XFER)して、
    093         * そのランダム引数を用いたアドレスを返します。
    094         * アドレスは、システムパラメータ URL_XFER_ADDRESS + "?XFER=" + ランダムキーです。
    095         *
    096         * @og.rev 3.8.7.0 (2006/12/15) アクセスログ取得の為,ApplicationInfoオブジェクトを設定
    097         * @og.rev 5.2.2.0 (2010/11/01) util.StringUtil から security.HybsCryptography へ移動
    098         *
    099         * @param       redirectURL     転送URL
    100         * @param       name                    表示名称
    101         * @param       validDate               有効日時(yyyyMMdd)
    102         * @param       userid          ユーザーID
    103         *
    104         * @return      RandomURL文字列
    105         */
    106        public String getRandomURL( final String redirectURL,final String name,final String validDate,final String userid ) {
    107
    108                String DYSET = HybsSystem.getDate( "yyyyMMddHHmmss" );
    109                String key = redirectURL + Math.random() ;
    110//              String randomKey = StringUtil.getMD5( key );
    111                String randomKey = HybsCryptography.getMD5( key );      // 5.2.2.0 (2010/11/01) クラス変更
    112
    113                String validYMD  = ( validDate != null ) ? validDate : "99999999" ;
    114
    115                String[] args = new String[] { SYSTEM_ID,randomKey,name,validYMD,redirectURL,DYSET,DYSET,userid,userid };
    116                DBUtil.dbExecute( INSERT_SQL,args,appInfo,DBID );
    117
    118                return ADDRESS + randomKey ;
    119        }
    120
    121        /**
    122         * ランダムキー(XFER)の文字列より、元のURLを検索します。
    123         * データはランダムキーを元に、GE17(URL転送テーブル)より取り出します。
    124         * 取り出す条件は、SYSTEM_ID 、RANDOM_KEY と DYVALID が 現在時刻より大きい場合です。
    125         *
    126         * @og.rev 3.8.7.0 (2006/12/15) アクセスログ取得の為,ApplicationInfoオブジェクトを設定
    127         *
    128         * @param       randomKey       ハッシュ化されたキー文字列
    129         *
    130         * @return RedirectURL文字列
    131         */
    132        public String getRedirectURL( final String randomKey ) {
    133                String nowDate = HybsSystem.getDate( "yyyyMMdd" );
    134
    135                String[] args = new String[] { SYSTEM_ID,randomKey,nowDate };
    136                String[][] vals = DBUtil.dbExecute( SELECT_SQL,args,appInfo,DBID );
    137
    138                if( vals != null && vals.length > 0 && vals[0] != null && vals[0].length > 0 ) {
    139                        return vals[0][0];
    140                }
    141                return null;
    142        }
    143
    144        /**
    145         * オブジェクトの識別子として，詳細なユーザー情報を返します。
    146         *
    147         * @return  詳細なユーザー情報
    148         */
    149        @Override
    150        public String toString() {
    151                StringBuilder rtn = new StringBuilder( HybsSystem.BUFFER_MIDDLE );
    152                rtn.append( "DBID :"            ).append( DBID );
    153                rtn.append( " ADDRESS :"        ).append( ADDRESS );
    154                rtn.append( " SYSTEM_ID :"      ).append( SYSTEM_ID );
    155                return rtn.toString();
    156        }
    157}