import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Set;
import oracle.jdbc.OracleDriver;
 
/**
  * Oradoc.java - 
  * @author naito
  */
public class Oradoc {
	/** host */
	private String _host = "localhost";
	/** port */
	private String _port = "1521";
	/** SID */
	private String _sid = null;
	/** user */
	private String _user = null;
	/** password */
	private String _pass = null;
 
	public static void main( String[] args ) {
		try {
			DriverManager.registerDriver( new OracleDriver() );
 
			Oracle oradoc = new Oradoc( args );
			oradoc.start();
		} catch( SQLException e ) {
			e.printStackTrace();
		}
	}
 
	/**
	 * コンストラクタ
	 * @param args 起動引数
	 */
	public Oradoc( String[] args ) {
		// 接続ストリング
		String str = null;
		// 出力先
		String destDir = System.getProperty( "user.dir", "." );
		// タイトル
		String title = "無題ドキュメント";
		// ログ出力
		boolean verbose = false;
		boolean invalid = false;
		String encoding = "Shift_JIS";
 
		// 引数解析
		int num = args.length;
		for( int i = 0; i < num; i++ ) {
			if( agrs[ i ].equals( "-host" ) && i + 1 < num ) {[
				_host = args[ ++i ];
			} else if( agrs[ i ].equals( "-port" ) && i + 1 < num ) {
				_port = args[ ++i ];
			} else if( agrs[ i ].equals( "-d" ) && i + 1 < num ) {
				destDir = args[ ++i ];
			} else if( agrs[ i ].equals( "-title" ) && i + 1 < num ) {
				titile = args[ ++i ];
			} else if( agrs[ i ].equals( "-verbose" ) ) {
				verbose = true;
			} else if( agrs[ i ].equals( "-invalid" ) ) {
				invalid = true;
			} else if( agrs[ i ].equals( "-encoding" ) && i + 1 < num ) {
				encoding = args[ ++i ];
			} else {
				str = args[ i ];
			}
		}
 
		// エラーチェック
		if( str == null ) {
			System.out.println( "Useage : Oradoc User/Password@SID [-host HOSTNAME] [-port PORT] [-d DESTDIR] [-title TITLE] [-verbose] [-encoding ENCODING]" );
			System.exit( 1 );
		}
 
		// user/pass@SID 解析
		if( str.matches( ".+/.+@.+" ) ) {
			int idx = str.indexOf( "/" );
			_user = str.substring( 0, idx );
			int idx2 = str.indexOf( "@", idx + 1 );
			_pass = str.substring( idx + 1, idx2 );
			_sid = str.substring( idx2 + 1 );
		}
 
		// destDir, windowTitle, encoding 設定
		HTMLManager.setDestDir( destDir );
		HTMLManager.setWindowTitle( title );
		HTMLManager.setEncoding( encoding );
 
		// ログ出力フラグ設定
		HTMLManager.setVerbose( verbose );
		SQLManager.setVerbose( verbose );
		SQLManager.setInvalid( invalid );
	}
 
	/**
	 * 処理を開始します。
	 */
	 private void start() {
		try {
			// ******* DB 接続 *************
			Connection conn = getConnection( _host, _port, _sid, _user, _pass );
			if( conn == null ) return;
			SQLManager.setConnection( conn );
			// ******* HTML 作成 ***********
			// index
			HTMLManager.createIndexHTML();
	 		// stylesheet
	 		HTMLManager.createStyleSheet();
 
	 		// ******* ObjectList 取得 *****
	 		// 全OBJECT のリストを取得 - [objects]
	 		ObjectItem[] objects = ( ObjectItem[] ) SQLManager.getObjects();
 
	 		// OBJECT_TYPE ごとの Map Key:objectType value:ObjectItem の ArrayList
	 		HashMap objectTypeMap = new HashMap();
 
	 		// OBJECT_TYPE ごとに振り分け
	 		for( int i = 0; i < objects.length; i++ ) {
	 			String objectType = objects[ i ].objectType;
	 			ArrayList list = ( ArrayList ) objectTypeMap.get( objectType );
	 			if( list == null ) {
	 				list = new ArrayList();
	 				objectTypeMap.put( objectType, list );
	 			}
	 			list.add( objects[ i ] );
	 		}
	 		// OBJECT_TYPE のリスト - [objectTypes]
	 		Set set = objectTypeMap.keySet();
	 		String[] objectTypes = ( String[] ) set.toArray( new String[ set.size() ] );
	 		Arrays.sort( objectTypes );
 
	 		// ******* HTML 作成 ***********
	 		// 概要
	 		HTMLManager.createOverviewFrameHTML( objectTypes );
	 		HTMLManager.createOverviewSummaryHTML( objectTypes );
	 		// タイプ別
	 		HTMLManager.createPackageFrameHTML( null, objects );
	 		for( int i = 0; i < objectTypes.length; i++ ) {
	 			ArrayList list = ( ArrayList )objectTypeMap.get( objectTypes[ i ] );
	 			ObjectItem[] objectItems = ( ObjectItem[] ) list.toArray( new ObjectItem[ list.size() ] );
	 			HTMLManager.createPackageFrameHTML( objectTypes[ i ], objectItems );
	 			HTMLManager.createPackageSummaryHTML( objectTypes[ i ], objectItems );
	 		}
 
	 		// ******* タイプ別処理振り分け *************
	 		// TABLE のリストを取得 - [ table ( key:tableName value: TableItem ) ]
	 		HashMap tables = SQLManager.getTables();
	 		// TABLECOLUMN のリストを取得 - [tableColumns ( key:tableName value:ArrayList of TableColumnItem ) ]
	 		HashMap tableColumns = SQLManager.getTableColumns();
 
	 		// VIEW のリストを取得 - [views ( key:tableName value:TableItem ) ]
	 		HashMap views = SQLManager.getViews();
 
	 		// INDEX のリストを取得 - [indexes ( key:indexName value:IndexItem )]
	 		HashMap indexes = SQLManager.getIndexes();
	 		// INDEXCOLUMN のリストを取得 -[indexColumns ( key:indexName value:ArrayList of columnName ) ]
	 		HashMap indexColumns = SQLManager.getIndexColumns();
 
	 		// SEQUENCE のリストを取得 * [ sequences ( key:sequenceName value:SequenceItem ) ]
	 		HashMap sequences = SQLManager.getSequences();
 
	 		// PROCEDURE のリストを取得
	 		String[] procedures = SQLManager.getProcedures();
	 		// FUNCTION のリストを取得
	 		String[] functions = SQLManager.getFunctions();
	 		// PACKAGE のリストを取得 - [ packages ( key:packageName value:ArrayList of procedureName ) ]
	 		HashMap packages = SQLManager.getPackages();
 
	 		HTMLManager.setProcedures( procedures, functions, packages );
 
	 		// オブジェクト詳細
	 		for( int i = 0; i < objects.length; i++ ) {
	 			// TABLE
	 			if( objects[ i ].objectType.equals( "TABLE" ) ) {
	 				TableItem item = ( TableItem )tables.get( objects[ i ].objectName );
	 				ArrayList list = ( ArrayList ) tableColumns.get( objects[ i ].objectName );
 
	 				if( item == null || list == null ) continue;
	 				item.setObjectItem( objects[ i ] );
	 				item.columns = ( TableColumnItem[] ) list.toArray( new TableColumnItem[ list.size() ] );
	 				item.constraints = SQLManager.getTableConsts( objects[ i ].objectName );
	 				HTMLManager.createTableFrameHTML( item );
	 			}
	 			// VIEW
	 			else if( objects[ i ].objectType.equals( "VIEW" ) ) {
	 				ViewItem item = ( ViewItem ) views.get( objects[ i ].objectName );
	 				if( item == null ) continue;
	 				item.setObjectItem( objects[ i ] );
	 				HTMLManager.createViewFrameHTML( item );
	 			}
	 			// SEQUENCE
	 			else if( objects[ i ].objectType.equals( "SEQUENCE" ) {
	 				SequenceItem item = ( SequenceIte ) sequence.get( objects[i].objectName );
	 				if( item == null ) continue;
	 				item.setObjectItem( objects[ i ] );
	 				HTMLManager.createSequenceFrameHTML( item );
	 			}
	 			// PROCEDURE, FUNCTION
	 			else if ( objects[ i ].objectType.equals( "PROCEDURE" ) || objects[ i ].objectType.equals( "FUNCTION" ) ) {
	 				String[] source = SQLManager.getProcSource( objects[ i ].objectName, objects[ i ].objectType );
	 				ProcArgItem[] args = SQLManager.getProcArgs( null, objects[ i ].objectName );
	 				HTMLManager.createProcedureFrameHTML( objects[ i ], source, args );
	 			}
	 			// PACKAGE
	 			else if ( objects[ i ].objectType.equals( "PACKAGE" ) {
	 				String[] source = SQLManager.getProcSource( objects[ i ].objectName, objects[ i ].objectType );
	 				ArrayList list = ( ArrayList ) packages.get( objects[ i ].objectName );
	 				if( list == null ) {
	 					HTMLManager.createPackageFrameHTML( objects[ i ], null, source );
	 				} else {
	 					String[] procs = ( String[] ) list.toArray( new String[ list.size() ] );
	 					HTMLManager.createPackageFrameHTML( objects[ i ], procs, source );
	 				}
	 			}
	 			// PACKAGE BODY
	 			else if ( objects[ i ].objectType.equals( "PACKAGE BODY" ) {
	 				ArrayList list = ( ArrayList ) packages.get( objects[ i ].objectName );
	 				String[] procs = ( String[] )list.toArray( new String[ list.size() ] );
	 				HTMLManager.createPkgBodyFrameHTML( objects[ i ], procs );
	 				// inner PROCEDURE
	 				HashMap sourceMap = SQLManager.getPkgProcSource( objects[ i ].objectName );
	 				for( int j = 0; j < procs.length; j++ ) {
	 					PkgProcItem item = ( PkgProcItem ) sourceMap.get( procs[ j ] );
	 					ProcArgItem[] args = SQLManager.getProcArgs( objects[ i ].objectName, item.procName );
	 					HTMLManager.createPkgProcFrameHTML( objects[ i ], item, args );
	 				}
	 			}
	 			// Other
	 			else {
	 				HTMLManager.createObjectFrameHTML( objects[ i ] );
	 			}
	 		}
	 		// ******* DB クローズ *********
	 		if( conn != null ) {
	 			conn.close();
	 		}
	 	} catch( SQLException e ) {
	 		e.printStrackTrace();
	 	} catch ( IOException e ) {
	 		e.printStrackTrace();
	 	}
	 }
	 /**
	  * Oracle サーバーに接続する
	  * @param host ホスト
	  * @param port ポート
	  * @param sid SID
	  * @param user ユーザ
	  * @param pass パスワード
	  * @return Connection
	  * @throws SQLException
	  */
	  private Connection getConnection( String host, String port, String sid, String user, String pass ) throws SQLException {
	  	if( sid != null && user != null && pass != null ) {
	  		String url = "jdbc:oracle:thin:" + user + "/" + pass + "@" + host + ":" + port + ":" + sid;
	  		return DriverManager.getConnection( url );
	  	} else {
	  		return null;
	  	}
	  }
}
 
----
作成日:2007/12/10
更新日:2007/12/10
----
最終更新:2007年12月10日 11:01