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.util.Random; 019 020import org.opengion.hayabusa.common.HybsSystem; 021import org.opengion.hayabusa.common.HybsSystemException; 022import org.opengion.hayabusa.db.DBTableModel; 023 024/** 025 * 画面から直接キューを作成するためのクラスです。 026 * 各種設定値を直接指定することでDBのマスタ設定を行うことなく帳票出力を行います。 027 * 現時点では、出力系の処理しか対応していません。 028 * 029 * ここで登録されたキューは、別スレッドで処理されるため、#create()メソッドを呼び出した後は、 030 * #waitExec()メソッドを呼び出し、処理の終了に同期させる必要があります。 031 * エラーが発生した場合は、HybsSystemExceptionを発生します。 032 * 033 * また、処理のタイムアウトは、システムリソースのREPORT_DAEMON_TIMEOUTで設定します。 034 * 035 * @og.group 帳票システム 036 * 037 * @version 4.0 038 * @author Hiroki.Nakamura 039 * @since JDK1.6 040 */ 041public class QueueManager_DIRECT implements QueueManager { 042 043 private final int timeout = HybsSystem.sysInt( "REPORT_DAEMON_TIMEOUT" ); 044 045 private static final String SYSTEM_ID = HybsSystem.sys( "SYSTEM_ID" ); 046 private static final Random RANDOM = new Random(); 047 048 private String listId ; 049 private String outputName ; 050 private String lang ; 051 private String outputType ; 052 private String templateName ; 053 private String printerName ; 054 private boolean fglocal ; 055 private boolean fgcut ; 056 private boolean useSheetName; // 5.7.6.2 (2014/05/16) PAGEBREAKカラムの値を、シート名として使うかどうか。 057 058 private DBTableModel body ; 059 private DBTableModel header ; 060 private DBTableModel footer ; 061 062 private boolean isEnd ; 063 private String errMsg ; 064 065 /** 066 * デフォルトコンストラクター 067 * 068 * @og.rev 6.4.2.0 (2016/01/29) PMD refactoring. Each class should declare at least one constructor. 069 */ 070 public QueueManager_DIRECT() { super(); } // これも、自動的に呼ばれるが、空のメソッドを作成すると警告されるので、明示的にしておきます。 071 072 /** 073 * 帳票処理キューを作成します。 074 * 075 * @og.rev 5.1.6.0 (2010/05/01) 要求単位にスレッドを生成するようにします。 076 * @og.rev 5.7.6.2 (2014/05/16) PAGEBREAKカラムの値を、シート名として使うかどうかをセットします 077 */ 078 @Override // QueueManager 079 public void create() { 080 final ExecQueue queue = new ExecQueue(); 081 queue.setSystemId( SYSTEM_ID ); 082 queue.setYkno( "DIRECT_" + Long.toString( RANDOM.nextLong() & 0x7fffffffffffffffL ) ); 083 queue.setListId( listId ); 084 queue.setLang( lang ); 085 queue.setOutputName( outputName ); 086 queue.setOutputType( outputType ); 087 // 5.1.6.0 (2010/05/01) 088 queue.setThreadId( "DIRECT_" + Long.toString( RANDOM.nextLong() & 0x7fffffffffffffffL ) ); 089 queue.setTemplateName( templateName ); 090 queue.setPrinterName( printerName ); 091 queue.setFglocal( fglocal ); 092 queue.setFgcut( fgcut ); 093 queue.setUseSheetName( useSheetName ); // 5.7.6.2 (2014/05/16) PAGEBREAKカラムの値を、シート名として使うかどうかをセットします 094 095 queue.setBody( body ); 096 queue.setHeader( header ); 097 queue.setFooter( footer ); 098 099 queue.setManager( this ); 100 101 // 5.1.6.0 (2010/05/01) 102 ExecThreadManager.insertQueueOnNewThread( queue ); 103 } 104 105 /** 106 * 帳票処理データをキューにセットします。 107 * 画面から発行する場合は、テーブルモデルを直接セットするので、 108 * ここでは何もしません。 109 * 110 * @param queue ExecQueueオブジェクト 111 */ 112 @Override // QueueManager 113 public void set( final ExecQueue queue ) { 114 // 何もありません。(PMD エラー回避) 115 } 116 117 /** 118 * キューを実行中の状態に更新します。 119 * 画面から発行する場合は、実行中であることを知る必要がないため、 120 * ここでは何もしません。 121 * 122 * @param queue ExecQueueオブジェクト 123 */ 124 @Override // QueueManager 125 public void execute( final ExecQueue queue ) { 126 // 何もありません。(PMD エラー回避) 127 } 128 129 /** 130 * キューを完了済の状態に更新します。 131 * 132 * @param queue ExecQueueオブジェクト 133 */ 134 @Override // QueueManager 135 public void complete( final ExecQueue queue ) { 136 isEnd = true; 137 } 138 139 /** 140 * キューをエラーの状態に更新します。 141 * 142 * @param queue ExecQueueオブジェクト 143 */ 144 @Override // QueueManager 145 public void error( final ExecQueue queue ) { 146 isEnd = true; 147 errMsg = queue.getMsg(); 148 } 149 150 /** 151 * 処理が完了してするまでスレッドを待ち状態にします。 152 * エラーが発生した場合は、例外が発生します。 153 * また、REPORT_DAEMON_TIMEOUTで指定された期間処理が終了しない場合は、 154 * タイムアウトエラーとなります。 155 * 156 */ 157 public void waitExec() { 158 final long start = System.currentTimeMillis(); 159 while( true ) { 160 if( isEnd ) { 161 if( errMsg == null ) { 162 break; 163 } 164 else { 165 throw new HybsSystemException( errMsg ); 166 } 167 } 168 169 if( (int)(System.currentTimeMillis() - start) > timeout * 1000 ) { 170 throw new HybsSystemException( "帳票処理でタイムアウトになりました" ); 171 } 172 try { 173 Thread.sleep( 100 ); 174 } 175 catch( final InterruptedException ex ) { } 176 } 177 } 178 179 /** 180 * 帳票IDを設定します。 181 * 182 * @param listId 帳票ID 183 */ 184 public final void setListId( final String listId ) { 185 this.listId = listId; 186 } 187 188 /** 189 * 言語を設定します。 190 * 191 * @param lang 言語 192 */ 193 public void setLang( final String lang ) { 194 this.lang = lang; 195 } 196 197 /** 198 * 出力ファイル名を設定します。 199 * 200 * @param outputName 出力ファイル名 201 */ 202 public final void setOutputName( final String outputName ) { 203 this.outputName = outputName; 204 } 205 206 /** 207 * 実行方法を設定します。 208 * 209 * @param outputType 実行方法 210 */ 211 public final void setOutputType( final String outputType ) { 212 this.outputType = outputType; 213 } 214 215 /** 216 * 雛形ファイル名を設定します。 217 * 218 * @param templateName 雛形ファイル名 219 */ 220 public final void setTemplateName( final String templateName ) { 221 this.templateName = templateName; 222 } 223 224 /** 225 * 出力先のプリンタ名を設定します。 226 * 227 * @param printerName 出力先のプリンタ名 228 */ 229 public final void setPrinterName( final String printerName ) { 230 this.printerName = printerName; 231 } 232 233 /** 234 * ローカルリソースの使用可否を設定します。 235 * 236 * @param fglocal 使用可否[true/false] 237 */ 238 public void setFglocal( final boolean fglocal ) { 239 this.fglocal = fglocal; 240 } 241 242 /** 243 * ページエンドカットを行うかを設定します。 244 * 245 * @param fgcut ページエンドカットの使用可否[true:使用/false:通常] 246 */ 247 public void setFgcut( final boolean fgcut ) { 248 this.fgcut = fgcut; 249 } 250 251 /** 252 * PAGEBREAKカラムの値を、シート名として使うかどうかをセットします(初期値:false)。 253 * 254 * @og.rev 5.7.6.2 (2014/05/16) 新規追加 255 * 256 * @param useSheetName PAGEBREAKカラムのシート名使用可否[true:使用/false:使用しない] 257 */ 258 public void setUseSheetName( final boolean useSheetName ) { 259 this.useSheetName = useSheetName; 260 } 261 262 /** 263 * ボディーのテーブルモデルを設定します。 264 * 265 * @param body DBTableModelオブジェクト 266 */ 267 public void setBody( final DBTableModel body ) { 268 this.body = body; 269 } 270 271 /** 272 * ヘッダーのテーブルモデルを設定します。 273 * 274 * @param header DBTableModelオブジェクト 275 */ 276 public void setHeader( final DBTableModel header ) { 277 this.header = header; 278 } 279 280 /** 281 * フッターのテーブルモデルを設定します。 282 * 283 * @param footer DBTableModelオブジェクト 284 */ 285 public void setFooter( final DBTableModel footer ) { 286 this.footer = footer; 287 } 288}