All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.xhtmlrenderer.util.GeneralUtil Maven / Gradle / Ivy

The newest version!
/*
 * {{{ header & license
 * GeneralUtil.java
 * Copyright (c) 2004, 2005 Patrick Wright
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public License
 * as published by the Free Software Foundation; either version 2.1
 * of the License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.	See the
 * GNU Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 * }}}
 */
package org.xhtmlrenderer.util;

import java.io.*;
import java.net.URL;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;


/**
 * Description of the Class
 *
 * @author Patrick Wright
 */
public class GeneralUtil {

    /**
     * Used to format an Object's hashcode into a 0-padded 10 char String, e.g.
     * for 24993066 returns "0024993066"
     */
    public final static java.text.DecimalFormat PADDED_HASH_FORMAT = new java.text.DecimalFormat("0000000000");

    /**
     * Description of the Method
     *
     * @param obj      PARAM
     * @param resource PARAM
     * @return Returns
     */
    public static InputStream openStreamFromClasspath(Object obj, String resource) {
        InputStream readStream = null;
        try {
            ClassLoader loader = obj.getClass().getClassLoader();
            if (loader == null) {
                readStream = ClassLoader.getSystemResourceAsStream(resource);
            } else {
                readStream = loader.getResourceAsStream(resource);
            }
            if (readStream == null) {
                URL stream = resource.getClass().getResource(resource);
                if ( stream != null ) readStream = stream.openStream();
            }
        } catch (Exception ex) {
            XRLog.exception("Could not open stream from CLASSPATH: " + resource, ex);
        }
        return readStream;
    }

    public static URL getURLFromClasspath(Object obj, String resource) {
        URL url = null;
        try {
            ClassLoader loader = obj.getClass().getClassLoader();
            if (loader == null) {
                url = ClassLoader.getSystemResource(resource);
            } else {
                url = loader.getResource(resource);
            }
            if (url == null) {
                url = resource.getClass().getResource(resource);
            }
        } catch (Exception ex) {
            XRLog.exception("Could not get URL from CLASSPATH: " + resource, ex);
        }
        return url;
    }

    /**
     * Dumps an exception to the console, only the last 5 lines of the stack
     * trace.
     *
     * @param ex PARAM
     */
    public static void dumpShortException(Exception ex) {
        String s = ex.getMessage();
        if (s == null || s.trim().equals("null")) {
            s = "{no ex. message}";
        }
        System.out.println(s + ", " + ex.getClass());
        StackTraceElement[] stes = ex.getStackTrace();
        for (int i = 0; i < stes.length && i < 5; i++) {
            StackTraceElement ste = stes[i];
            System.out.println("  " + ste.getClassName() + "." + ste.getMethodName() + "(ln " + ste.getLineNumber() + ")");
        }
    }

