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.taglib;
017
018import org.opengion.hayabusa.common.HybsSystem;
019import org.opengion.hayabusa.resource.ResourceManager;
020import org.opengion.hayabusa.resource.ResourceFactory;
021import org.opengion.fukurou.util.ToString;                                              // 6.1.1.0 (2015/01/17)
022
023import static org.opengion.fukurou.util.StringUtil.nval ;
024
025import javax.servlet.jsp.PageContext;
026
027/**
028 * ローカルリソースを構築します(有効範囲は、ページスコープ 内です)。
029 *
030 * ページスコープ内で使用されますので、主に、ページ先頭にて、ローカルリソースの
031 * 設定を行います。そのページ内では、ここで定義した ResourceManager が使用されます。
032 * これは、システムIDの異なる画面を、リソースを分離した形で使用できるようになります。
033 * 例えば、systemId="ZY" のシステムに、systemId="MR" の画面を組み込む場合に、
034 * その画面で、"MR" のリソースをそのままその画面に適用することで、同一カラム名に
035 * 対して、異なる(その画面だけ、特別な)リソースを適用することが出来ます。
036 *
037 * @og.formSample
038 * ●形式:<og:localResource systemId="GE" lang="zh" initLoad="false" />
039 * ●body:なし
040 *
041 * ●Tag定義:
042 *   <og:localResource
043 *       systemId           【TAG】ローカルリソース設定用のシステムID をセットします
044 *       lang               【TAG】ローカルリソースを構築する場合の、言語(lang)を指定します
045 *       initLoad           【TAG】リソース情報の先読み込みの可否をセットします(初期値:false)
046 *       remove             【TAG】ページスコープ内のResourceManager を削除します(初期値:false)
047 *       debug              【TAG】デバッグ情報を出力するかどうか[true/false]を指定します(初期値:false)
048 *   />
049 *
050 * ●使用例
051 *      この設定以降のページにローカルリソースを適用します。
052 *      ・<og:localResource
053 *               systemId  ="GE"       システムID
054 *               lang      ="zh"       言語(ja,en,zh)
055 *               initLoad  ="false"    初期読み込み可否(true:先読み込みする/false:しない)
056 *        />
057 *
058 *      ページの途中でローカルリソースを破棄します。
059 *      ・<og:localResource
060 *               remove  ="true"       ページスコープ内のResourceManager を削除します。
061 *        />
062 *
063 * @og.group 画面制御
064 *
065 * @version  4.0
066 * @author   Kazuhiko Hasegawa
067 * @since    JDK5.0,
068 */
069public class LocalResourceTag extends CommonTagSupport {
070        /** このプログラムのVERSION文字列を設定します。   {@value} */
071        private static final String VERSION = "6.4.2.0 (2016/01/29)" ;
072        private static final long serialVersionUID = 642020160129L ;
073
074        private String  systemId        ;               // システムID
075        private String  lang            ;               // 言語
076        private boolean initLoad        ;               // リソース初期読み込み可否(true:先読み込みする)
077        private boolean remove          ;               // ページスコープ内のリソースを削除します。
078
079        /**
080         * デフォルトコンストラクター
081         *
082         * @og.rev 6.4.2.0 (2016/01/29) PMD refactoring. Each class should declare at least one constructor.
083         */
084        public LocalResourceTag() { super(); }          // これも、自動的に呼ばれるが、空のメソッドを作成すると警告されるので、明示的にしておきます。
085
086        /**
087         * Taglibの終了タグが見つかったときに処理する doEndTag() を オーバーライドします。
088         *
089         * @return      後続処理の指示
090         */
091        @Override
092        public int doEndTag() {
093                debugPrint();           // 4.0.0 (2005/02/28)
094                if( remove ) {
095                        pageContext.removeAttribute( HybsSystem.LOCAL_RES_KEY,PageContext.PAGE_SCOPE );
096                }
097                else {
098                        lang = nval( lang,getLanguage() );
099
100                        final ResourceManager resource ;
101                        if( systemId == null ) {
102                                resource = ResourceFactory.newInstance( lang );
103                        }
104                        else {
105                                resource = ResourceFactory.newInstance( systemId,lang,initLoad );
106                        }
107
108                        pageContext.setAttribute( HybsSystem.LOCAL_RES_KEY,resource );
109                }
110
111                return EVAL_PAGE ;
112        }
113
114        /**
115         * タグリブオブジェクトをリリースします。
116         * キャッシュされて再利用されるので、フィールドの初期設定を行います。
117         *
118         */
119        @Override
120        protected void release2() {
121                super.release2();
122                systemId = null;
123                lang     = null;
124                initLoad = false;
125                remove   = false;
126        }
127
128        /**
129         * 【TAG】ローカルリソース設定用のシステムID をセットします。
130         *
131         * @og.tag
132         * このシステムIDを利用して、ResourceManager を構築します。
133         * 指定のない場合は、システムプロパティーの SYSTEM_ID パラメータ値です。
134         *
135         * @og.rev 4.0.0.0 (2005/01/31) 新規追加
136         *
137         * @param       sysId   システムID
138         */
139        public void setSystemId( final String sysId ) {
140                systemId = nval( getRequestParameter( sysId ),systemId );
141        }
142
143        /**
144         * 【TAG】ローカルリソースを構築する場合の、言語(lang)を指定します。
145         *
146         * @og.tag ここで言語を指定しない場合は、language 属性が使用されます。
147         *
148         * @param   lng 言語
149         */
150        public void setLang( final String lng ) {
151                lang= nval( getRequestParameter( lng ),lang );
152        }
153
154        /**
155         * 【TAG】リソース情報の先読み込みの可否[true:する/false:しない]をセットします(初期値:false)。
156         *
157         * @og.tag
158         * リソース情報は、FGLOADフラグが'1'の情報を先読み込みします。
159         * ローカルリソースは、全リソースを使用することはないため、通常、
160         * 先読み込みする必要はありません。また、一度読み込んだリソースは、
161         * 内部でキャッシュされるため、最初の使用時のみ、DBアクセスが発生します。
162         * (先読み込みは、Tomcat起動時の、初めてのアクセス時に行われます。)
163         * 初期値は、false:先読みしないです。
164         *
165         * @og.rev 4.0.0.0 (2005/01/31) 新規追加
166         *
167         * @param       inLoad  先読み可否 [true:する/false:しない]
168         */
169        public void setInitLoad( final String inLoad ) {
170                initLoad = nval( getRequestParameter( inLoad ),initLoad );
171        }
172
173        /**
174         * 【TAG】ページスコープ内のResourceManager を削除します(初期値:false)。
175         *
176         * @og.tag
177         * ページスコープ内のResourceManager を削除すると、初期化されます。
178         * これは、ページ内の部分的にリソースを適用する場合に、使用します。
179         * 初期値は、削除しない(false)です。
180         *
181         * @og.rev 4.0.0.0 (2005/01/31) 新規追加
182         *
183         * @param   flag リソースの削除 [true:削除する/false:削除しない]
184         */
185        public void setRemove( final String flag ) {
186                remove = nval( getRequestParameter( flag ),remove );
187        }
188
189        /**
190         * このオブジェクトの文字列表現を返します。
191         * 基本的にデバッグ目的に使用します。
192         *
193         * @return このクラスの文字列表現
194         * @og.rtnNotNull
195         */
196        @Override
197        public String toString() {
198                return ToString.title( this.getClass().getName() )
199                                .println( "VERSION"             ,VERSION        )
200                                .println( "systemId"    ,systemId       )
201                                .println( "lang"                ,lang           )
202                                .println( "initLoad"    ,initLoad       )
203                                .println( "remove"              ,remove         )
204                                .println( "Other..."    ,getAttributes().getAttribute() )
205                                .fixForm().toString() ;
206        }
207}