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.report2;
017
018import java.io.File;
019import java.util.Arrays;
020
021import org.opengion.fukurou.db.DBFunctionName;
022import org.opengion.fukurou.db.DBUtil;
023import org.opengion.fukurou.mail.MailTX;
024import org.opengion.fukurou.util.ApplicationInfo;
025import org.opengion.fukurou.util.LogWriter;
026import org.opengion.fukurou.util.StringUtil;
027import org.opengion.fukurou.util.UnicodeCorrecter;
028import org.opengion.hayabusa.common.HybsSystem;
029import org.opengion.hayabusa.db.DBTableModel;
030import org.opengion.hayabusa.db.DBTableModelUtil;
031import org.opengion.hayabusa.resource.ResourceFactory;
032import org.opengion.hayabusa.resource.ResourceManager;
033
034/**
035 * DBからキューを作成するためのクラスです。
036 * キューはGE5xテーブルから作成されます。
037 *
038 * キュー生成時点(処理スレッドにスタックした時点)では、帳票データのテーブルモデルは作成されません。
039 * 帳票データは、各スレッドからset()メソッドを呼び出したタイミングで生成されます。
040 *
041 * 処理開始及び、完了のステータスは、GE50の完成フラグに更新されます。
042 * また、エラー発生時のメッセージは、GE56に更新されます。
043 *
044 * @og.group 帳票システム
045 *
046 * @version  4.0
047 * @author   Hiroki.Nakamura
048 * @since    JDK1.6
049 */
050public final class QueueManager_DB implements QueueManager {
051
052        /** コネクションにアプリケーション情報を追記するかどうか指定 */
053        private static final boolean USE_DB_APPLICATION_INFO  = HybsSystem.sysBool( "USE_DB_APPLICATION_INFO" ) ;
054
055        /** アプリケーション情報 */
056        private static final ApplicationInfo appInfo;
057        static {
058                if( USE_DB_APPLICATION_INFO ) {
059                        appInfo = new ApplicationInfo();
060                        // ユーザーID,IPアドレス,ホスト名
061                        appInfo.setClientInfo( "ReportDaemon", HybsSystem.HOST_ADRS, HybsSystem.HOST_NAME );
062                        // 画面ID,操作,プログラムID
063                        appInfo.setModuleInfo( "ReportDaemon", "QueueManager", "QueueManager" );
064                }
065                else {
066                        appInfo = null;
067                }
068        }
069
070        private static final String DBID = HybsSystem.sys( "RESOURCE_DBID" );           // 5.5.5.1 (2012/08/07) リソース系DBID 付け忘れ対応
071
072//      private static final String SQL_SELECT_GE50 =
073//              "SELECT A.SYSTEM_ID, A.YKNO, A.LISTID, A.OUT_DIR, A.OUT_FILE, A.PDF_PASSWD"
074//              + ", B.LANG, B.FGRUN, B.DMN_GRP "
075//              + ", C.MODELDIR, C.MODELFILE, D.PRTNM, C.FGLOCAL, C.FGCUT, C.BSQL, C.HSQL, C.FSQL "
076//              + "FROM GE50 A, GE53 B, GE54 C, GE55 D "
077//              + "WHERE A.FGKAN='1' "
078//              + "AND A.SYSTEM_ID = B.SYSTEM_ID AND A.JOKEN = B.JOKEN "
079//              + "AND A.SYSTEM_ID = C.SYSTEM_ID AND A.LISTID = C.LISTID "
080//              + "AND B.SYSTEM_ID = D.SYSTEM_ID AND B.PRTID = D.PRTID ORDER BY"
081//              + HybsSystem.sys( "REPORT_DAEMON_ORDER_BY" );
082
083        // 4.3.0.0 (2008/07/18) PDF出力時に出力先マスタは不要のためGE55は外部結合に変更
084//      private static final String SQL_SELECT_GE50 =
085//              "SELECT A.SYSTEM_ID, A.YKNO, A.LISTID, A.OUT_DIR, A.OUT_FILE, A.PDF_PASSWD"
086//              + ", B.LANG, B.FGRUN, B.DMN_GRP "
087//              + ", C.MODELDIR, C.MODELFILE, D.PRTNM, C.FGLOCAL, C.FGCUT, C.BSQL, C.HSQL, C.FSQL "
088//              + "FROM GE50 A, GE53 B, GE54 C, GE55 D "
089//              + "WHERE A.FGKAN='1' "
090//              + "AND A.SYSTEM_ID = B.SYSTEM_ID AND A.JOKEN = B.JOKEN "
091//              + "AND A.SYSTEM_ID = C.SYSTEM_ID AND A.LISTID = C.LISTID "
092//              + "AND B.SYSTEM_ID = D.SYSTEM_ID(+) AND B.PRTID = D.PRTID(+) ORDER BY"
093//              + HybsSystem.sys( "REPORT_DAEMON_ORDER_BY" );
094
095        // 4.3.7.0 (2009/06/01) HSQLDB対応
096//      private static final String CON = DBFunctionName.getFunctionName( "CON", ConnectionFactory.getDBFullName( null ) );
097        // 5.1.4.0 (2010/03/01) データベース名 でなく、DBID名で検索するように変更します。
098        private static final String CON = DBFunctionName.getFunctionName( "CON", null );
099
100        // 5.2.0.0 (2010/09/01) Ver4互換モード対応
101        private static final String OUT_FILE = HybsSystem.sysBool( "VER4_COMPATIBLE_MODE" ) ? "OUTFILE" : "OUT_FILE";
102        private static final String OUT_DIR = HybsSystem.sysBool( "VER4_COMPATIBLE_MODE" ) ? "OUTDIR" : "OUT_DIR";
103
104        // 4.3.3.6 (2008/11/15) マルチサーバ対応追加(GE12から処理対象デーモングループ取得)
105        // 4.3.7.0 (2009/06/01) HSQLDB対応
106        // 5.2.0.0 (2010/09/01) Ver4互換モード対応
107        // 5.4.2.0 (2011/12/26) PRTID,PRGDIR,PRGFILE取得
108        // 5.9.2.2 (2015/11/20) GROUPID追加
109        // 5.10.0.0 (2018/06/08) FGNOML(メール不要フラグ)を追加
110        private static final String SQL_SELECT_GE50 =
111//              "SELECT A.SYSTEM_ID, A.YKNO, A.LISTID, A.OUT_DIR, A.OUT_FILE, A.PDF_PASSWD"
112                "SELECT A.SYSTEM_ID, A.YKNO, A.LISTID, A."+OUT_DIR+", A."+OUT_FILE+", A.PDF_PASSWD"
113                + ", B.LANG, B.FGRUN, B.DMN_GRP "
114                + ", C.MODELDIR, C.MODELFILE, D.PRTNM, C.FGLOCAL, C.FGCUT, C.BSQL, C.HSQL, C.FSQL "
115                + " ,B.PRTID, B.PRGDIR, B.PRGFILE "
116                + " ,A.GROUPID " // 5.9.2.2 (2015/11/20)
117                + " ,C.FGNOML " // 5.10.0.0 (2018/06/08)
118//              + "FROM GE50 A, GE53 B, GE54 C, GE55 D "
119                + "FROM GE50 A "
120                + "INNER JOIN GE53 B "
121                + "ON A.SYSTEM_ID = B.SYSTEM_ID AND A.JOKEN = B.JOKEN "
122                + "INNER JOIN GE54 C "
123                + "ON A.SYSTEM_ID = C.SYSTEM_ID AND A.LISTID = C.LISTID "
124                + "LEFT OUTER JOIN GE55 D "
125                + "ON B.SYSTEM_ID = D.SYSTEM_ID AND B.PRTID = D.PRTID "
126                + "WHERE A.FGKAN='1' "
127                + "AND EXISTS ( SELECT 'X' FROM GE12 E "
128                +                               "WHERE  E.FGJ                           ='1' "
129                +                               "AND            E.SYSTEM_ID     = '"
130                +                               HybsSystem.sys( "SYSTEM_ID" )
131                +                               "' "
132                +                               "AND            E.CONTXT_PATH   = '"
133                +                               HybsSystem.sys( "HOST_URL" )
134                +                               "' "
135                +                               "AND            E.PARAM_ID              LIKE 'REPORT2_HANDLE_DAEMON_%' "
136                +                               "AND            E.PARAM                 = 'RUN_'" + CON + "A.SYSTEM_ID" + CON + "'_'" + CON + "B.DMN_GRP"
137                +                       ") "
138//              + "AND A.SYSTEM_ID = B.SYSTEM_ID AND A.JOKEN = B.JOKEN "
139//              + "AND A.SYSTEM_ID = C.SYSTEM_ID AND A.LISTID = C.LISTID "
140//              + "AND B.SYSTEM_ID = D.SYSTEM_ID(+) AND B.PRTID = D.PRTID(+) ORDER BY"
141                + "ORDER BY "
142                + HybsSystem.sys( "REPORT_DAEMON_ORDER_BY" );
143
144        // 5.1.2.0 (2010/01/01) ページ数、データ数をGE50に更新する。
145        private static final String SQL_UPDATE_GE50 =
146//              "UPDATE GE50 SET FGKAN = ?, DMN_NAME = ?, DMN_HOST = ? ,DYUPD = ? WHERE SYSTEM_ID = ? AND YKNO = ?";
147                "UPDATE GE50 SET FGKAN = ?, DMN_NAME = ?, DMN_HOST = ?, SUDATA = ?, SUPAGE = ?, DYUPD = ? WHERE SYSTEM_ID = ? AND YKNO = ?";
148
149        private static final String SQL_INSERT_GE56 =
150                "INSERT INTO GE56 ( FGJ, SYSTEM_ID, YKNO, ERRMSG, DYSET, DYUPD, USRSET, USRUPD, PGUPD ) "
151                + " VALUES ( '1', ?, ? ,? ,? ,? ,? ,? ,? )" ;
152
153        private static final int STATUS_COMPLETE        = 2;
154        private static final int STATUS_EXECUTE         = 3;
155        private static final int STATUS_ERROR           = 8;
156
157        private static QueueManager manager = new QueueManager_DB();
158
159        /**
160         * インスタンスの生成を禁止します。
161         */
162        private QueueManager_DB() {}
163
164        /**
165         * インスタンスを返します。
166         *
167         * @return      帳票処理キューの管理マネージャ
168         */
169        public static QueueManager getInstance() {
170                return manager;
171        }
172
173        /**
174         * 帳票処理キューを作成します。
175         *
176         * @og.rev 4.3.0.0 (2008/07/15) スレッドIDにシステムIDを付加します。
177         * @og.rev 5.1.2.0 (2010/01/01) HSQL,FSQL,BSQLのセットを廃止します。(このクラス内でデータを直接分割)
178         * @og.rev 5.4.3.0 (2011/12/26) PRTIDの取得
179         * @og.rev 5.5.5.1 (2012/08/07) リソース系DBID 付け忘れ対策
180         * @og.rev 5.10.0.0 (2018/06/08) FGNOML対応
181         */
182        public synchronized void create() {
183                // キューをスタックするまでの例外は、ScheduleTagでcatchされデーモンがスリープする。
184//              String[][] ge50vals = DBUtil.dbExecute( SQL_SELECT_GE50, new String[0], appInfo );
185                String[][] ge50vals = DBUtil.dbExecute( SQL_SELECT_GE50, new String[0], appInfo, DBID );        // 5.5.5.1 (2012/08/07)
186
187                for( int i=0; i<ge50vals.length; i++ ) {
188                        ExecQueue queue = new ExecQueue();
189                        queue.setSystemId( ge50vals[i][0] );
190                        queue.setYkno( ge50vals[i][1] );
191                        queue.setListId( ge50vals[i][2] );
192                        // queue.setOutputName( new File( ge50vals[i][3] ).getAbsolutePath() + File.separator + ge50vals[i][4] );
193                        queue.setOutputName( new File( ge50vals[i][3] ).getAbsolutePath() , ge50vals[i][4] , ge50vals[i][7] , ge50vals[i][1] ); // 4.3.0.0 (2008/07/18) 要求番号を出力ファイル名に利用
194                        queue.setPdfPasswd( ge50vals[i][5] );
195                        queue.setLang( ge50vals[i][6] );
196                        queue.setOutputType( ge50vals[i][7] );
197                        // queue.setThreadId( StringUtil.nval( ge50vals[i][8] , "_DEFALUT_" ) );
198                        queue.setThreadId( ge50vals[i][0] + "_" + StringUtil.nval( ge50vals[i][8] , "_DEFALUT_" ) ); // 4.3.0.0 (2008/07/15)
199                        queue.setTemplateName( new File( ge50vals[i][9] ).getAbsolutePath() + File.separator + ge50vals[i][10] );
200                        queue.setPrinterName( ge50vals[i][11] );
201                        queue.setFglocal( "1".equals( ge50vals[i][12] ) );
202                        queue.setFgcut( "1".equals( ge50vals[i][13] ) );
203
204//                      queue.setBsql( ge50vals[i][14] );
205//                      queue.setHsql( ge50vals[i][15] );
206//                      queue.setFsql( ge50vals[i][16] );
207
208                        queue.setPrtId( ge50vals[i][17] );              // 5.4.3.0
209                        queue.setPrgDir( ge50vals[i][18] );     // 5.4.3.0
210                        queue.setPrgFile( ge50vals[i][19] );    // 5.4.3.0
211
212                        queue.setGrpId( ge50vals[i][20] );      // 5.9.2.2
213                        queue.setDmnGrp( ge50vals[i][8] );      // 5.9.2.2
214                        queue.setFgnoml( ge50vals[i][21] );     // 5.10.0.0 (2018/06/08)
215
216                        queue.setManager( this );
217
218                        ExecThreadManager.insertQueue( queue );
219                }
220        }
221
222        /**
223         * 帳票処理データをキューにセットします。
224         *
225         * @og.rev 5.1.2.0 (2010/01/01) HSQL,FSQL,BSQLのセットを廃止します。(このクラス内でデータを直接分割)
226         *
227         * @param       queue   ExecQueueオブジェクト
228         */
229        public void set( final ExecQueue queue ) {
230
231                ResourceManager resource = null;
232                if( queue.isFglocal() ) {
233                        resource = ResourceFactory.newInstance( queue.getSystemId(), queue.getLang(), false );
234                }
235                else {
236                        resource = ResourceFactory.newInstance( queue.getLang() );
237                }
238//              String[] where = new String[] { queue.getSystemId() , queue.getYkno() } ;
239
240                // ヘッダー情報の取得
241//              DBTableModel header = DBTableModelUtil.makeDBTable( queue.getHsql(), where, resource, appInfo );
242                DBTableModel header
243                        = (new DBTableModelCreator( queue.getSystemId(), queue.getListId(), queue.getYkno(), "H", resource )).getTable();
244                if( header != null && header.getRowCount() > 0 ) {
245                        queue.setHeader( header );
246                }
247
248                // フッター情報の取得
249//              DBTableModel footer = DBTableModelUtil.makeDBTable( queue.getFsql(), where, resource, appInfo );
250                DBTableModel footer
251                        = (new DBTableModelCreator( queue.getSystemId(), queue.getListId(), queue.getYkno(), "F", resource )).getTable();
252                if( footer != null && footer.getRowCount() > 0 ) {
253                        queue.setFooter( footer );
254                }
255
256                // ボディー情報の取得
257//              DBTableModel body = DBTableModelUtil.makeDBTable( queue.getBsql(), where, resource, appInfo );
258                DBTableModel body
259                        = (new DBTableModelCreator( queue.getSystemId(), queue.getListId(), queue.getYkno(), "B", resource )).getTable();
260                // レイアウトテーブルがないと固定長を分割するSQL文が設定されず、DBTableModelがnullになる
261                if( body == null ) {
262                        queue.addMsg( "[ERROR] DBTableModel doesn't exists! maybe Layout-Table(GE52) is not configured..." + HybsSystem.CR );
263                        queue.setError();
264                        throw new RuntimeException();
265                }
266                if( body.getRowCount() <= 0 ) {
267                        queue.addMsg( "[ERROR] Database Body row count is Zero." + queue.getYkno() + HybsSystem.CR );
268                        queue.setError();
269                        throw new RuntimeException();
270                }
271                if( body.isOverflow() ) {
272                        queue.addMsg( "[ERROR]Database is Overflow. [" + body.getRowCount() + "]" + HybsSystem.CR );
273                        queue.addMsg( "[ERROR]Check SystemParameter Data in DB_MAX_ROW_COUNT Overflow" + HybsSystem.CR  );
274                        queue.setError();
275                        throw new RuntimeException();
276                }
277                queue.setBody( body );
278        }
279
280        /**
281         * キューを実行中の状態に更新します。
282         *
283         * @param       queue   ExecQueueオブジェクト
284         */
285        public void execute( final ExecQueue queue ) {
286                status( queue, STATUS_EXECUTE );
287        }
288
289        /**
290         * キューを完了済の状態に更新します。
291         *
292         * @param       queue   ExecQueueオブジェクト
293         */
294        public void complete( final ExecQueue queue ) {
295                status( queue, STATUS_COMPLETE );
296        }
297
298        /**
299         * キューをエラーの状態に更新します。
300         *
301         * @param       queue   ExecQueueオブジェクト
302         */
303        public void error( final ExecQueue queue ) {
304                status( queue, STATUS_ERROR );
305                insertErrorMsg( queue );
306        }
307
308        /**
309         * GE50の状況Cを更新します。
310         *
311         * @og.rev 4.2.4.1 (2008/07/09) 更新日時をセット
312         * @og.rev 5.1.2.0 (2010/01/01) 行数、ページ数も更新する
313         * @og.rev 5.5.5.1 (2012/08/07) リソース系DBID 付け忘れ対策
314         *
315         * @param       queue   ExecQueueオブジェクト
316         * @param       status  状況C
317         */
318        private void status( final ExecQueue queue, final int status ) {
319
320                String dyupd = HybsSystem.getDate( "yyyyMMddHHmmss" ) ;
321
322                String[] args
323                = new String[]{ String.valueOf( status ), queue.getThreadId(), HybsSystem.sys( "HOST_NAME" )
324                                , String.valueOf( queue.getExecRowCnt() ), String.valueOf( queue.getExecPagesCnt() )
325                                , dyupd , queue.getSystemId(), queue.getYkno() };
326
327//              DBUtil.dbExecute( SQL_UPDATE_GE50, args, appInfo );
328                DBUtil.dbExecute( SQL_UPDATE_GE50, args, appInfo, DBID );       // 5.5.5.1 (2012/08/07)
329        }
330
331        /**
332         * GE56にエラーメッセージを出力します。
333         *
334         * @og.rev 4.4.0.1 (2009/08/08) エラーメッセージ機能追加
335         * @og.rev 5.5.5.1 (2012/08/07) リソース系DBID 付け忘れ対策
336         * @og.rev 5.10.0.0 (2018/06/08) メール送信条件を追加
337         *
338         * @param       queue   ExecQueueオブジェクト
339         */
340        private void insertErrorMsg( final ExecQueue queue ) {
341                String errmsg = queue.getMsg();
342                if( errmsg.length() > 1300 ) {
343                        errmsg = errmsg.substring( errmsg.length() - 1300, errmsg.length() );
344                }
345
346                String dyset = HybsSystem.getDate( "yyyyMMddHHmmss" ) ;
347
348                String[] args
349                = new String[]{ queue.getSystemId(), queue.getYkno(), errmsg
350                                , dyset, dyset, "UNKNOWN", "UNKNOWN", "UNKNOWN" };
351
352//              DBUtil.dbExecute( SQL_INSERT_GE56, args, appInfo );
353                DBUtil.dbExecute( SQL_INSERT_GE56, args, appInfo, DBID );       // 5.5.5.1 (2012/08/07)
354
355//              sendMail( queue, errmsg ); // 4.4.0.1 (2009/08/08)
356                // 5.10.0.0 (2018/06/08) メール送信条件を追加
357                if(!"1".equals(queue.getFgnoml())){
358                        sendMail( queue, errmsg ); // 4.4.0.1 (2009/08/08)
359                }
360        }
361
362        /**
363         * エラー情報のメール送信を行います。
364         * エラーメールは、システムパラメータ の COMMON_MAIL_SERVER(メールサーバー)と
365         * ERROR_MAIL_FROM_USER(エラーメール発信元)と、ERROR_MAIL_TO_USERS(エラーメール受信者)
366         * がすべて設定されている場合に、送信されます。
367         *
368         * @og.rev 4.4.0.1 (2009/08/08) 追加
369         * @og.rev 5.7.0.4 (2013/11/29) listIdの絞込み
370         *
371         * @param       queue           ExecQueueオブジェクト
372         * @param       inErrMsg        エラーメッセージ
373         */
374        private void sendMail( final ExecQueue queue, final String inErrMsg ) {
375
376                String   host = HybsSystem.sys( "COMMON_MAIL_SERVER" );
377                String   from = HybsSystem.sys( "ERROR_MAIL_FROM_USER" );
378                String[] to = StringUtil.csv2Array( HybsSystem.sys( "ERROR_MAIL_TO_USERS" ) );
379                String   match_txt = HybsSystem.sys( "REPORT_ERRMAIL_REGEX" ); // 5.7.0.4 (2013/11/29)
380                if( host != null && from != null && to.length > 0 ) {
381                        if( match_txt == null || match_txt.length() == 0
382                                        || queue.getListId() == null || queue.getListId().length() == 0
383                                        || queue.getListId().matches( match_txt )){     // 5.7.0.4 (2013/11/29)
384                                // 5.7.0.4 (2013/11/29) listid追加
385                                String subject = "SYSTEM_ID=[" + queue.getSystemId() + "] , YKNO=[" + queue.getYkno() + "] , "
386                                                           + "THREAD_ID=[" + queue.getThreadId() + "] , DMN_HOST=[" + HybsSystem.HOST_NAME + "]"
387                                                           + "LISTID=["+ queue.getListId() + "]";
388                                try {
389                                        MailTX tx = new MailTX( host );
390                                        tx.setFrom( from );
391                                        tx.setTo( to );
392                                        tx.setSubject( "帳票エラー:" + subject );
393                                        tx.setMessage( inErrMsg );
394                                        tx.sendmail();
395                                }
396                                catch( Throwable ex ) {
397                                        String errMsg = "エラー時メール送信に失敗しました。" + HybsSystem.CR
398                                                                + " SUBJECT:" + subject                                 + HybsSystem.CR
399                                                                + " HOST:" + host                                               + HybsSystem.CR
400                                                                + " FROM:" + from                                               + HybsSystem.CR
401                                                                + " TO:"   + Arrays.toString( to )              + HybsSystem.CR
402                                                                + ex.getMessage();              // 5.1.8.0 (2010/07/01) errMsg 修正
403                                        LogWriter.log( errMsg );
404                                        LogWriter.log( ex );
405                                }
406                        }
407                }
408        }
409
410        /**
411         * 帳票明細データを帳票レイアウトテーブルに従って分割し、その結果をDBTableModelとして
412         * 生成します。
413         * データの分割は、バイト数ベースで行われるため、エンコードを正しく指定する必要があります。
414         * エンコード指定は、システムリソースのDB_ENCODEで指定します。
415         *
416         * レイアウトテーブルが存在しない場合、又は、帳票データが存在しない場合、DBTableModelは
417         * nullで返されます。
418         */
419        public static class DBTableModelCreator {
420                // 5.2.0.0 (2010/09/01) Ver4互換モード対応
421                private static final String CLM = HybsSystem.sysBool( "VER4_COMPATIBLE_MODE" ) ? "COLUMN_NAME" : "CLM";
422                private static final String TEXT_DATA = HybsSystem.sysBool( "VER4_COMPATIBLE_MODE" ) ? "TEXT" : "TEXT_DATA";
423
424                // 5.2.0.0 (2010/09/01) Ver4互換モード対応
425                // 5.4.4.3 (2012/02/09) FGUSE条件追加対応
426                private static final String SQL_SELECT_GE52 =
427//                      " select CLM, START_POS, USE_LENGTH"
428                        " select "+CLM+", START_POS, USE_LENGTH"
429                        + " from GE52"
430                        + " where SYSTEM_ID = ?"
431                        + " and LISTID = ?"
432                        + " and KBTEXT = ?"
433                        + " and FGJ = '1'"
434                        + " and FGUSE = '1'" // 5.4.4.3
435                        + " order by SEQ";
436
437                // 5.2.0.0 (2010/09/01) Ver4互換モード対応
438                private static final String SQL_SELECT_GE51 =
439//                      " select TEXT_DATA"
440                        " select "+TEXT_DATA
441                        + " from GE51"
442                        + " where SYSTEM_ID = ?"
443                        + " and YKNO = ?"
444                        + " and KBTEXT = ?"
445                        + " and FGJ = '1'";
446
447                private static final String ENCODE = HybsSystem.sys( "DB_ENCODE" );
448
449                private final String systemId;
450                private final String listId;
451                private final String ykno;
452                private final String kbtext;
453                private final ResourceManager resource;
454
455                private DBTableModel table = null;
456
457                /**
458                 * コンストラクタです。
459                 *
460                 * @param sid システムID
461                 * @param lid 帳票ID
462                 * @param yk 要求NO
463                 * @param kt テキスト区分(H:ヘッダー F:フッター B:ボディー)
464                 * @param res リソースマネージャー
465                 */
466                public DBTableModelCreator( final String sid, final String lid, final String yk, final String kt, final ResourceManager res ) {
467                        systemId = sid;
468                        listId = lid;
469                        ykno = yk;
470                        kbtext = kt;
471                        resource = res;
472                        create();
473                }
474
475                /**
476                 * 帳票データをレイアウト定義に従い分割します。
477                 *
478                 * @og.rev 5.5.5.1 (2012/08/07) リソース系DBID 付け忘れ対策
479                 * @og.rev 5.9.3.1 (2015/12/18) SJIS-UTF変換時の波ダッシュ問題対応
480                 */
481                private void create() {
482                        String[] ge52Where = new String[] { systemId, listId, kbtext } ;
483//                      String[][] ge52Vals = DBUtil.dbExecute( SQL_SELECT_GE52, ge52Where, appInfo );
484                        String[][] ge52Vals = DBUtil.dbExecute( SQL_SELECT_GE52, ge52Where, appInfo, DBID );    // 5.5.5.1 (2012/08/07)
485                        if( ge52Vals == null || ge52Vals.length == 0 ) {
486                                return;
487                        }
488
489                        String[] ge51Where = new String[] { systemId, ykno, kbtext } ;
490//                      String[][] ge51Vals = DBUtil.dbExecute( SQL_SELECT_GE51, ge51Where, appInfo );
491                        String[][] ge51Vals = DBUtil.dbExecute( SQL_SELECT_GE51, ge51Where, appInfo, DBID );    // 5.5.5.1 (2012/08/07)
492                        if( ge51Vals == null || ge51Vals.length == 0 ) {
493                                return;
494                        }
495
496                        String[] clms = new String[ge52Vals.length];
497                        for( int i=0; i<ge52Vals.length; i++ ) {
498                                clms[i] = ge52Vals[i][0];
499                        }
500
501                        String[][] vals = new String[ge51Vals.length][ge52Vals.length];
502                        for( int i=0; i<ge51Vals.length; i++ ) {
503//                              byte[] bytes = StringUtil.makeByte( ge51Vals[i][0], ENCODE );
504                                byte[] bytes = StringUtil.makeByte( UnicodeCorrecter.correctToCP932( ge51Vals[i][0], ENCODE ), ENCODE ); // 5.9.3.1 (2015/12/18)
505                                for( int j=0; j<ge52Vals.length; j++ ) {
506                                        int strpos = Integer.valueOf( ge52Vals[j][1] ) - 1;
507                                        int len = Integer.valueOf( ge52Vals[j][2] );
508                                        if( strpos >= bytes.length ) {
509                                                vals[i][j] = "";
510                                        }
511                                        else {
512                                                if( strpos + len > bytes.length ) {
513                                                        len = bytes.length - strpos;
514                                                }
515                                                vals[i][j] = StringUtil.rTrim( StringUtil.makeString( bytes, strpos, len, ENCODE ) );
516                                        }
517                                }
518                        }
519                        table = DBTableModelUtil.makeDBTable( clms, vals, resource );
520                }
521
522                /**
523                 * 分割後のDBTableModelを返します。
524                 *
525                 * @return 分割後のDBTableModel
526                 */
527                public DBTableModel getTable() {
528                        return table;
529                }
530        }
531}