/*
 * The contents of this file are subject to the terms 
 * of the Common Development and Distribution License 
 * (the License).  You may not use this file except in
 * compliance with the License.
 * 
 * You can obtain a copy of the license at 
 * https://glassfish.dev.java.net/public/CDDLv1.0.html or
 * glassfish/bootstrap/legal/CDDLv1.0.txt.
 * See the License for the specific language governing 
 * permissions and limitations under the License.
 * 
 * When distributing Covered Code, include this CDDL 
 * Header Notice in each file and include the License file 
 * at glassfish/bootstrap/legal/CDDLv1.0.txt.  
 * If applicable, add the following below the CDDL Header, 
 * with the fields enclosed by brackets [] replaced by
 * you own identifying information: 
 * "Portions Copyrighted [year] [name of copyright owner]"
 * 
 * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
 */
package com.sun.appserv.management.util.misc;

import java.util.logging.Logger;


/**
    A "future" for getting a Logger that might not be needed just now.
    Thread safe.
 */
public abstract class LoggerGetterBase
{
    private final String     mLoggerName;
    private volatile Logger  mLogger;    // must be volatile!
    
    public LoggerGetterBase( final String loggerName )
    {
        mLoggerName = loggerName;
        mLogger     = null;
    }
    
    protected abstract Logger   _getLogger( final String loggerName );
    
    /**
        @return the Logger
     */
        public final Logger
    getLogger() 
    {
        // if it's non-null, then it's safe to return it
        if ( mLogger != null )
        {
            return mLogger;
        }
        
        synchronized( this )
        {
            if ( mLogger == null )
            {
                mLogger = _getLogger( mLoggerName );
            }
        }
        return mLogger;
    }
}