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.io.IOException; 020 021 import org.opengion.fukurou.util.AbstractObjectPool; 022 import org.opengion.fukurou.util.Cleanable; 023 import org.opengion.fukurou.util.FileUtil; 024 import org.opengion.hayabusa.common.HybsSystem; 025 import org.opengion.hayabusa.common.SystemManager; 026 027 /** 028 * Sofficeのプロセスを管?るファクトリクラスです? 029 * プロセスプ?ルの実??、AbstractObjectPoolを継承して実?れて?す? 030 * 031 * プロセスの初期生?数は0です??生?数は、シス?リソースのREPORT_MAX_PROCESS_COUNTで 032 * 定義されます?また?生存時間?、REPORT_PROCESS_ALIVEで定義されて?す? 033 * 034 * プロセスを?て終?るには、clearメソ?を呼び出します? 035 * clearメソ?は、Cleanableインターフェースの実?して?込まれ?SytemManagerに登録されるため? 036 * Tomcat終?に、?動的にプロセスが終?れます? 037 * ?、貸し?し中(処?)のプロセスは、AbstractObjecgPoolの実?ら?終?れな?め?別の方法で 038 * 明示?killする?がありま? 039 * 040 * @version 4.0 041 * @author Hiroki Nakamura 042 * @since JDK5.0, 043 */ 044 public final class ProcessFactory { 045 046 /** 047 * プロセスプ?ル 048 */ 049 private static ProcessPool pp = new ProcessPool() ; 050 051 /** Cleanable インターフェースによる初期化??*/ 052 static { 053 Cleanable clr = new Cleanable() { 054 public void clear() { 055 ProcessFactory.clear(); 056 } 057 }; 058 SystemManager.addCleanable( clr ); 059 060 // 5.2.2.0 (2010/11/01) 循環参?解消?ため、SystemManager から移? 061 Cleanable clr2 = new Cleanable() { 062 public void clear() { 063 ProcessFactory.kill(); 064 } 065 }; 066 SystemManager.addCleanable( clr2 , true ); // コン?スト終?のみ呼び出? 067 } 068 069 /** 070 * ?ォルトコンストラクターをprivateにして? 071 * オブジェクト?生?をさせな??する? 072 */ 073 private ProcessFactory() { 074 } 075 076 /** 077 * OpenOfficeのプロセスを生成します? 078 * 079 * @return sofficeのプロセス 080 */ 081 public static SOfficeProcess newInstance() { 082 return pp.newInstance(); 083 } 084 085 /** 086 * OpenOfficeのプロセスをリリースします? 087 * 088 * @param soffice SOfficeProcessオブジェク? 089 */ 090 public static void release( final SOfficeProcess soffice ) { 091 pp.release( soffice ); 092 } 093 094 /** 095 * OpenOfficeのプロセスをクローズします? 096 * 097 * @param soffice SOfficeProcessオブジェク? 098 */ 099 public static void remove( final SOfficeProcess soffice ) { 100 pp.remove( soffice ); 101 } 102 103 /** 104 * プ?ルされて?OpenOfficeのプロセスを?てクローズします? 105 */ 106 public static void clear() { 107 pp.clear(); 108 } 109 110 /** 111 * 全てのsoffice.binプロセスをKILLします? 112 * アプリケーションの終???実行します? 113 * OS名がWindowsを含??合?taskkill、それ以外?場合?killallします? 114 * 又?プロセス終?にコピ?された設定ファイルを削除します? 115 * 116 * @og.rev 4.3.0.0 (2008/07/18) 追? 117 * @og.rev 4.3.0.0 (2008/07/22) 設定ファイルの削除を追? 118 * @og.rev 4.3.5.0 (2009/02/01) Exception をそれぞれ?Exceptionに?て捕らえる? 119 */ 120 public static void kill() { 121 try { 122 final String osName = HybsSystem.sys( "OS_INFO" ); //System.getProperty("os.name"); 123 // if( osName.indexOf( "Windows" ) != -1 ){ 124 // // 4.3.0.0 (2008/07/18) Windoesのtaskkillを利用してsoffice.binのタスクを強制終?ます? 125 // new ProcessBuilder( "cmd.exe","/c","taskkill","/F","/IM","soffice.bin" ).start().waitFor(); 126 // } 127 // else{ 128 // // 4.3.0.0 (2008/07/24) Windowsではな??合?killallコマン? 129 // new ProcessBuilder( "killall","-9","-w","soffice.bin" ).start().waitFor(); 130 // } 131 if( osName.indexOf( "Windows" ) >= 0 ){ 132 // 4.3.0.0 (2008/07/18) Windoesのtaskkillを利用してsoffice.binのタスクを強制終?ます? 133 new ProcessBuilder( "cmd.exe","/c","taskkill","/F","/IM","soffice.bin" ).start().waitFor(); 134 } 135 else{ 136 // 4.3.0.0 (2008/07/24) Windowsではな??合?killallコマン? 137 new ProcessBuilder( "killall","-9","-w","soffice.bin" ).start().waitFor(); 138 } 139 140 // 4.3.0.0 (2008/07/22) 設定ファイル(SOfficeProcessで?レクトリを設?を?削除します? 141 FileUtil.deleteFiles( new File( SOfficeProcess.ENV_DIR ) ); 142 } 143 // catch( Exception ex ) { 144 // ex.printStackTrace(); 145 // } 146 catch( IOException ex ) { 147 ex.printStackTrace(); 148 } 149 catch( InterruptedException ex ) { 150 ex.printStackTrace(); 151 } 152 catch( RuntimeException ex ) { 153 ex.printStackTrace(); 154 } 155 } 156 157 /** 158 * 現在の状態を??で返します? 159 * 160 * @return 現在の状? 161 */ 162 public static String information() { 163 return pp.toString(); 164 } 165 166 /** 167 * ProcessPool は、AbstractObjectPool を継承した オブジェクト?ールです? 168 * 169 * OpenOfficeのプロセスを?ールします? 170 * 171 * @version 4.0 172 * @author Hiroki Nakamura 173 * @since JDK5.0, 174 */ 175 protected static class ProcessPool extends AbstractObjectPool<SOfficeProcess> { 176 // 環?ァイル作?の識別用 177 private int count = 0; 178 179 /** 180 * 初期処?行います? 181 */ 182 protected ProcessPool() { 183 init( 0, HybsSystem.sysInt( "REPORT_MAX_PROCESS_COUNT") 184 , true, HybsSystem.sysInt( "REPORT_PROCESS_ALIVE" ) ); 185 } 186 187 /** 188 * soffieのプロセスオブジェクトを作?します? 189 * 190 * @og.rev 4.3.5.0 (2009/02/01) Exception ではなく?RuntimeException に変更 191 * @og.rev 5.1.7.0 (2010/06/01) TCP接続対? 192 * 193 * @return OpenOfficeのプロセス 194 */ 195 protected SOfficeProcess createInstance() { 196 SOfficeProcess soffice = null; 197 try { 198 // 5.1.7.0 (2010/06/01) TCP接続対? 199 // soffice = new SOfficeProcess( "env_" + count ); 200 if( "TCP".equalsIgnoreCase( HybsSystem.sys( "REPORT_OOO_CONN_TYPE" ) ) ) { 201 soffice = new SOfficeProcessTcp( "env_" + count, HybsSystem.sysInt( "REPORT_OOO_MIN_PORT" ) ); 202 } 203 else { 204 soffice = new SOfficeProcess( "env_" + count ); 205 } 206 soffice.bootstrap(); 207 208 count++; 209 } 210 // catch( Exception ex ) { 211 catch( RuntimeException ex ) { 212 System.out.println( "[ERROR]OOo:Failed to Connect Soffice! " + ex.getMessage() ); 213 } 214 return soffice; 215 } 216 217 /** 218 * オブジェクト?ールから削除するときに呼ばれます? 219 * こ?メソ?で?ブジェクトごとの終???行います? 220 * 221 * @param soffice OpenOfficeのプロセス 222 */ 223 protected void objectFinal( final SOfficeProcess soffice ) { 224 soffice.close(); 225 } 226 } 227 } 228