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.fukurou.db.ConnectionFactory;
019import org.opengion.fukurou.util.ToString;                                              // 6.1.1.0 (2015/01/17)
020import org.opengion.hayabusa.resource.UserInfo;
021import org.opengion.hayabusa.resource.ResourceFactory;
022import org.opengion.hayabusa.resource.CalendarFactory;
023import org.opengion.hayabusa.db.SelectionFactory;
024
025import static org.opengion.fukurou.util.StringUtil.nval ;
026import static org.opengion.fukurou.system.HybsConst.BR;         // 6.1.0.0 (2014/12/26) refactoring
027
028/**
029 * キャッシュしている各種データを初期化(クリア)します。
030 *
031 * データベースリソースを使用している場合は、キャッシュをクリアすることで、再度
032 * 読み込みなおしますので、データベースの値を変更した後には、クリアが必要です。
033 *
034 * クリアする対象は、connection,resource,gui,query,calendar があります。
035 * all という キーワードは、下記のすべてのリソースキャッシュをクリアします。
036 * <table border="1" frame="box" rules="all" >
037 *   <caption>初期化(クリア)対象のキーワード</caption>
038 *   <tr><th>対象        </th><th>説明</th></tr>
039 *   <tr><td>connection  </td><td>コネクションプーリングのコネクションを開放します。</td></tr>
040 *   <tr><td>resource    </td><td>ユーザー、システムを除くリソースキャッシュをクリアします。</td></tr>
041 *   <tr><td>gui         </td><td>GUI情報のキャッシュをクリアします。</td></tr>
042 *   <tr><td>calendar    </td><td>事業所カレンダを含むカレンダオブジェクトキャッシュをクリアします。</td></tr>
043 * </table>
044 *
045 * @og.formSample
046 * ●形式:&lt;og:engine connectionClear="[true|false]" ・・・ /&gt;
047 * ●body:なし
048 *
049 * ●Tag定義:
050 *   &lt;og:engine
051 *       allClear           【TAG】すべてのキャッシュデータをクリアします(初期値:false)
052 *       connectionClear    【TAG】データベースコネクションプールのコネクションを削除(開放)します(初期値:false)
053 *       resourceClear      【TAG】リソースデータをクリアします(初期値:false)
054 *       guiClear           【TAG】GUI情報のキャッシュをクリアします(初期値:false)
055 *       userClear          【TAG】User情報のパラメータデータをクリアします(初期値:false)
056 *       calendarClear      【TAG】カレンダオブジェクトのキャッシュをクリアします(初期値:false)
057 *       debug              【TAG】デバッグ情報を出力するかどうか[true/false]を指定します(初期値:false)
058 *   /&gt;
059 *
060 * ●使用例
061 *     &lt;og:engine
062 *         connectionClear = "true"  初期値:false
063 *         resourceClear   = "true"  初期値:false
064 *         guiClear        = "true"  初期値:false
065 *         userClear       = "true"  初期値:false
066 *         calendarClear   = "true"  初期値:false
067 *     /&gt;
068 *
069 *     &lt;og:engine
070 *         allClear = "true"
071 *     /&gt;
072 *
073 * @og.rev 3.6.0.0 (2004/09/17) 新規作成
074 * @og.group ログイン制御
075 *
076 * @version  4.0
077 * @author   Kazuhiko Hasegawa
078 * @since    JDK5.0,
079 */
080public class EngineTag extends CommonTagSupport {
081        /** このプログラムのVERSION文字列を設定します。   {@value} */
082        private static final String VERSION = "6.4.2.0 (2016/01/29)" ;
083        private static final long serialVersionUID = 642020160129L ;
084
085        private static final Object LOCK = new Object();                // 6.4.1.1 (2016/01/16) lock → LOCK  refactoring
086
087        private boolean allClear                ;
088        private boolean connectionClear ;
089        private boolean resourceClear   ;
090        private boolean guiClear                ;
091        private boolean userClear               ;
092        private boolean calendarClear   ;
093
094        /**
095         * デフォルトコンストラクター
096         *
097         * @og.rev 6.4.2.0 (2016/01/29) PMD refactoring. Each class should declare at least one constructor.
098         */
099        public EngineTag() { super(); }         // これも、自動的に呼ばれるが、空のメソッドを作成すると警告されるので、明示的にしておきます。
100
101        /**
102         * Taglibの終了タグが見つかったときに処理する doEndTag() を オーバーライドします。
103         *
104         * @return      後続処理の指示
105         */
106        @Override
107        public int doEndTag() {
108                debugPrint();           // 4.0.0 (2005/02/28)
109                final StringBuilder buf = new StringBuilder( BUFFER_MIDDLE );
110
111                synchronized( LOCK ) {
112                        if( connectionClear ) {
113                                ConnectionFactory.realClose();
114                                buf.append( "Connection Factory Real Closed" ).append( BR );
115                                System.out.println( "Connection Factory Real Closed" );
116                        }
117
118                        if( calendarClear ) {
119                                CalendarFactory.clear();                // 3.6.0.0 (2004/09/17)
120                                buf.append( "Calendar Factory Cleared" ).append( BR );
121                                System.out.println( "Calendar Factory Cleared" );
122                        }
123
124                        if( guiClear ) {
125                                ResourceFactory.guiClear();
126                                final UserInfo userInfo = getUser();
127                                userInfo.clear();
128                                getResource().makeGUIInfos( userInfo );
129                                buf.append( "GUIInfo Data Cleared" ).append( BR );
130                                System.out.println( "GUIInfo Data Cleared" );
131                        }
132
133                        if( userClear ) {
134                                final UserInfo userInfo = getUser();
135                                userInfo.clear();
136                                buf.append( "UserInfo Parameter Data Cleared" ).append( BR );
137                                System.out.println( "UserInfo Parameter Data Cleared" );
138                        }
139
140                        if( resourceClear ) {
141                                ResourceFactory.clear();
142                                SelectionFactory.clear();                               // 4.0.0 (2006/11/17)
143                                buf.append( "Resource Factory Cleared" ).append( BR );
144                                System.out.println( "Resource Factory Cleared" );
145                        }
146                }
147
148                return EVAL_PAGE ;
149        }
150
151        /**
152         * タグリブオブジェクトをリリースします。
153         * キャッシュされて再利用されるので、フィールドの初期設定を行います。
154         *
155         */
156        @Override
157        protected void release2() {
158                super.release2();
159                allClear                = false;
160                connectionClear = false;
161                resourceClear   = false;
162                guiClear                = false;
163                userClear               = false;
164                calendarClear   = false;
165        }
166
167        /**
168         * 【TAG】すべてのキャッシュデータをクリアします(初期値:false)。
169         *
170         * @og.tag
171         * connectionClear,resourceClear,guiClear,calendarClearの
172         * すべてを、true に設定することと同じです。
173         *
174         * @param   flag キャッシュクリア [true:すべて/false:個別]
175         */
176        public void setAllClear( final String flag ) {
177                allClear = nval( getRequestParameter( flag ),allClear );
178
179                connectionClear = connectionClear       || allClear ;
180                resourceClear   = resourceClear         || allClear ;
181                guiClear                = guiClear                      || allClear ;
182                userClear               = userClear                     || allClear ;
183                calendarClear   = calendarClear         || allClear ;
184        }
185
186        /**
187         * 【TAG】データベースコネクションプールのコネクションを削除(開放)します(初期値:false)。
188         *
189         * @og.tag データベース操作がおかしい場合は、クリアしてみてください。
190         *
191         * @param   flag コネクション削除可否 [true:する/false:しない]
192         */
193        public void setConnectionClear( final String flag ) {
194                connectionClear = nval( getRequestParameter( flag ),connectionClear );
195        }
196
197        /**
198         * 【TAG】リソースデータをクリアします(初期値:false)。
199         *
200         * @og.tag
201         * ユーザーリソースとシステムリソースを除くリソースキャッシュ
202         * データをクリアします。
203         *
204         * @param   flag リソースデータのクリア可否 [true:する/false:しない]
205         */
206        public void setResourceClear( final String flag ) {
207                resourceClear = nval( getRequestParameter( flag ),resourceClear );
208        }
209
210        /**
211         * 【TAG】User情報のパラメータデータをクリアします(初期値:false)。
212         *
213         * @og.tag
214         * User情報のパラメータデータ(GE16から読み込み)に追加/更新/削除が発生したときは、
215         * キャッシュをクリアする必要があります。
216         * User情報のパラメータデータは、{&#064;USER.XXXX}でアクセスできる値ではなく、
217         * システムパラメータ {&#064;SYS.XXXX}としてアクセスできるユーザー個別情報のことです。
218         *
219         * @param   flag パラメータデータのクリア可否 [true:する/false:しない]
220         */
221        public void setUserClear( final String flag ) {
222                userClear = nval( getRequestParameter( flag ),userClear );
223        }
224
225        /**
226         * 【TAG】GUI情報のキャッシュをクリアします(初期値:false)。
227         *
228         * @og.tag
229         * GUI情報の追加/更新/削除が発生したときは、キャッシュをクリアする必要があります。
230         *
231         * @param   flag GUI情報キャッシュのクリア可否 [true:する/false:しない]
232         */
233        public void setGuiClear( final String flag ) {
234                guiClear = nval( getRequestParameter( flag ),guiClear );
235        }
236
237        /**
238         * 【TAG】カレンダオブジェクトのキャッシュをクリアします(初期値:false)。
239         *
240         * @og.tag
241         * カレンダオブジェクトは、事業所カレンダ(例:GE13)毎にオブジェクトを
242         * 作成します。キャッシュに持っているため、データベースを更新するたびに、
243         * キャッシュをクリアしなおす必要があります。
244         *
245         * @param   flag カレンダのキャッシュのクリア可否 [true:する/false:しない]
246         */
247        public void setCalendarClear( final String flag ) {
248                calendarClear = nval( getRequestParameter( flag ),calendarClear );
249        }
250
251        /**
252         * このオブジェクトの文字列表現を返します。
253         * 基本的にデバッグ目的に使用します。
254         *
255         * @return このクラスの文字列表現
256         * @og.rtnNotNull
257         */
258        @Override
259        public String toString() {
260                return ToString.title( this.getClass().getName() )
261                                .println( "VERSION"                     ,VERSION                )
262                                .println( "allClear"            ,allClear               )
263                                .println( "connectionClear"     ,connectionClear)
264                                .println( "resourceClear"       ,resourceClear  )
265                                .println( "guiClear"            ,guiClear               )
266                                .println( "userClear"           ,userClear              )
267                                .println( "calendarClear"       ,calendarClear  )
268                                .println( "Other..."            ,getAttributes().getAttribute() )
269                                .fixForm().toString() ;
270        }
271}