見出し画像

Apache Commons VFS のすすめ (4)

はじめに

今回は、独自のファイルシステムにアクセスする Commons VFS のプロバイダーを作成する手順を紹介します。

Commons VFS を使用する時、デフォルトではサポートしていないシステムにアクセスしたいときには、基本的に他の方が作成したプロバイダーを探して導入するのであまり役立たないかもしれません。

しかし、Commons VFS を使用する際、内部がどのようになっているのかを知っておくことで、Commons VFS の API を内部の動きからどのようなものなのか想像しやすくなると思います。

Commons VFS はそこまで流行っているわけではありませんので、自力で解決しなくてはいけない時もありますので、知っておいて損はないかもしれません。

Commons VFS の使い方については、前回までの記事で説明しておりますので、参照してください。

Apache Commons VFS のすすめ (1)
Apache Commons VFS のすすめ (2)
Apache Commons VFS のすすめ (3)

構成

独自プロバイダーを実装する際に知っておいた方が良い Commons VFS のクラス構成をざっくりと説明しようと思います。

Commons VFS のプロバイダーはいくつかの基本的なクラスで構成されています。

独自プロバイダーを実装する場合、これらのうち、いくつかのインターフェイス(赤枠)を実装し、既に提供されているクラスを返すことでユーザーに独自プロバイダーを使って、ファイルシステムにアクセスしてもらうようにします。


クラス構成

FileProvider

FileProvider は FileSystemManager に登録される独自プロバイダーを提供します。
独自プロバイダーはこのクラスを実装することから始まります。

基本的にはこのインターフェイスを実装している AbstractOriginatingFileProvider を継承して、独自プロバイダークラスを実装することになります。

FileNameParser

FileNameParser は独自プロバイダーが解釈するファイル名(URL)を解析するためのパーサーです。
このクラスは FileProvider に設定され、独自プロバイダーが使用されるときには常にこのクラスを通して、FileName が作成されます。

このクラスは独自実装しなくても既存のクラスを使用することで提供することが出来ます。

代表的な既存クラスは以下の様になります。

  • URLFileNameParser
    ホスト名やパス、クエリ文字列などを含んだ通常の URL を解析する。

  • GenericFileNameParser
    ホスト名のないパスから始まるローカルファイルのような URL を解析する。

FileName

FileObject の場所を表すクラスです。
このクラスは、FileNameParser を通して作成され、内部で場所を示すときにはこのクラスが使用されます。

ただ、このクラスを使用する時には、基本的に URL であることを念頭に置く必要があります。

このクラスから返される文字列は常に最小限 URL エンコードされた文字列が返ります(基本的には "%" のみ)。

つまり、get***Decoded() と言うように "Decoded" と付かない関数が返した文字列は URL エンコードされた文字列が返ってきます。
そのため、"get***Decoded()" のような関数が返した文字列を表示などに使用する場合には、URL デコードして使用する必要があります。

逆に文字列を FileName にするときには、最低限 "%" は URL エンコードしていないとエラーになる可能性があります。

FileSystemOptions

FileSystemOptions は独自プロバイダーを用いてファイルシステムに接続するときの設定を保持します。
このクラスは、拡張すること無く、提供されているものをそのまま使用します。

このクラスに保持された設定は、FileSystemManager を使用してファイルシステムにアクセスするときに渡されますので、FileSystem 構築の設定値として使用します。

FileSystemConfigBuilder

FileSystemConfigBuilder は独自プロバイダー毎の設定値をユーザーに設定してもらうときに使用します。

FileSysytemOptions は値を設定するための関数が外部に公開されておらず、FileSystemConfigBuilder を継承したクラスがアクセス出来るようになっています。
このため、FileSystemConfigBuilder を継承したクラスでは、FileSysytemOptions を受け取る独自の設定関数を提供します。渡された FileSysytemOptions に FileSystemConfigBuilder が値を設定するように実装することで、その独自プロバイダー固有の設定関数のみが提供されることになります。

つまり、ユーザーが独自プロバイダーの設定を使用したいときには、独自プロバイダーが提供している FileSystemConfigBuilder を使用して、FileSysytemOptions に値を設定することになります。

FileSystem

FileSystem はファイルシステムを表すファイルシステムの管理単位を表します。

基本的にはこのインターフェイスを実装している AbstractFileSystem を継承して実装することになります。

内部的には、ファイルシステムにアクセスするクライアントをこのクラスに保持させて、接続単位にこのクラスを管理することになります。

なお、設定などでクライアントを切り替えなくてはいけないファイルシステムの時には、アクセス先毎に FileSystem を作成し、それぞれがクライアントを保持して提供するようにします。

FileObject

FileObject はファイルシステムの各フォルダーやファイルを表すクラスです。

基本的にはこのインターフェイスを実装している AbstractFileObject を継承して実装します。

このクラスは AbstractFileSystem を使用している場合、 createFile(AbstractFileName) で作成されますが、作成された FileObject はキャッシュされ、同じ FileName が要求されたときには使い回されます。

このため、このクラスではキャッシュされていることを前提に実装する必要があります。

FileContent

FileContent は名前の通りファイルコンテンツを表すクラスです。

FileObject が AbstractFileObject を継承して実装している場合には、デフォルト実装の FileContent クラスが返るようになっていますので基本的に何かをする必要はありません。

まとめ

独自プロバイダーを実装するときには、このクラス構成を意識して実装すると分かりやすいと思います。

また、Commons VFS を使うときにもこういったクラス構成になっていることを意識して使っていると細かい部分が見えてくることもあります。

次回は・・・

今回は、独自プロバイダーを実装する前知識としてクラス構成を説明しました。

次回は、実際に FileProvider を作成する手順を紹介いたします。

#プログラミング #Java #Apache #エンジニア#ITエンジニア#開発#ウイングアーク#ウイングアーク1st#テックブログ#エンジニア転職#エンジニア採用


この記事が気に入ったらサポートをしてみませんか?