/* * Copyright (c) 2010-2016, Sikuli.org, sikulix.com * Released under the MIT License. * */ package org.sikuli.basics; import org.sikuli.script.RunTime; import java.io.*; import java.net.URL; import java.util.ArrayList; import java.util.regex.Pattern; public class ExtensionManager { private static ExtensionManager _instance = null; private ArrayList<Extension> extensions; private ExtensionManager() { extensions = new ArrayList<Extension>(); Extension e; String p, n, v; File dir = new File(Settings.getUserExtPath()); for (File d : dir.listFiles()) { if (d.getAbsolutePath().endsWith(".jar")) { p = d.getAbsolutePath(); n = d.getName(); n = n.substring(0, n.length()-4); if (n.contains("-")) { v = n.substring(n.lastIndexOf("-")+1); n = n.substring(0, n.lastIndexOf("-")); } else { v = "0.0"; } e = new Extension(n, p, v); extensions.add(e); } } } public static ExtensionManager getInstance() { if (_instance == null) { _instance = new ExtensionManager(); } return _instance; } public boolean install(String name, String url, String version) { if (url.startsWith("---extensions---")) { url = RunTime.get().SikuliRepo + name + "-" + version + ".jar"; } String extPath = Settings.getUserExtPath(); String tmpdir = RunTime.get().fpBaseTempPath; try { File localFile = new File(FileManager.downloadURL(new URL(url), tmpdir)); String extName = localFile.getName(); File targetFile = new File(extPath, extName); if (targetFile.exists()) { targetFile.delete(); } if (!localFile.renameTo(targetFile)) { Debug.error("ExtensionManager: Failed to install " + localFile.getName() + " to " + targetFile.getAbsolutePath()); return false; } addExtension(name, localFile.getAbsolutePath(), version); } catch (IOException e) { Debug.error("ExtensionManager: Failed to download " + url); return false; } return true; } private void addExtension(String name, String path, String version) { Extension e = find(name, version); if (e == null) { extensions.add(new Extension(name, path, version)); } else { e.path = path; } } public boolean isInstalled(String name) { if (find(name) != null) { return true; } else { return false; } } public String getLoadPath(String name) { Extension e = find(name); if (e != null) { Debug.log(2, "ExtensionManager: found: "+ name + " ( " + e.version + " )"); return e.path; } else { if (!name.endsWith(".jar")) { Debug.error("ExtensionManager: not found: "+ name ); } return null; } } public boolean isOutOfDate(String name, String version) { Extension e = find(name); if (e == null) { return false; } else { String s1 = normalisedVersion(e.version); // installed version String s2 = normalisedVersion(version); // version number to check int cmp = s1.compareTo(s2); return cmp < 0; } } public String getVersion(String name) { Extension e = find(name); if (e != null) { return e.version; } else { return null; } } private Extension find(String name) { if (name.endsWith(".jar")) { name = name.substring(0, name.length()-4); } String v; if (name.contains("-")) { v = name.substring(name.lastIndexOf("-")+1); return find(name.substring(0, name.lastIndexOf("-")), v); } else { v = normalisedVersion("0.0"); } Extension ext = null; for (Extension e : extensions) { if (e.name.equals(name)) { if (v.compareTo(normalisedVersion(e.version)) <= 0) { ext = e; v = normalisedVersion(e.version); } } } return ext; } private Extension find(String name, String version) { String v = normalisedVersion(version); for (Extension e : extensions) { if (e.name.equals(name) && normalisedVersion(e.version).equals(v)) { return e; } } return null; } private static String normalisedVersion(String version) { return normalisedVersion(version, ".", 4); } private static String normalisedVersion(String version, String sep, int maxWidth) { String[] split = Pattern.compile(sep, Pattern.LITERAL).split(version); StringBuilder sb = new StringBuilder(); for (String s : split) { sb.append(String.format("%" + maxWidth + 's', s)); } return sb.toString(); } } class Extension implements Serializable { public String name, path, version; public Extension(String name_, String path_, String version_) { name = name_; path = path_; version = version_; } }