前回の記事「Connect for Java APIを使ってみる3 ファイルの保存/アーカイブ/カスタムプロパティをセット」ではinvoiceAgent Connect for Java APIを使ったファイルのアーカイブ方法についてご説明しました。
今回は保管したファイルを探し出すために必要なAPIについてご説明いたします。
invoiceAgentではフォルダーやファイルにユニークなIDが付与されており、ご説明にあたり本記事ではそれを「フォルダーID」「文書ID」と記載いたします。
具体的には以下の3つの処理を行います。
- フォルダーパスからフォルダーIDを取得する
- フォルダー配下の文書一覧を取得しその文書IDを取得する
- 指定フォルダー配下をキーワードで全文検索、ファイル名検索を組み合わせて行う
これらの処理をメインメソッドに記載すると以下のような流れになります。
/**
* メイン
* @param args
*/
public static void main(String[] args) throws Exception {
//1.ログイン
C4JApi3ListSearch cls = new C4JApi3ListSearch();
try {
cls.login();
System.out.println("1.ログイン成功");
} catch (SpaClientException e) {
System.out.println("ログインに失敗しました。ID/PWを確認してください。");
e.printStackTrace();
return;
}
//2.フォルダーのパスからフォルダーID取得
System.out.println("2.フォルダーのパスからフォルダーID取得");
String folderPath = "/01.機能別/01.検索/101.基本検索";
String folderId = cls.getFolderId(folderPath);
System.out.println("2.フォルダーID取得 パス " + folderPath + " ID = " + folderId);
//3.フォルダー配下にある全ファイルの文書IDを取得
System.out.println("3.フォルダー配下にある全ファイルの文書IDを取得");
List dlist = cls.getDocumentIdList(folderId);
for (String did : dlist) {
System.out.println(" 文書ID = " + did);
}
//4.指定フォルダー内を全文&ファイル名検索
System.out.println("4.指定フォルダー内を全文&ファイル名検索");
List srlist = cls.getSearchDocument(folderId, "札幌市", "05");
for (String did : srlist) {
System.out.println(" 検索結果ドキュメントID = " + did);
}
//9.ログアウト
cls.logout();
System.out.println("9.ログアウト 成功");
}
1.ログイン、9.ログアウトの解説は省略させていただき2~3の処理についてご説明します。
本記事の解説を一通り実装したサンプルを末尾のリンクよりダウンロードいただけます。
フォルダーパスからフォルダーIDの取得 FoldersResourceクラス
フォルダーパスをフォルダーIDに変換するにはFoldersResourceクラスを使用します。
実装を見てみましょう。
/**
* 指定したフォルダーパスからフォルダーのIDを返す
* @param path パス(例: /フォルダーA/フォルダーB)
* @return フォルダーID
* @throws SpaClientException
* @throws IOException
*/
public String getFolderId(String path) throws SpaClientException,IOException{
String folderid = null;
//FoldersResourceをインスタンス化
FoldersResource fr = new FoldersResource(client__);
//フォルダー情報パラメータ
List fnames = new ArrayList();
fnames.add(path);
//フォルダーID取得を実行
LookupTableList lt = fr.lookup(fnames);
for(LookupTableEntry lte: lt){
folderid = lte.getId();
}
return folderid;
}
引数で指定したフォルダーパスを、FoldersResource#lookupでフォルダーIDに変換していることがお分かりいただけると思います。
特定フォルダー配下の文書一覧を取得する DocumentsResourceクラス
文書に関する処理はDocumentsResourceクラスを使用します。
/**
* フォルダーID配下にある全ファイルの文書IDを取得
*
* @param folderId フォルダーID
* @return ドキュメントIDのリスト
* @throws SpaClientException
* @throws IOException
*/
public List getDocumentIdList(String folderId) throws SpaClientException,IOException{
List list = new ArrayList();
DocumentsResource dr = new DocumentsResource(client__);
DocumentList dlist = dr.list(Long.parseLong(folderId), false);
//DocumentContentからIDを取得
for(DocumentContent dcon: dlist){
String id = dcon.getId();
list.add(id);
}
return list;
}
DocumentsResource#listにフォルダーIDを指定することで全文書の文書IDを取得しています。
第二引数でfalseを指定しているのは直下のフォルダーを取得しないためです。
全文検索、ファイル名検索を組み合わせて行う SearchResourceクラス
検索に関してはSearchResourceクラスを使用します。
/**
* 全文&ファイル名検索を実行する。
* 引数で指定したフォルダーID配下を対象、全文検索キーワードを含む、ファイル名の一部にこのワードを含むで検索を行います。
* 戻り値で検索結果にヒットした文書ID
*
* @param folderId フォルダーID
* @param keyword 全文検索キーワード
* @param fileNameKey ファイル名に含む文字列
* @return ヒットしたファイルの文書ID
* @throws SpaClientException
* @throws IOException
*/
public List getSearchDocument(String folderId, String keyword, String fileNameKey) throws SpaClientException,IOException{
List list = new ArrayList();
//検索パラメータ設定
MultiFolderSearchConditionList searchConditionList = new MultiFolderSearchConditionList();
//フォルダー指定
List folderIds = new ArrayList<>();
folderIds.add(new FolderCondition(String.valueOf(folderId)));
searchConditionList.setFolderIds(folderIds);
//全文検索キーワード設定
searchConditionList.setSearchWord(keyword);
//ファイル名にfileNameKeyを含むの条件を指定
SystemPropertySearchConditionEntry spe = new SystemPropertySearchConditionEntry();
//ファイル名で検索を指定
spe.setName(PropertyName.name);
//キーワード
spe.setValue(fileNameKey);
//「含む」条件の設定
spe.setType(SearchConditionEntry.ConditionType.contains);
List selist = new ArrayList();
selist.add(spe);
searchConditionList.setConditions(selist);
//検索実行
SearchResource searchResource = new SearchResource(client__);
SearchResultDocumentList searchResultDocumentList = searchResource.search(searchConditionList);
//結果から文書IDを取得
List dlist = searchResultDocumentList.getDocuments();
for (DocumentContent dc : dlist) {
String did = dc.getId();
list.add(did);
}
return list;
}
検索を実行するSearchResourceクラスの使い方はシンプルですが、検索条件を格納するMultiFolderSearchConditionListの使い方はいろいろと条件指定できるため複雑に感じられるかもしれません。
全文検索はMultiFolderSearchConditionList#setSearchWord に検索キーワードを指定します。
ファイル名に「〇〇を含む」といった条件指定にSystemPropertySearchConditionEntry のsetName,setValue,setTypeメソッドで指定します。
検索結果はList<DocumentContent>で返ってくるのでそこから文書IDを取得しています。
サンプルソースのダウンロードと実行
本記事でご説明したサンプルソースを以下よりダウンロードいただけます。
※ダウンロードボタンをクリックするとzip形式でダウンロードいただけます。解凍してご確認ください。
※ソースファイルの文字コードはUTF-8です。
※実行の際は必ず「Connect for Java APIを使ってみる1 invoiceAgent Connect for Java APIとは」でご説明したライブラリへクラスパスを通してください。
事項すると以下のようにコンソール出力されます。
1.ログイン成功
2.フォルダーのパスからフォルダーID取得
2.フォルダーID取得 パス /01.機能別/01.検索/101.基本検索 ID = 103
3.フォルダー配下にある全ファイルの文書IDを取得
文書ID = 109
文書ID = 104
文書ID = 105
文書ID = 106
文書ID = 107
文書ID = 108
文書ID = 100
文書ID = 101
文書ID = 102
文書ID = 103
4.指定フォルダー内を全文&ファイル名検索
検索結果文書ID = 107
9.ログアウト 成功
Connect for Java APIを使ってみる4 文書一覧の取得/検索 まとめ
今回はinvoiceAgent Connect for Java APIを利用して保管後のファイルを見つけ出すための一覧取得や検索を実行しました。
invoiceAgentに保管後の文書操作を行うには基本のAPIになると思います。
検索についてはいろいろな条件が指定できるために、APIとしてはJavaDocを見ただけでは分かりにくいところもあると思いますが今回の実装を参考にしてください。
※本記事の情報は、2023年04月21日現在のものです。(invoiceAgent V10.8.1 / invoiceAgent Cloud Ver.10.8.1.1302)