1

私の jackrabbit データストアには、大きなバイナリ ファイルが格納されています。データストア ファイル システムを参照し、これらのファイルを問題なく開くことができます。

アプリケーション内からこれらのファイルを使用するにはどうすればよいでしょうか? もちろん、タイプ jcr.binary の getStream() メソッドを使用することもできますが、既存のファイルのすべてのコンテンツを新しい一時ファイルにストリーミングするだけですよね? 私のバイナリは非常に大きいので、それは望ましくありません。バイナリの完全なファイルシステム パスを取得する方法を探しています。jcr.Property のメソッド getpath() は、リポジトリ内のパスのみを返し、マップされたノード名のみを返し、ファイルシステムに実際に保存されているノード名は返しません。一般に、バイナリオブジェクトを Java.IO.File オブジェクトに解析する必要があり、ストリーミングを避けたい

編集: リフレクションを通じて、バイナリのクラスが class org.apache.jackrabbit.core.value.BLOBInDataStore であることがわかりました。そこから File 値に何らかの形でアクセスする必要があると思います

4

1 に答える 1

0

反省が助けになると言ったのは正しかった。jackrabbit データストアに格納されているバイナリの物理ファイルパスを返すコードは次のとおりです。

public String getPhysicalBinaryPath(Binary b){
    try {
        Field idField=b.getClass().getDeclaredField("identifier");
        idField.setAccessible(true);
        String identifier = (String)idField.get(b).toString();
        Field storeField=b.getClass().getDeclaredField("store");
        storeField.setAccessible(true);
        Object store = storeField.get(b);
        Field pathField = store.getClass().getDeclaredField("path");
        pathField.setAccessible(true);
        String dataStorePath = (String)pathField.get(store);

        String binaryPath = identifier.substring(0,2)+File.separator+
                            identifier.substring(2,4)+File.separator+
                            identifier.substring(4,6)+File.separator+
                            identifier;

        return dataStorePath+File.separator+binaryPath;

    } catch (IllegalArgumentException ex) {
        Logger.getLogger(Repoutput.class.getName()).log(Level.SEVERE, null, ex);
    } catch (IllegalAccessException ex) {
        Logger.getLogger(Repoutput.class.getName()).log(Level.SEVERE, null, ex);
    } catch (NoSuchFieldException ex) {
        Logger.getLogger(Repoutput.class.getName()).log(Level.SEVERE, null, ex);
    } catch (SecurityException ex) {
        Logger.getLogger(Repoutput.class.getName()).log(Level.SEVERE, null, ex);
    }

        return "";


}

編集:これはそれを行うための公式の方法です(jackrabbit-apiを使用する必要があります)

Binary b = session.getValueFactory().createBinary(in);
Value value = session.getValueFactory().createValue(b);
  if (value instanceof JackrabbitValue) {
   JackrabbitValue jv = (JackrabbitValue) value;
   String id = jv.getContentIdentity();
  }
于 2012-10-05T06:42:27.337 に答える