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.publishers.BasePublishers;
020 import net.sf.logdistiller.util.ExtensionHelper;
021 import net.sf.logdistiller.util.FormatUtil;
022
023 /**
024 * Definition of available report publishers.
025 */
026 public abstract class Publishers
027 {
028 /**
029 * get the <code>Publishers</code> instances defined by this extension.
030 *
031 * @return the list of publishers
032 * @see LogType
033 */
034 public abstract List definePublishers();
035
036 public static final List ALL;
037
038 public static final Map MAP;
039 static
040 {
041 List all = new ArrayList( new BasePublishers().definePublishers() );
042 all.addAll( loadExtensionPublishers() );
043 ALL = Collections.unmodifiableList( all );
044
045 Map map = new HashMap();
046 Iterator iter = ALL.iterator();
047 while ( iter.hasNext() )
048 {
049 Publisher type = (Publisher) iter.next();
050 map.put( type.getId(), type );
051 }
052 MAP = Collections.unmodifiableMap( map );
053 }
054
055 /**
056 * get all the report publishers defined (predefined and custom).
057 */
058 public static List getAllPublishers()
059 {
060 return ALL;
061 }
062
063 public static String listAllPublishersIds()
064 {
065 return FormatUtil.join( ", ", MAP.keySet().iterator() );
066 }
067
068 public static Publisher getPublisher( String id )
069 {
070 return (Publisher) MAP.get( id );
071 }
072
073 /**
074 * Loads report publishers defined by extension mechanism: if defined, <code>publishers</code> property in
075 * <code>logdistiller.properties</code> is the full class name of a concrete implementation of
076 * <code>Publishers</code> class.
077 *
078 * @return List the list of every <code>Publisher</code> defined by loaded <code>Publishers</code>
079 */
080 private static List loadExtensionPublishers()
081 {
082 Iterator iter = ExtensionHelper.findExtensions( "publishers" ).iterator();
083 List publishers = new ArrayList();
084 while ( iter.hasNext() )
085 {
086 String publishersClass = (String) iter.next();
087 if ( publishersClass != null )
088 {
089 publishers.addAll( loadPublishers( publishersClass ) );
090 }
091 }
092 return publishers;
093 }
094
095 private static List loadPublishers( String publishersClass )
096 {
097 try
098 {
099 Publishers publishers = (Publishers) Class.forName( publishersClass ).newInstance();
100 return publishers.definePublishers();
101 }
102 catch ( ClassNotFoundException cnfe )
103 {
104 throw new RuntimeException( "unable to load plugins class " + publishersClass, cnfe );
105 }
106 catch ( IllegalAccessException iae )
107 {
108 throw new RuntimeException( "unable to access plugins constructor for class " + publishersClass, iae );
109 }
110 catch ( InstantiationException ie )
111 {
112 throw new RuntimeException( "unable to instanciate plugins class " + publishersClass, ie );
113 }
114 }
115 }