fiore@0: /* fiore@0: CCmI Editor - A Collaborative Cross-Modal Diagram Editing Tool fiore@0: fiore@0: Copyright (C) 2011 Queen Mary University of London (http://ccmi.eecs.qmul.ac.uk/) fiore@0: fiore@0: This program is free software: you can redistribute it and/or modify fiore@0: it under the terms of the GNU General Public License as published by fiore@0: the Free Software Foundation, either version 3 of the License, or fiore@0: (at your option) any later version. fiore@0: fiore@0: This program is distributed in the hope that it will be useful, fiore@0: but WITHOUT ANY WARRANTY; without even the implied warranty of fiore@0: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the fiore@0: GNU General Public License for more details. fiore@0: fiore@0: You should have received a copy of the GNU General Public License fiore@0: along with this program. If not, see . fiore@0: */ fiore@0: fiore@0: package uk.ac.qmul.eecs.ccmi.utils; fiore@0: fiore@0: import java.io.IOException; fiore@0: import java.io.PrintWriter; fiore@0: import java.io.StringWriter; fiore@0: import java.io.Writer; fiore@0: import java.lang.Thread.UncaughtExceptionHandler; fiore@0: import java.util.logging.FileHandler; fiore@0: import java.util.logging.Level; fiore@0: import java.util.logging.Logger; fiore@0: fiore@0: /** fiore@0: * The UncaughtExceptionHandler for the CCmI Editor. It logs the occurred exception stack trace fiore@0: * on a file (errorN.log, where N is an integer number automatically assigned to avoid fiore@0: * collision with other files of the same type) which is created in the same directory where fiore@0: * the program is run. The exception stack trace will be in the format defined by the {@code XMLFormatter} class fiore@0: * of the java.utli.logging package. fiore@0: * fiore@0: * @see java.util.logging.XMLFormatter fiore@0: */ fiore@0: public class CCmIUncaughtExceptionHandler implements UncaughtExceptionHandler { fiore@0: fiore@0: @Override fiore@0: public void uncaughtException(Thread thread, Throwable throwable) { fiore@0: try{ fiore@0: Logger logger = Logger.getLogger("uncaught_exception"); fiore@0: logger.setLevel(Level.SEVERE); fiore@0: FileHandler fileHandler = null; fiore@0: try { fiore@0: fileHandler = new FileHandler("error%u.log",true); fiore@0: } catch (IOException e) { fiore@0: System.err.println(throwable.toString()); fiore@0: System.err.println(); fiore@0: System.err.println("Could not use error log file"); fiore@0: e.printStackTrace(); fiore@0: return; fiore@0: } fiore@0: fileHandler.setLevel(Level.SEVERE); fiore@0: logger.addHandler(fileHandler); fiore@0: StringBuilder builder = new StringBuilder(throwable.toString()); fiore@0: builder.append('\n'); fiore@0: final Writer result = new StringWriter(); fiore@0: final PrintWriter printWriter = new PrintWriter(result); fiore@0: throwable.printStackTrace(printWriter); fiore@0: builder.append(result.toString()); fiore@0: logger.severe(builder.toString()); fiore@0: fileHandler.close(); fiore@0: throwable.printStackTrace(); fiore@0: }catch(Exception exception){ fiore@0: exception.printStackTrace(); fiore@0: System.exit(-1); fiore@0: } fiore@0: } fiore@0: }