package nebula.simpletemplate; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.net.JarURLConnection; import java.net.URL; import java.net.URLClassLoader; import java.net.URLConnection; import java.util.Iterator; public class Misc { public static final String newline = System.getProperty("line.separator"); /** * Makes it clear when a comparison is intended as reference equality. */ public static boolean referenceEquals(Object x, Object y) { return x == y; } // Seriously: why isn't this built in to java? public static String join(Iterator<?> iter, String separator) { StringBuilder buf = new StringBuilder(); while (iter.hasNext()) { buf.append(iter.next()); if (iter.hasNext()) { buf.append(separator); } } return buf.toString(); } // public static String join(Object[] a, String separator, int start, int // stop) { // StringBuilder buf = new StringBuilder(); // for (int i = start; i < stop; i++) { // if ( i>start ) buf.append(separator); // buf.append(a[i].toString()); // } // return buf.toString(); // } public static String strip(String s, int n) { return s.substring(n, s.length() - n); } // public static String stripRight(String s, int n) { // return s.substring(0, s.length()-n); // } /** Strip a single newline character from the front of {@code s}. */ public static String trimOneStartingNewline(String s) { if (s.startsWith("\r\n")) s = s.substring(2); else if (s.startsWith("\n")) s = s.substring(1); return s; } /** Strip a single newline character from the end of {@code s}. */ public static String trimOneTrailingNewline(String s) { if (s.endsWith("\r\n")) s = s.substring(0, s.length() - 2); else if (s.endsWith("\n")) s = s.substring(0, s.length() - 1); return s; } /** * Given, say, {@code file:/tmp/test.jar!/org/foo/templates/main.stg} * convert to {@code file:/tmp/test.jar!/org/foo/templates} */ public static String stripLastPathElement(String f) { int slash = f.lastIndexOf('/'); if (slash < 0) return f; return f.substring(0, slash); } public static String getFileNameNoSuffix(String f) { if (f == null) return null; f = getFileName(f); return f.substring(0, f.lastIndexOf('.')); } public static String getFileName(String fullFileName) { if (fullFileName == null) return null; File f = new File(fullFileName); // strip to simple name return f.getName(); } public static String getParent(String name) { // System.out.println("getParent("+name+")="+p); if (name == null) return null; int lastSlash = name.lastIndexOf('/'); if (lastSlash > 0) return name.substring(0, lastSlash); if (lastSlash == 0) return "/"; // System.out.println("getParent("+name+")="+p); return ""; } public static String getPrefix(String name) { if (name == null) return "/"; String parent = getParent(name); String prefix = parent; if (!parent.endsWith("/")) prefix += '/'; return prefix; } public static String replaceEscapes(String s) { s = s.replaceAll("\n", "\\\\n"); s = s.replaceAll("\r", "\\\\r"); s = s.replaceAll("\t", "\\\\t"); return s; } /** * Replace >\> with >> in s. Replace \>> unless prefix of \>>> with >>. Do * NOT replace if it's <\\> */ public static String replaceEscapedRightAngle(String s) { StringBuilder buf = new StringBuilder(); int i = 0; while (i < s.length()) { char c = s.charAt(i); if (c == '<' && s.substring(i).startsWith("<\\\\>")) { buf.append("<\\\\>"); i += "<\\\\>".length(); continue; } if (c == '>' && s.substring(i).startsWith(">\\>")) { buf.append(">>"); i += ">\\>".length(); continue; } if (c == '\\' && s.substring(i).startsWith("\\>>") && !s.substring(i).startsWith("\\>>>")) { buf.append(">>"); i += "\\>>".length(); continue; } buf.append(c); i++; } return buf.toString(); } public static boolean urlExists(URL url) { try { URLConnection connection = url.openConnection(); if (connection instanceof JarURLConnection) { JarURLConnection jarURLConnection = (JarURLConnection) connection; URLClassLoader urlClassLoader = new URLClassLoader(new URL[] { jarURLConnection.getJarFileURL() }); try { return urlClassLoader.findResource(jarURLConnection.getEntryName()) != null; } finally { // urlClassLoader.close(); } } InputStream is = url.openStream(); is.close(); return true; } catch (IOException ioe) { return false; } } }