package org.jabref.logic.cleanup;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
import org.jabref.logic.util.io.FileUtil;
import org.jabref.model.FieldChange;
import org.jabref.model.cleanup.CleanupJob;
import org.jabref.model.database.BibDatabaseContext;
import org.jabref.model.entry.BibEntry;
import org.jabref.model.entry.LinkedFile;
import org.jabref.model.metadata.FileDirectoryPreferences;
public class RelativePathsCleanup implements CleanupJob {
private final BibDatabaseContext databaseContext;
private final FileDirectoryPreferences fileDirectoryPreferences;
public RelativePathsCleanup(BibDatabaseContext databaseContext, FileDirectoryPreferences fileDirectoryPreferences) {
this.databaseContext = Objects.requireNonNull(databaseContext);
this.fileDirectoryPreferences = Objects.requireNonNull(fileDirectoryPreferences);
}
@Override
public List<FieldChange> cleanup(BibEntry entry) {
List<LinkedFile> fileList = entry.getFiles();
List<LinkedFile> newFileList = new ArrayList<>();
boolean changed = false;
for (LinkedFile fileEntry : fileList) {
String oldFileName = fileEntry.getLink();
String newFileName = FileUtil
.shortenFileName(Paths.get(oldFileName), databaseContext.getFileDirectoriesAsPaths(fileDirectoryPreferences))
.toString();
LinkedFile newFileEntry = fileEntry;
if (!oldFileName.equals(newFileName)) {
newFileEntry = new LinkedFile(fileEntry.getDescription(), newFileName, fileEntry.getFileType());
changed = true;
}
newFileList.add(newFileEntry);
}
if (changed) {
Optional<FieldChange> change = entry.setFiles(newFileList);
if (change.isPresent()) {
return Collections.singletonList(change.get());
} else {
return Collections.emptyList();
}
}
return Collections.emptyList();
}
}