package folioxml.config; import org.yaml.snakeyaml.Yaml; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.InputStream; import java.nio.file.Path; import java.nio.file.Paths; import java.text.SimpleDateFormat; import java.util.*; public class YamlInfobaseSet implements InfobaseSet { public static Map<String, InfobaseSet> parseYaml(String workingDir, InputStream s) { Yaml yaml = new Yaml(); HashMap<String, InfobaseSet> results = new HashMap<String, InfobaseSet>(); Map<String, Object> yml; yml = (Map<String, Object>) yaml.load(s); for (Map.Entry<String, Object> set : yml.entrySet()) { InfobaseSet is = new YamlInfobaseSet(set.getKey(), (Map<String, Object>) (set.getValue()), workingDir); results.put(set.getKey(), is); } return results; } public static Map<String, InfobaseSet> parseYamlFile(String path) throws FileNotFoundException { return parseYaml(new File(path).getParent(), new FileInputStream(new File(path))); } String name; String basedir; Map<String, Object> data; List<InfobaseConfig> infobases; Map<String, InfobaseConfig> infobasesByAlias; @Override public String getId() { return name; } @Override public InfobaseConfig getFirst() { return infobases.get(0); } @Override public List<InfobaseConfig> getInfobases() { return infobases; } @Override @Deprecated public String getExportDir(boolean create) { String exportPath = getStringAsPath("export_dir", create ? FolderCreation.CreateAsDir : FolderCreation.None); if (exportPath == null) { exportPath = Paths.get(getFirst().getFlatFilePath()).resolveSibling("export").toString(); } return exportPath; } public String getInfobaseDir() { String dir = getStringAsPath("infobase_dir", FolderCreation.None); if (dir == null) { dir = resolvePath(basedir, null); } return dir; } @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 public ExportLocations generateExportLocations() { Object el = data.get("export_locations"); return new YamlExportLocations(Paths.get(basedir), this.name, new Date(), (Map<String, Object>) el); } @Override @Deprecated // Generates a base path that can be used for logs, reports, etc. public String generateExportBaseFile() { String cleanName = name.toLowerCase(Locale.ENGLISH).replaceAll("[^0-9a-zA-Z_-]", ""); String exportFolderName = cleanName + "-all" + new SimpleDateFormat("-dd-MMM-yy-(s)").format(new Date()); return getExportFile(Paths.get(exportFolderName).resolve(cleanName).toString(), true); } @Override public InfobaseConfig byName(String name) { return infobasesByAlias.get(name.toLowerCase(Locale.ENGLISH)); } @Override public String getStringAsPath(String key, FolderCreation pathOptions) { return getStringAsPath(key, basedir, pathOptions); } public String getStringAsPath(String key, String base_path, FolderCreation pathOptions) { String value = getString(key); if (value == null) return null; String path = resolvePath(value, base_path); if (pathOptions != FolderCreation.None) YamlInfobaseConfig.createFoldersInPath(path, pathOptions); return path; } @Override public String getString(String key) { Object o = data.get(key); return o == null ? null : o.toString(); } @Override public Object getObject(String key) { return data.get(key); } @Override public Boolean getBool(String key) { return (Boolean) data.get(key); } @Override public Integer getInteger(String key) { return (Integer) data.get(key); } public YamlInfobaseSet(String name, Map<String, Object> map, String workingDir) { this.basedir = workingDir; this.data = map; this.name = name; this.infobases = new ArrayList<InfobaseConfig>(); this.infobasesByAlias = new HashMap<String, InfobaseConfig>(); for (Object o : ((List<Object>) data.get("infobases"))) { Map<String, Object> infobase = (Map<String, Object>) o; InfobaseConfig c = new YamlInfobaseConfig(this, infobase); this.infobases.add(c); for (String a : c.getAliases()) { this.infobasesByAlias.put(a, c); } } } private String slash() { return System.getProperty("file.separator"); } @Override public String getIndexDir() { String indexPath = getStringAsPath("index_dir", FolderCreation.None); if (indexPath == null) { indexPath = Paths.get(getExportDir(true)).resolve("combined_lucene_index").toString(); } return indexPath; } private String fixSlashes(String path) { char otherSlash = slash().charAt(0) == '/' ? '\\' : '/'; return path.replace(otherSlash, slash().charAt(0)); } private String joinPath(String a, String b) { a = fixSlashes(a); b = fixSlashes(b); //Trim slashes while (a.endsWith(slash())) a = a.substring(0, a.length() - 1); while (b.startsWith(slash())) b = b.substring(1); return a + slash() + b; } public String resolvePath(String path, String base_path) { if (path == null) return null; //Deal with user directories path = path.replaceFirst("^~", System.getProperty("user.home")); path = fixSlashes(path); Path p_path = Paths.get(path); if (p_path.isAbsolute()) { return p_path.toAbsolutePath().toString(); } else { if (base_path != null) { //Clean the base path, possibly resolving it String clean_base = resolvePath(base_path, null); return Paths.get(clean_base).resolve(p_path).toAbsolutePath().toString(); } else { return path; //Sad path, lost path, } } } }