in vault-vlt/src/main/java/org/apache/jackrabbit/vault/vlt/VltFile.java [899:985]
private FileAction doUpdate(VaultFile remoteFile, boolean baseOnly)
throws VltException {
FileAction action;
VltEntryInfo base;
if (entry == null || entry.base() == null) {
// new entry
action = FileAction.ADDED;
entry = parent.getEntries().update(getName(), remoteFile.getAggregatePath(), remoteFile.getRepoRelPath());
base = entry.create(VltEntryInfo.Type.BASE);
entry.put(base);
} else {
action = FileAction.UPDATED;
base = entry.base();
// quick check if modified
if (!base.checkModified(remoteFile)) {
return FileAction.VOID;
}
}
long lastMod = remoteFile.lastModified();
if (lastMod == 0) {
lastMod = System.currentTimeMillis();
}
base.setDate(lastMod);
if (remoteFile.isDirectory()) {
if (!baseOnly) {
// ensure controlled
// todo: this does not belong here
if (entry.work() != null) {
action = FileAction.VOID;
} else {
entry.put(base.copyAs(VltEntryInfo.Type.WORK));
}
file.mkdir();
file.setLastModified(base.getDate());
VltDirectory dir = new VltDirectory(parent.getContext(), file);
if (!dir.isControlled()) {
dir.control(remoteFile.getPath(), remoteFile.getControllingAggregate().getPath());
action = FileAction.ADDED;
}
}
} else {
MetaFile baseFile = getBaseFile(true);
// copy file
byte[] lineFeed = MimeTypes.isBinary(remoteFile.getContentType())
? null
: LineOutputStream.LS_NATIVE;
VaultFileCopy copy;
try {
File temp = baseFile.openTempFile();
copy = VaultFileCopy.copy(remoteFile, temp, lineFeed);
baseFile.closeTempFile(false);
} catch (IOException e) {
throw exception("Error while copying files.", e);
}
// if md5 is equal, no update
if (copy.getMd5().equals(base.getMd5())) {
action = FileAction.VOID;
}
if (action == FileAction.VOID
&& (base.getContentType() != null || remoteFile.getContentType() != null)
&& (base.getContentType() == null || !base.getContentType().equals(remoteFile.getContentType()))) {
action = FileAction.UPDATED;
}
// update infos
VltEntryInfo work = entry.work();
base.setContentType(remoteFile.getContentType());
base.setSize(copy.getLength());
base.setMd5(copy.getMd5());
if (!baseOnly) {
// only copy if not equal
if (work == null || !work.getMd5().equals(copy.getMd5()) || !getFile().exists()) {
try {
baseFile.copyTo(getFile(), true);
entry.put(base.copyAs(VltEntryInfo.Type.WORK));
} catch (IOException e) {
throw exception("Error while copying files.", e);
}
}
}
}
return action;
}