package org.jabref.model.entry; import java.net.URL; import java.nio.file.Path; import java.nio.file.Paths; import java.util.List; import java.util.Objects; import java.util.Optional; import org.jabref.model.database.BibDatabaseContext; import org.jabref.model.metadata.FileDirectoryPreferences; import org.jabref.model.util.FileHelper; /** * Represents the link to an external file (e.g. associated PDF file). */ public class LinkedFile { private static final LinkedFile NULL_OBJECT = new LinkedFile("", "", ""); private final String description; private final String link; private final String fileType; public LinkedFile(String description, String link, String fileType) { this.description = Objects.requireNonNull(description); this.link = Objects.requireNonNull(link); this.fileType = Objects.requireNonNull(fileType); } public LinkedFile(String description, URL link, String fileType) { this(description, Objects.requireNonNull(link).toString(), fileType); } public String getFileType() { return fileType; } public String getDescription() { return description; } public String getLink() { return link; } @Override public boolean equals(Object o) { if (this == o) { return true; } if (o instanceof LinkedFile) { LinkedFile that = (LinkedFile) o; if (!this.description.equals(that.description)) { return false; } if (!this.link.equals(that.link)) { return false; } return this.fileType.equals(that.fileType); } return false; } @Override public int hashCode() { return Objects.hash(description, link, fileType); } @Override public String toString() { return "ParsedFileField{" + "description='" + description + '\'' + ", link='" + link + '\'' + ", fileType='" + fileType + '\'' + '}'; } public boolean isEmpty() { return NULL_OBJECT.equals(this); } public boolean isOnlineLink() { return link.startsWith("http://") || link.startsWith("https://") || link.contains("www."); } public Optional<Path> findIn(BibDatabaseContext databaseContext, FileDirectoryPreferences fileDirectoryPreferences) { List<Path> dirs = databaseContext.getFileDirectoriesAsPaths(fileDirectoryPreferences); return findIn(dirs); } public Optional<Path> findIn(List<Path> directories) { Path file = Paths.get(link); if (file.isAbsolute() || directories.isEmpty()) { return Optional.of(file); } else { return FileHelper.expandFilenameAsPath(link, directories); } } }