001 package net.sf.logdistiller;
002
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 implied.
013 * See the License for the specific language governing permissions and
014 * limitations under the License.
015 */
016
017 import java.util.*;
018
019 import net.sf.logdistiller.logtypes.BaseLogTypes;
020 import net.sf.logdistiller.util.ExtensionHelper;
021 import net.sf.logdistiller.util.FormatUtil;
022
023 /**
024 * Definition of available log types. By default, some log types come {@link net.sf.logdistiller.logtypes.BaseLogTypes
025 * predefined} with <b>LogDistiller</b>. You can add custom log types:
026 * <ul>
027 * <li>1. create a new <code>LogEvent</code> class, with corresponding <code>LogEvent.Factory</code> and
028 * <code>LogType</code></li>
029 * <li>2. create a new <code>LogTypes</code> class defining previous <code>LogType</code> with a default constructor</li>
030 * <li>3. create a <code>logdistiller.properties</code> resource file which <code>logtypes</code> property is the full
031 * <code>LogTypes</code> class name</li>
032 * </ul>
033 *
034 * @see LogType
035 */
036 public abstract class LogTypes
037 {
038 /**
039 * get the <code>LogType</code> instances defined by this extension.
040 *
041 * @return the list of logtypes
042 * @see LogType
043 */
044 public abstract List defineLogTypes();
045
046 public static final List ALL;
047
048 public static final Map MAP;
049 static
050 {
051 List all = new ArrayList( new BaseLogTypes().defineLogTypes() );
052 all.addAll( loadExtensionLogTypes() );
053 ALL = Collections.unmodifiableList( all );
054
055 Map map = new HashMap();
056 Iterator iter = ALL.iterator();
057 while ( iter.hasNext() )
058 {
059 LogType type = (LogType) iter.next();
060 map.put( type.getId(), type );
061 }
062 MAP = Collections.unmodifiableMap( map );
063 }
064
065 /**
066 * get all the log types defined (predefined and custom).
067 */
068 public static List getAllLogTypes()
069 {
070 return ALL;
071 }
072
073 public static String listAllLogTypeIds()
074 {
075 return FormatUtil.join( ", ", MAP.keySet().iterator() );
076 }
077
078 public static LogType getLogType( String id )
079 {
080 return (LogType) MAP.get( id );
081 }
082
083 /**
084 * Loads logtypes defined by extension mechanism: if defined, <code>logtypes</code> property in
085 * <code>logdistiller.properties</code> is the full class name of a concrete implementation of <code>LogTypes</code>
086 * class.
087 *
088 * @return List the list of every <code>LogType</code> defined by loaded <code>LogTypes</code>
089 */
090 private static List loadExtensionLogTypes()
091 {
092 Iterator iter = ExtensionHelper.findExtensions( "logtypes" ).iterator();
093 List logtypes = new ArrayList();
094 while ( iter.hasNext() )
095 {
096 String logtypesClass = (String) iter.next();
097 if ( logtypesClass != null )
098 {
099 logtypes.addAll( loadLogTypes( logtypesClass ) );
100 }
101 }
102 return logtypes;
103 }
104
105 private static List loadLogTypes( String logtypesClass )
106 {
107 try
108 {
109 LogTypes logtypes = (LogTypes) Class.forName( logtypesClass ).newInstance();
110 return logtypes.defineLogTypes();
111 }
112 catch ( ClassNotFoundException cnfe )
113 {
114 throw new RuntimeException( "unable to load LogTypes subclass " + logtypesClass, cnfe );
115 }
116 catch ( IllegalAccessException iae )
117 {
118 throw new RuntimeException( "unable to access LogTypes subclass constructor for " + logtypesClass, iae );
119 }
120 catch ( InstantiationException ie )
121 {
122 throw new RuntimeException( "unable to instanciate LogTypes subclass " + logtypesClass, ie );
123 }
124 }
125 }