JTOpen: IBM iSeries向けのオープン・ソースJavaツールボックス

JTOpenを使ってiSeries Integrated File System内のファイルを探す

Comments

JTOpenは、Javaクラスのライブラリーで、AS/400すなわちiSeriesサーバーに接続するための、クライアント/サーバーとインターネット・プログラミングのモデルをサポートします。これらのクラスをJavaアプレットやサーブレット、アプリケーションで使用することで、サーバー上のデータやリソースに簡単にアクセスできるようになります。JTOpenには、Java仮想マシン (JVM) やTCP/IP で提供されるサポート以外の追加クライアント・サポートは必要はありません。JTOpenは、AS/400 Toolbox for Javaのオープン・ソース版です。AIX、AS/400およびiSeriesサーバー、Linux、Network Station、OS/2、Sun Solaris、Microsoft Windowsを含め、幅広いプラットフォームで実行されます。

JTOpenの長所はその使いやすさです。クライアントからiSeriesにアクセスするには、以下のもので十分です。

  • Sun準拠のJVM 1.1.x以上のJDK/JRE搭載 (GUIプログラミングではJava 2またはSwing 1.1以上)
  • iSeriesとのTCP/IP接続。ただし、次の環境が必要です。
    • iSeriesはV4R2以上とする。
    • iSeriesにOption 12 Host Serverがインストールされ、実行されている。JTOpenはHost Serverを使用してクライアントからiSeriesとの通信を実行します。

必要条件はこれだけです。クライアント上に他のソフトウェアは必要ありません (IBMのクライアントiSeries管理製品であるClient Access Expressをインストールする必要はありません)。

機能豊富なJavaクラス・ライブラリー

JTOpenは、iSeriesの作業を直ちに開始し、その生産性を向上させるために必要なAPIを提供します。JTOpenを使ってアクセスできるiSeriesデータとリソースは次のとおりです。

  • データベース - JDBCおよびレコード・レベルのアクセス
  • Integrated File System (IFS)
  • プログラム呼び出し
  • コマンド
  • データ・キュー
  • データ域
  • 印刷/スプール・リソース
  • ジョブおよびジョブ・ログ
  • メッセージ、メッセージ・キュー、およびメッセージ・ファイル
  • ユーザーおよびグループ
  • ユーザー・スペース
  • システム値
  • システム状況

JTOpenはクライアントまたはiSeriesそのものの環境で実行できるので、JTOpenを使ってiSeriesを利用する最新のクライアント側またはサーバー側のアプリケーションを作成することができます。たとえば、JTOpenを使って特定のグループ内のすべてのユーザーを検索したり、クライアント・アプリケーションでドロップダウンを生成したりすることができます。また、WebSphere下のiSeries上で実行するサーブレットを作成したり、JTOpenを使ってIntegrated File System (IFS) のHTML表記を作成してWebブラウザーで表示できるようにすることも可能です。本稿では、IFS内で特定のパターンにマッチするファイルをスキャンする簡単なクライアント・アプリケーションを説明しながら、JTOpenの実践的な説明をします。

IFS内のファイルの検索

この サンプル・アプリケーション は、iSeriesに接続し、IFSディレクトリーとそのすべてのサブディレクトリーをスキャンして、指定したパターンにマッチするファイルを探します。この例は、 IFSFile クラスの能力を示しています (これは、java.io.Fileクラスを模倣したものなので、Javaでファイル入出力プログラミングを行った経験がある方なら IFSFile はお分かりになるはずです)。これは単なるコマンド行アプリケーションですが、このコードの上にGUIを作成すれば、Windowsアプリケーションの検索機能にも匹敵するiSeriesの検索ユーティリティーを作成することができます。

