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