0
        } 
    } 
 
    public void throwing(String sourceClass, String sourceMethod, Throwable thrown) {
        if (isLoggable(Level.FINER)) {
            LogRecord lr = new LogRecord(Level.FINER, "THROW");
            lr.setSourceClassName(sourceClass);
            lr.setSourceMethodName(sourceMethod);
            lr.setThrown(thrown);
            doLog(lr);
        } 
    } 
 
    public void severe(String msg) {
        if (isLoggable(Level.SEVERE)) {
            LogRecord lr = new LogRecord(Level.SEVERE, msg);
            doLog(lr);
        } 
    } 
 
    public void warning(String msg) {
        if (isLoggable(Level.WARNING)) {
            LogRecord lr = new LogRecord(Level.WARNING, msg);
            doLog(lr);
        } 
    } 
 
    public void info(String msg) {
        if (isLoggable(Level.INFO)) {
            LogRecord lr = new LogRecord(Level.INFO, msg);
            doLog(lr);
        } 
    } 
 
    public void config(String msg) {
        if (isLoggable(Level.CONFIG)) {
            LogRecord lr = new LogRecord(Level.CONFIG, msg);
            doLog(lr);
        } 
    } 
 
    public void fine(String msg) {
        if (isLoggable(Level.FINE)) {
            LogRecord lr = new LogRecord(Level.FINE, msg);
            doLog(lr);
        } 
    } 
 
    public void finer(String msg) {
        if (isLoggable(Level.FINER)) {
            LogRecord lr = new LogRecord(Level.FINER, msg);
            doLog(lr);
        } 
    } 
 
    public void finest(String msg) {
        if (isLoggable(Level.FINEST)) {
            LogRecord lr = new LogRecord(Level.FINEST, msg);
            doLog(lr);
        } 
    } 
 
    public void setLevel(Level newLevel) throws SecurityException {
        throw new UnsupportedOperationException();
    } 
 
    public abstract Level getLevel();
 
    public boolean isLoggable(Level level) {
        Level l = getLevel();
        return level.intValue() >= l.intValue() && l != Level.OFF;
    } 
 
    protected boolean supportsHandlers() { 
        return false; 
    } 
     
    public synchronized void addHandler(Handler handler) throws SecurityException {
        if (supportsHandlers()) { 
            super.addHandler(handler);
            return; 
        } 
        throw new UnsupportedOperationException();
    } 
 
    public synchronized void removeHandler(Handler handler) throws SecurityException {
        if (supportsHandlers()) { 
            super.removeHandler(handler);
            return; 
        } 
        throw new UnsupportedOperationException();
    } 
 
    public synchronized Handler[] getHandlers() {
        if (supportsHandlers()) { 
            return super.getHandlers(); 
        } 
        throw new UnsupportedOperationException();
    } 
 
    public synchronized void setUseParentHandlers(boolean useParentHandlers) {
        if (supportsHandlers()) { 
            super.setUseParentHandlers(useParentHandlers);
            return; 
        } 
        throw new UnsupportedOperationException();
    } 
 
    public synchronized boolean getUseParentHandlers() { 
        if (supportsHandlers()) { 
            return super.getUseParentHandlers(); 
        } 
        throw new UnsupportedOperationException();
    } 
 
    public Logger getParent() {
        return null; 
    } 
 
    public void setParent(Logger parent) {
        throw new UnsupportedOperationException();
    } 
 
    protected void doLog(LogRecord lr) {
        lr.setLoggerName(getName());
        String rbname = getResourceBundleName();
        if (rbname != null) {
            lr.setResourceBundleName(rbname);
            lr.setResourceBundle(getResourceBundle());
        } 
        internalLog(lr);
    } 
 
    protected void doLog(LogRecord lr, String rbname) {
        lr.setLoggerName(getName());
        if (rbname != null) {
            lr.setResourceBundleName(rbname);
            lr.setResourceBundle(loadResourceBundle(rbname));
        } 
        internalLog(lr);
    } 
 
    protected void internalLog(LogRecord record) {
        Filter filter = getFilter();
        if (filter != null && !filter.isLoggable(record)) {
            return; 
        } 
        String msg = formatMessage(record);
        internalLogFormatted(msg, record);
    } 
 
    protected abstract void internalLogFormatted(String msg, LogRecord record);
 
    protected String formatMessage(LogRecord record) {