リスト1 では、まず AS400 オブジェクトを作成します。 AS400 オブジェクトには、iSeriesまたはAS/400との接続に関する詳細がすべてカプセル化されています。このオブジェクトが大切なのはこのためです。厄介な細かい事柄を実行する必要はまったくありません。JTOpenで必要なほとんどのことを代わりに実行してくれる AS400 オブジェクトを作成し、それが大切なことも学習しましょう。このコンストラクターは、iSeriesサーバー名、ユーザー名、パスワードの入力をユーザーに求めます。他のコンストラクターを利用して、これらの情報を入力することができます。

main に渡されている引数を調べることで、検索するディレクトリーと、使用するパターンを判別します。次に、 IFSFileFinder オブジェクトを作成します。これは、このアプリケーション用にインプリメントした新しいクラスです。 getFiles メソッドを呼び出します。

リスト1: iSeriesとの接続
public static void main(String args[])
{
    AS400 as400 = new AS400();
        String startDir = "";
    String pattern = """;
    if (args.length != 2)
    {
        System.out.println("Usage: dir pattern");
        System.exit(0);
    }
    else
    {
        startDir = args[0];
        pattern = args[1];
     }
     IFSFileFinder ifsFileFinder = new IFSFileFinder(as400);
     Vector files = ifsFileFinder.getFiles(startDir, pattern);
     ifsFileFinder.showFileListing(files);
     System.exit(0);
}

getFiles ( リスト2 を参照) が作業を開始します。まず、ファイルを最初に検索するiSeriesディレクトリーを表す、新しい IFSFile オブジェクトを作成します。 getFiles は次に、マッチしたファイルの格納に使用するVectorを作成します。次に、 IFSFileFinderrecurseForFiles メソッドを呼び出します。この例では、このメソッドがファイル・システムを反復検索することで、この例内の作業の大半を実行します。

リスト2: ファイルの検索
public Vector getFiles(String startDirectory, String pattern)
{
    IFSFile startDirectory = new IFSFile(as400, startDirectoryString);
    Vector fileList = new Vector();
    
    recurseForFiles(startDirectory, pattern, fileList);
    
    return fileList;
}

リスト3 に、 recurseForFiles を示します。これは、ディレクトリーを表す IFSFile 、マッチさせるパターン、およびマッチしたファイルを格納するVectorを取得します。 recurseForFiles は、ディレクトリー内のすべてのファイルを検索し、fileList Vectorにそれらを追加します。次に、渡されたディレクトリー内のすべてのサブディレクトリーを検索し、それらのディレクトリーで自分自身を繰り返し呼び出して、IFSツリー内でパターンにマッチするファイルの完全なリストを作成します。 リスト4リスト5 に、このメソッドで使用する2つの主なルーチン、 getNormalFilesgetSubdirectories を示します。

リスト3: IFSツリー全体をスキャンするrecurseForFiles
private void recurseForFiles(IFSFile directory, String pattern, Vector fileList) 
{ if (showStatus) {
        System.out.println("Searching " + directory.getPath());
    } //Add the matching files from this directory to list of
    files IFSFile[] normalFiles = getNormalFiles(directory, pattern); 
        if (normalFiles != null) { 
        for (int i = 0; i < normalFiles.length; i++) { fileList.addElement(normalFiles[i]); } 
        } 
        //Get the subdirectories and recurse on them IFSFile[] subdirectories = getSubdirectories(directory);
        if (subdirectories != null) {
        for (int i= 0; i < subdirectories.length; i++) {
        recurseForFiles(subdirectories[i], pattern, fileList); } 
        } 
}

getNormalFiles は、ディレクトリーを取得して、そのディレクトリーに入っているすべてのファイルの配列を ( IFSFile オブジェクトとして) 戻します。 IFSFilelistFiles メソッドを使用して、フィルター (ディレクトリーではなく、ファイルでなければなりません) とパターンにマッチするファイルをリストします。

listFiles呼び出しの1つ目のパラメーターfilterは、 IFSFileFilter インターフェースをインプリメントした内部クラスです。このインターフェースには、 accept という1つのメソッドがあります。このメソッドは、指定されたファイル・オブジェクトをファイル・リストに入れるべきかどうかをテストします。この場合、必要なのはディレクトリーではなく普通のファイルだけなので、ディレクトリーは除外します。

リスト4: ディレクトリー内のすべての "normal" ファイルを取得するgetNormalFiles
public IFSFile[] getNormalFiles(IFSFile directory, String pattern)
{
    IFSFile[] contents = null;
    try
    {
        if (directory.isDirectory())
        {
            contents = directory.listFiles(new IFSFileFilter() {
                                   public boolean accept(IFSFile file)
                                   {
                                       try
                                       {                                        
                                       return file.isFile();
                                       }
                                       catch (Exception e)
                                       {
                                           System.out.println(e);
                                             return false;
                                     }
                             }
                          },
                                pattern);
        }
    }
    catch (Exception e)
    {
        return null;
    }
    return contents;
}

getSubdirectories は、パターンを取らないlistFiles呼び出しを使用する点を除き、 getNormalFiles と同じです。これは、現行ディレクトリーのサブディレクトリーだけをスキャンしているためです。この場合のフィルターは、ファイルはすべて除外し、ディレクトリーだけ残します。

リスト5: ディレクトリー内のすべてのサブディレクトリーを取得する getSubdirectories
public IFSFile[] getSubdirectories(IFSFile directory)
{
    IFSFile[] contents = null;
    try
    {
        if (directory.isDirectory())
        {
            contents = directory.listFiles(new IFSFileFilter()                            
                        {
                                   public boolean accept(IFSFile file)
                                   {
                                       try
                                       {
                                           return file.isDirectory();
                                       }
                                       catch (Exception e)
                                       {
                                           System.out.println(e);
                                           return false;
                                     }
                             }
                          });
       }
    }
    catch (Exception e)
    {
        return null;
    }
    return contents;
}

最後に、 リスト6showFileListing メソッドを示します。これは、パターンにマッチするファイルを含むVectorの内容を表示するためにインプリメントしたメソッドです。これは、JavaファイルのVector内を反復し、 IFSFile オブジェクトから集めた前回のアクセス日と前回の変更日を少し加えてから、結果を出力します。各ファイルのグループの親ディレクトリーも出力されます。

リスト6: すべてをまとめた出力
public void showFileListing(Vector files)
    {
        if (files.size() == 0)
        {
            System.out.println("Sorry, no files were found.");
            return;
        }
        SimpleDateFormat formatter = new SimpleDateFormat("MM-dd-yyyy");
        String parent = (((IFSFile)files.elementAt(0))).getParent();
        System.out.println("Files found in " + parent + ":");
        for (int i = 0; i< files.size(); i++)
        {
            try
            {
                IFSFile tmpFile = (IFSFile)files.elementAt(i);
            Date lastAccessed = new Date(tmpFile.lastAccessed());
                Date lastModified = new Date(tmpFile.lastModified());
                long lengthInBytes = tmpFile.length();
            if (!parent.equalsIgnoreCase(tmpFile.getParent()))
                {
                    parent = tmpFile.getParent();
                    System.out.println("Files found in " + parent + ":");
                }
                System.out.println("  " + tmpFile.getName() + "\t" + formatter.format(lastAccessed) + 
                                "\t" + formatter.format(lastModified) + "\t" + lengthInBytes);                 
                                } catch (java.io.IOException e)
            {
                System.out.println(e);
            }
        }
    }

まとめ

JTOpenは、iSeriesとオープン・ソース・コミュニティーに、iSeriesにアクセスしてスキャンする強力なツールボックスを提供します。ここでは、JTOpenを使って実行できることのほんの一部を紹介しました。iSeriesをお持ちで、Javaの経験がある場合には、JTOpenをダウンロードして、使ってみましょう。iSeriesをお持ちでない場合は、JTOpenをサービスしますので、どうぞお買い求めください。


ダウンロード可能なリソース


コメント

コメントを登録するにはサインインあるいは登録してください。

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=Open source
ArticleID=232652
ArticleTitle=JTOpen: IBM iSeries向けのオープン・ソースJavaツールボックス
publish-date=02012001