package org.jabref.logic.openoffice;
import java.io.File;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Locale;
import java.util.stream.Collectors;
import org.jabref.logic.util.OS;
import org.jabref.logic.util.io.FileUtil;
public class OpenOfficeFileSearch {
/**
* Detects existing installation of OpenOffice and LibreOffice.
*
* @return a list of detected installation paths
*/
public static List<Path> detectInstallations() {
if (OS.WINDOWS) {
List<Path> programDirs = findWindowsOpenOfficeDirs();
return programDirs.stream().filter(dir -> FileUtil.find(OpenOfficePreferences.WINDOWS_EXECUTABLE, dir).isPresent()).collect(Collectors.toList());
} else if (OS.OS_X) {
List<Path> programDirs = findOSXOpenOfficeDirs();
return programDirs.stream().filter(dir -> FileUtil.find(OpenOfficePreferences.OSX_EXECUTABLE, dir).isPresent()).collect(Collectors.toList());
} else if (OS.LINUX) {
List<Path> programDirs = findLinuxOpenOfficeDirs();
return programDirs.stream().filter(dir -> FileUtil.find(OpenOfficePreferences.LINUX_EXECUTABLE, dir).isPresent()).collect(Collectors.toList());
}
return new ArrayList<>(0);
}
private static List<Path> findOpenOfficeDirectories(List<Path> programDirectories) {
List<Path> result = new ArrayList<>();
for (Path programDir : programDirectories) {
File[] subDirs = programDir.toFile().listFiles(File::isDirectory);
if (subDirs != null) {
for (File dir : subDirs) {
if (dir.getPath().toLowerCase(Locale.ROOT).contains("openoffice") || dir.getPath().toLowerCase(Locale.ROOT).contains("libreoffice")) {
result.add(dir.toPath());
}
}
}
}
return result;
}
private static List<Path> findWindowsOpenOfficeDirs() {
List<Path> sourceList = new ArrayList<>();
// 64-bit program directory
String progFiles = System.getenv("ProgramFiles");
if (progFiles != null) {
sourceList.add(Paths.get(progFiles));
}
// 32-bit program directory
progFiles = System.getenv("ProgramFiles(x86)");
if (progFiles != null) {
sourceList.add(Paths.get(progFiles));
}
return findOpenOfficeDirectories(sourceList);
}
private static List<Path> findOSXOpenOfficeDirs() {
List<Path> sourceList = Arrays.asList(Paths.get("/Applications"));
return findOpenOfficeDirectories(sourceList);
}
private static List<Path> findLinuxOpenOfficeDirs() {
List<Path> sourceList = Arrays.asList(Paths.get("/usr/lib"), Paths.get("/usr/lib64"), Paths.get("/opt"));
return findOpenOfficeDirectories(sourceList);
}
}