|
|
@ -25,7 +25,64 @@ public class FilerClient { |
|
|
|
} |
|
|
|
|
|
|
|
public static String toFileId(FilerProto.FileId fid) { |
|
|
|
return String.format("%d,%d%x", fid.getVolumeId(), fid.getFileKey(), fid.getCookie()); |
|
|
|
if (fid == null) { |
|
|
|
return null; |
|
|
|
} |
|
|
|
return String.format("%d,%x%08x", fid.getVolumeId(), fid.getFileKey(), fid.getCookie()); |
|
|
|
} |
|
|
|
|
|
|
|
public static FilerProto.FileId toFileIdObject(String fileIdStr) { |
|
|
|
if (fileIdStr == null || fileIdStr.length() == 0) { |
|
|
|
return null; |
|
|
|
} |
|
|
|
int commaIndex = fileIdStr.lastIndexOf(','); |
|
|
|
String volumeIdStr = fileIdStr.substring(0, commaIndex); |
|
|
|
String fileKeyStr = fileIdStr.substring(commaIndex + 1, fileIdStr.length() - 8); |
|
|
|
String cookieStr = fileIdStr.substring(fileIdStr.length() - 8); |
|
|
|
|
|
|
|
return FilerProto.FileId.newBuilder() |
|
|
|
.setVolumeId(Integer.parseInt(volumeIdStr)) |
|
|
|
.setFileKey(Long.parseLong(fileKeyStr, 16)) |
|
|
|
.setCookie((int) Long.parseLong(cookieStr, 16)) |
|
|
|
.build(); |
|
|
|
} |
|
|
|
|
|
|
|
public static List<FilerProto.FileChunk> beforeEntrySerialization(List<FilerProto.FileChunk> chunks) { |
|
|
|
List<FilerProto.FileChunk> cleanedChunks = new ArrayList<>(); |
|
|
|
for (FilerProto.FileChunk chunk : chunks) { |
|
|
|
FilerProto.FileChunk.Builder chunkBuilder = chunk.toBuilder(); |
|
|
|
chunkBuilder.clearFileId(); |
|
|
|
chunkBuilder.clearSourceFileId(); |
|
|
|
chunkBuilder.setFid(toFileIdObject(chunk.getFileId())); |
|
|
|
FilerProto.FileId sourceFid = toFileIdObject(chunk.getSourceFileId()); |
|
|
|
if (sourceFid != null) { |
|
|
|
chunkBuilder.setSourceFid(sourceFid); |
|
|
|
} |
|
|
|
cleanedChunks.add(chunkBuilder.build()); |
|
|
|
} |
|
|
|
return cleanedChunks; |
|
|
|
} |
|
|
|
|
|
|
|
public static FilerProto.Entry afterEntryDeserialization(FilerProto.Entry entry) { |
|
|
|
if (entry.getChunksList().size() <= 0) { |
|
|
|
return entry; |
|
|
|
} |
|
|
|
String fileId = entry.getChunks(0).getFileId(); |
|
|
|
if (fileId != null && fileId.length() != 0) { |
|
|
|
return entry; |
|
|
|
} |
|
|
|
FilerProto.Entry.Builder entryBuilder = entry.toBuilder(); |
|
|
|
entryBuilder.clearChunks(); |
|
|
|
for (FilerProto.FileChunk chunk : entry.getChunksList()) { |
|
|
|
FilerProto.FileChunk.Builder chunkBuilder = chunk.toBuilder(); |
|
|
|
chunkBuilder.setFileId(toFileId(chunk.getFid())); |
|
|
|
String sourceFileId = toFileId(chunk.getSourceFid()); |
|
|
|
if (sourceFileId != null) { |
|
|
|
chunkBuilder.setSourceFileId(sourceFileId); |
|
|
|
} |
|
|
|
entryBuilder.addChunks(chunkBuilder); |
|
|
|
} |
|
|
|
return entryBuilder.build(); |
|
|
|
} |
|
|
|
|
|
|
|
public boolean mkdirs(String path, int mode) { |
|
|
@ -188,7 +245,7 @@ public class FilerClient { |
|
|
|
List<FilerProto.Entry> entries = new ArrayList<>(); |
|
|
|
while (iter.hasNext()) { |
|
|
|
FilerProto.ListEntriesResponse resp = iter.next(); |
|
|
|
entries.add(fixEntryAfterReading(resp.getEntry())); |
|
|
|
entries.add(afterEntryDeserialization(resp.getEntry())); |
|
|
|
} |
|
|
|
return entries; |
|
|
|
} |
|
|
@ -203,7 +260,7 @@ public class FilerClient { |
|
|
|
if (entry == null) { |
|
|
|
return null; |
|
|
|
} |
|
|
|
return fixEntryAfterReading(entry); |
|
|
|
return afterEntryDeserialization(entry); |
|
|
|
} catch (Exception e) { |
|
|
|
if (e.getMessage().indexOf("filer: no entry is found in filer store") > 0) { |
|
|
|
return null; |
|
|
@ -270,22 +327,4 @@ public class FilerClient { |
|
|
|
return true; |
|
|
|
} |
|
|
|
|
|
|
|
private FilerProto.Entry fixEntryAfterReading(FilerProto.Entry entry) { |
|
|
|
if (entry.getChunksList().size() <= 0) { |
|
|
|
return entry; |
|
|
|
} |
|
|
|
String fileId = entry.getChunks(0).getFileId(); |
|
|
|
if (fileId != null && fileId.length() != 0) { |
|
|
|
return entry; |
|
|
|
} |
|
|
|
FilerProto.Entry.Builder entryBuilder = entry.toBuilder(); |
|
|
|
entryBuilder.clearChunks(); |
|
|
|
for (FilerProto.FileChunk chunk : entry.getChunksList()) { |
|
|
|
FilerProto.FileChunk.Builder chunkBuilder = chunk.toBuilder(); |
|
|
|
chunkBuilder.setFileId(toFileId(chunk.getFid())); |
|
|
|
entryBuilder.addChunks(chunkBuilder); |
|
|
|
} |
|
|
|
return entryBuilder.build(); |
|
|
|
} |
|
|
|
|
|
|
|
} |