反省が助けになると言ったのは正しかった。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();
}