001: /* DevUtils
002: *
003: * Created on Oct 29, 2003
004: *
005: * Copyright (C) 2003 Internet Archive.
006: *
007: * This file is part of the Heritrix web crawler (crawler.archive.org).
008: *
009: * Heritrix is free software; you can redistribute it and/or modify
010: * it under the terms of the GNU Lesser Public License as published by
011: * the Free Software Foundation; either version 2.1 of the License, or
012: * any later version.
013: *
014: * Heritrix is distributed in the hope that it will be useful,
015: * but WITHOUT ANY WARRANTY; without even the implied warranty of
016: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
017: * GNU Lesser Public License for more details.
018: *
019: * You should have received a copy of the GNU Lesser Public License
020: * along with Heritrix; if not, write to the Free Software
021: * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
022: */
023: package org.archive.util;
024:
025: import java.io.BufferedReader;
026: import java.io.IOException;
027: import java.io.InputStreamReader;
028: import java.io.PrintWriter;
029: import java.io.StringWriter;
030: import java.util.logging.Logger;
031:
032: /**
033: * Write a message and stack trace to the 'org.archive.util.DevUtils' logger.
034: *
035: * @author gojomo
036: * @version $Revision: 4644 $ $Date: 2006-09-20 22:40:21 +0000 (Wed, 20 Sep 2006) $
037: */
038: public class DevUtils {
039: public static Logger logger = Logger.getLogger(DevUtils.class
040: .getName());
041:
042: /**
043: * Log a warning message to the logger 'org.archive.util.DevUtils' made of
044: * the passed 'note' and a stack trace based off passed exception.
045: *
046: * @param ex Exception we print a stacktrace on.
047: * @param note Message to print ahead of the stacktrace.
048: */
049: public static void warnHandle(Throwable ex, String note) {
050: logger.warning(TextUtils.exceptionToString(note, ex));
051: }
052:
053: /**
054: * @return Extra information gotten from current Thread. May not
055: * always be available in which case we return empty string.
056: */
057: public static String extraInfo() {
058: StringWriter sw = new StringWriter();
059: PrintWriter pw = new PrintWriter(sw);
060: final Thread current = Thread.currentThread();
061: if (current instanceof Reporter) {
062: Reporter tt = (Reporter) current;
063: try {
064: tt.reportTo(pw);
065: } catch (IOException e) {
066: // Not really possible w/ a StringWriter
067: e.printStackTrace();
068: }
069: }
070: if (current instanceof ProgressStatisticsReporter) {
071: ProgressStatisticsReporter tt = (ProgressStatisticsReporter) current;
072: try {
073: tt.progressStatisticsLegend(pw);
074: tt.progressStatisticsLine(pw);
075: } catch (IOException e) {
076: // Not really possible w/ a StringWriter
077: e.printStackTrace();
078: }
079: }
080: pw.flush();
081: return sw.toString();
082: }
083:
084: /**
085: * Nothing to see here, move along.
086: * @deprecated This method was never used.
087: */
088: @Deprecated
089: public static void betterPrintStack(RuntimeException re) {
090: re.printStackTrace(System.err);
091: }
092:
093: /**
094: * Send this JVM process a SIGQUIT; giving a thread dump and possibly
095: * a heap histogram (if using -XX:+PrintClassHistogram).
096: *
097: * Used to automatically dump info, for example when a serious error
098: * is encountered. Would use 'jmap'/'jstack', but have seen JVM
099: * lockups -- perhaps due to lost thread wake signals -- when using
100: * those against Sun 1.5.0+03 64bit JVM.
101: */
102: public static void sigquitSelf() {
103: try {
104: Process p = Runtime.getRuntime().exec(
105: new String[] { "perl", "-e",
106: "print getppid(). \"\n\";" });
107: BufferedReader br = new BufferedReader(
108: new InputStreamReader(p.getInputStream()));
109: String ppid = br.readLine();
110: Runtime.getRuntime().exec(
111: new String[] { "sh", "-c", "kill -3 " + ppid })
112: .waitFor();
113: } catch (IOException e) {
114: // TODO Auto-generated catch block
115: e.printStackTrace();
116: } catch (InterruptedException e) {
117: // TODO Auto-generated catch block
118: e.printStackTrace();
119: }
120: }
121: }
|