    /**
     * Returns a String tracking the last n method calls, from oldest to most
     * recent. You can use this as a simple tracing mechanism to find out the
     * calls that got to where you execute the trackBack() call
     * from. Example:

*
     * // called from Box.calcBorders(), line 639
     * String tback = GeneralUtil.trackBack(6);
     * System.out.println(tback);
     * 
produces *
     * Boxing.layoutChildren(ln 204)
     * BlockBoxing.layoutContent(ln 81)
     * Boxing.layout(ln 72)
     * Boxing.layout(ln 133)
     * Box.totalLeftPadding(ln 306)
     * Box.calcBorders(ln 639)
     * 
* The trackBack() method itself is always excluded from the dump. * Note the output may not be useful if HotSpot has been optimizing the * code. * * @param cnt How far back in the call tree to go; if call tree is smaller, will * be limited to call tree. * @return see desc */ public static String trackBack(int cnt) { Exception ex = new Exception(); StringBuffer sb = new StringBuffer(); List list = new ArrayList(cnt); StackTraceElement[] stes = ex.getStackTrace(); if (cnt >= stes.length) { cnt = stes.length - 1; } // >= 1 to not include this method for (int i = cnt; i >= 1; i--) { StackTraceElement ste = stes[i]; sb.append(GeneralUtil.classNameOnly(ste.getClassName())); sb.append("."); sb.append(ste.getMethodName()); sb.append("(ln " + ste.getLineNumber() + ")"); list.add(sb.toString()); sb = new StringBuffer(); } Iterator iter = list.iterator(); StringBuffer padding = new StringBuffer(""); StringBuffer trackback = new StringBuffer(); while (iter.hasNext()) { String s = (String) iter.next(); trackback.append(padding + s + "\n"); padding.append(" "); } return trackback.toString(); } /** * Given an Object instance, returns just the classname with no package * * @param o PARAM * @return Returns */ public static String classNameOnly(Object o) { String s = "[null object ref]"; if (o != null) { s = classNameOnly(o.getClass().getName()); } return s; } /** * Given a String classname, returns just the classname with no package * * @param cname PARAM * @return Returns */ public static String classNameOnly(String cname) { String s = "[null object ref]"; if (cname != null) { s = cname.substring(cname.lastIndexOf('.') + 1); } return s; } /** * Description of the Method * * @param o PARAM * @return Returns */ public static String paddedHashCode(Object o) { String s = "0000000000"; if (o != null) { s = PADDED_HASH_FORMAT.format(o.hashCode()); } return s; } public static boolean isMacOSX() { try { if (System.getProperty("os.name").toLowerCase().startsWith("mac os x")) { return true; } } catch (SecurityException e) { System.err.println(e.getLocalizedMessage()); } return false; } public static StringBuffer htmlEscapeSpace(String uri) { StringBuffer sbURI = new StringBuffer((int) (uri.length() * 1.5)); char ch; for (int i = 0; i < uri.length(); ++i) { ch = uri.charAt(i); if (ch == ' ') { sbURI.append("%20"); } else if (ch == '\\'){ sbURI.append('/'); } else { sbURI.append(ch); } } return sbURI; } public static String inputStreamToString(InputStream is) throws IOException { InputStreamReader isr = new InputStreamReader(is); BufferedReader br = new BufferedReader(isr); StringWriter sw = new StringWriter(); char c[] = new char[1024]; while (true) { int n = br.read(c, 0, c.length); if ( n < 0 ) break; sw.write(c, 0, n); } isr.close(); return sw.toString(); } public static void main(String[] args) { File f = new File(args[0]); try { System.out.println(GeneralUtil.inputStreamToString(new FileInputStream(f))); } catch (IOException e) { e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates. } } public static void writeStringToFile(String content, String encoding, String fileName) throws IOException, UnsupportedEncodingException { File f = new File (fileName); FileOutputStream fos = new FileOutputStream(f); OutputStreamWriter osw = new OutputStreamWriter(fos, encoding); BufferedWriter bw = new BufferedWriter(osw); PrintWriter pw = new PrintWriter(bw); pw.print(content); pw.flush(); bw.flush(); fos.close(); System.out.println("Wrote file: " + f.getAbsolutePath()); } /** * Parses an integer from a string using less restrictive rules about which * characters we won't accept. This scavenges the supplied string for any * numeric character, while dropping all others. * * @param s The string to parse * @return The number represented by the passed string, or 0 if the string * is null, empty, white-space only, contains only non-numeric * characters, or simply evaluates to 0 after parsing (e.g. "0") */ public static int parseIntRelaxed(String s) { // An edge-case short circuit... if (s == null || s.length() == 0 || s.trim().length() == 0) { return 0; } StringBuffer buffer = new StringBuffer(); for (int i = 0; i < s.length(); i++) { char c = s.charAt(i); if (Character.isDigit(c)) { buffer.append(c); } else { // If we hit a non-numeric with numbers already in the // buffer, we're done. if (buffer.length() > 0) { break; } } } if (buffer.length() == 0) { return 0; } try { return Integer.parseInt(buffer.toString()); } catch (NumberFormatException exception) { // The only way we get here now is if s > Integer.MAX_VALUE return Integer.MAX_VALUE; } } } /* * $Id: GeneralUtil.java,v 1.15 2007/05/11 22:51:35 peterbrant Exp $ * * $Log: GeneralUtil.java,v $ * Revision 1.15 2007/05/11 22:51:35 peterbrant * Patch from Sean Bright * * Revision 1.14 2007/04/10 20:46:38 pdoubleya * Fix, was not checking if resource was actually available before opening it * * Revision 1.13 2006/07/26 18:17:09 pdoubleya * Added convenience method, write string to file. * * Revision 1.12 2006/07/17 22:16:31 pdoubleya * Added utility methods, InputStream to String, and simple HTML escaping. * * Revision 1.11 2005/06/26 01:02:22 tobega * Now checking for SecurityException on System.getProperty * * Revision 1.10 2005/06/13 06:50:17 tobega * Fixed a bug in table content resolution. * Various "tweaks" in other stuff. * * Revision 1.9 2005/04/03 21:51:31 joshy * fixed code that gets the XMLReader on the mac * added isMacOSX() to GeneralUtil * added app name and single menu bar to browser * * Issue number: * Obtained from: * Submitted by: * Reviewed by: * * Revision 1.8 2005/02/02 11:17:18 pdoubleya * Added trackBack() method. * * Revision 1.7 2005/01/29 20:21:08 pdoubleya * Clean/reformat code. Removed commented blocks, checked copyright. * * Revision 1.6 2005/01/24 14:33:47 pdoubleya * Added exception dump. * * Revision 1.5 2004/10/23 14:06:56 pdoubleya * Re-formatted using JavaStyle tool. * Cleaned imports to resolve wildcards except for common packages (java.io, java.util, etc). * Added CVS log comments at bottom. * * Revision 1.4 2004/10/19 15:00:53 joshy * updated the build file * removed some extraneous files * update the home page to point to the new jnlp files * updated the resource loader to use the marker class * updated the text of the about box * * Issue number: * Obtained from: * Submitted by: * Reviewed by: * * Revision 1.3 2004/10/18 23:43:02 joshy * final updates today * * Issue number: * Obtained from: * Submitted by: * Reviewed by: * * Revision 1.2 2004/10/18 17:10:13 pdoubleya * Added additional condition, and error check. * * Revision 1.1 2004/10/13 23:00:32 pdoubleya * Added to CVS. * */




© 2015 - 2024 Weber Informatics LLC | Privacy Policy