package folioxml.config; import java.io.File; import java.nio.file.Paths; import java.text.SimpleDateFormat; import java.util.*; public class YamlInfobaseConfig implements InfobaseConfig { Map<String, Object> data; YamlInfobaseSet parent; public YamlInfobaseConfig(YamlInfobaseSet parent, Map<String, Object> configData) { this.parent = parent; this.data = configData; } @Override public String getId() { return getString("id") == null ? getAliases().get(0) : getString("id"); } @Override public String getFlatFilePath() { return getStringAsPath("path", parent.getInfobaseDir(), FolderCreation.None); } @Override public String getIndexDir() { String indexPath = getStringAsPath("index_dir", FolderCreation.None); if (indexPath == null) { indexPath = Paths.get(getExportDir(true)).resolve(getId() + "_lucene_index").toString(); } return indexPath; } @Override public String getExportDir(boolean create) { return getStringAsPath("export_dir", FolderCreation.CreateAsDir) == null ? parent.getExportDir(create) : getStringAsPath("export_dir", FolderCreation.CreateAsDir); } @Override public String getExportFile(String filename, boolean createFolders) { String path = Paths.get(getExportDir(createFolders)).resolve(filename).toAbsolutePath().toString(); YamlInfobaseConfig.createFoldersInPath(path, createFolders ? FolderCreation.CreateParents : FolderCreation.None); return path; } @Override // Generates a base path that can be used for logs, reports, etc. public String generateExportBaseFile() { String exportFolderName = getId() + new SimpleDateFormat("-dd-MMM-yy-(S)").format(new Date()); return getExportFile(Paths.get(exportFolderName).resolve(getId()).toString(), true); } @Override public List<String> getAliases() { ArrayList<String> aliases = new ArrayList<String>(); File fff = new File(getFlatFilePath()); String nameWithoutExtension = fff.getName().replaceAll("\\.FFF", "").toLowerCase(Locale.ENGLISH); String sanitizedName = nameWithoutExtension.replaceAll("[^0-9a-zA-Z_-]|^[0-9_-]", ""); aliases.add(sanitizedName); aliases.add(nameWithoutExtension); aliases.add(nameWithoutExtension + ".nfo"); Object aliasList = data.get("aliases"); if (aliasList != null) { List<Object> configAliases = (List<Object>) aliasList; for (Object o : configAliases) { aliases.add(o.toString().toLowerCase(Locale.ENGLISH)); } } return aliases; } @Override public ExportLocations generateExportLocations() { Object el = data.get("export_locations"); return new YamlExportLocations(Paths.get(parent.basedir), this.getId(), new Date(), (Map<String, Object>) el); } @Override public String getStringAsPath(String key, FolderCreation pathOptions) { return getStringAsPath(key, null, pathOptions); } public Object getObject(String key) { return data.get(key); } public String getStringAsPath(String key, String base_path, FolderCreation pathOptions) { String value = getString(key); if (value == null) return null; String path = parent.resolvePath(value, base_path); if (pathOptions != FolderCreation.None) createFoldersInPath(path, pathOptions); return path; } public static String createFoldersInPath(String path, FolderCreation creationOptions) { if (creationOptions == FolderCreation.None) return path; File to_create = creationOptions == FolderCreation.CreateParents ? new File(path).getParentFile() : new File(path); if (!to_create.exists() && !to_create.mkdirs()) { //throw new IOException("Failed to create directories in " + to_create.toString()); } return path; } @Override public String getString(String key) { Object o = data.get(key); return o == null ? null : o.toString(); } @Override public Boolean getBool(String key) { return (Boolean) data.get(key); } @Override public Integer getInteger(String key) { return (Integer) data.get(key); } }