001    /* 
002     * Copyright 2005 Stephen McConnell.
003     *
004     * Licensed  under the  Apache License,  Version 2.0  (the "License");
005     * you may not use  this file  except in  compliance with the License.
006     * You may obtain a copy of the License at 
007     * 
008     *   http://www.apache.org/licenses/LICENSE-2.0
009     * 
010     * Unless required by applicable law or agreed to in writing, software
011     * distributed  under the  License is distributed on an "AS IS" BASIS,
012     * WITHOUT  WARRANTIES OR CONDITIONS  OF ANY KIND, either  express  or
013     * implied.
014     * 
015     * See the License for the specific language governing permissions and
016     * limitations under the License.
017     */
018    
019    package net.dpml.util;
020    
021    import java.net.URL;
022    import java.io.InputStream;
023    import java.io.ByteArrayInputStream;
024    import java.io.ByteArrayOutputStream;
025    import java.io.FileNotFoundException;
026    import java.util.Properties;
027    import java.util.logging.LogManager;
028    
029    import net.dpml.transit.Transit;
030    
031    /**
032     * Utility class used to establish the logging configuration.
033     * @author <a href="http://www.dpml.net">Digital Product Meta Library</a>
034     * @version 1.1.0
035     */
036    public class ConfigurationHandler
037    {
038        static
039        {
040            Object prefs = Transit.DPML_PREFS;
041        }
042        
043       /**
044        * Creation of the logging controller.
045        */
046        public ConfigurationHandler()
047        {
048            
049            //
050            // customize the configuration based on a properties file declared under 
051            // the 'dpml.logging.config' property
052            //
053            
054            Properties properties = new Properties();
055            String config = System.getProperty( "dpml.logging.config" );
056            if( null != config )
057            {
058                String spec = PropertyResolver.resolve( config );
059                try
060                {
061                    URL url = new URL( spec );
062                    InputStream stream = url.openStream();
063                    properties.load( stream );
064                    PropertyResolver.resolve( properties );
065                }
066                catch( FileNotFoundException e )
067                {
068                    final String error = 
069                      "Logging configuration does not exist."
070                      + "\nURI: " + spec;
071                    System.err.println( error );
072                }
073                catch( Exception e )
074                {
075                    System.out.println( "Error loading user properties: " + config );
076                    e.printStackTrace();
077                }
078            }
079            
080            //
081            // ensure that sensible defaults exist
082            //
083            
084            if( null == properties.getProperty( ".level" ) )
085            {
086                String level = getDefaultLevel();
087                properties.setProperty( ".level", level );
088            }
089            
090            if( null == properties.getProperty( "handlers" ) )
091            {
092                setProperty( properties, 
093                  "handlers", 
094                  "java.util.logging.ConsoleHandler" );
095                setProperty( properties, 
096                  "java.util.logging.ConsoleHandler.formatter", 
097                  "net.dpml.util.StandardFormatter" );
098                setProperty( properties, "java.util.logging.ConsoleHandler.level", "ALL" );
099            }
100            
101            //
102            // convert the resolved properties instance to an input stream
103            // and supply this to the log manager
104            //
105            
106            try
107            {
108                ByteArrayOutputStream out = new ByteArrayOutputStream();
109                properties.store( out, "DPML Logging Properties" );
110                byte[] bytes = out.toByteArray();
111                ByteArrayInputStream input = new ByteArrayInputStream( bytes );
112                LogManager manager = LogManager.getLogManager();
113                manager.readConfiguration( input );
114            }
115            catch( Throwable e )
116            {
117                e.printStackTrace();
118            }
119        }
120    
121        private void setProperty( Properties properties, String key, String value )
122        {
123            properties.setProperty( key, System.getProperty( key, value ) );
124        }
125        
126        private String getDefaultLevel()
127        {
128            //if( "true".equals( System.getProperty( "dpml.debug" ) ) )
129            //{
130            //    return "FINE";
131            //}
132            //else
133            //{
134                return System.getProperty( "dpml.logging.level", "INFO" ).toUpperCase();
135            //}
136        }    
137    }