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.reports.BaseReportFormats; 020 import net.sf.logdistiller.util.ExtensionHelper; 021 import net.sf.logdistiller.util.FormatUtil; 022 023 /** 024 * Definition of available report formats. By default, some report formats come 025 * {@link net.sf.logdistiller.reports.BaseReportFormats predefined} with <b>LogDistiller</b>, but you can add your own. 026 */ 027 public abstract class ReportFormats 028 { 029 public abstract List defineReportFormats(); 030 031 public static final List ALL; 032 033 public static final Map MAP; 034 static 035 { 036 List all = new ArrayList( new BaseReportFormats().defineReportFormats() ); 037 all.addAll( loadExtensionReportFormats() ); 038 ALL = Collections.unmodifiableList( all ); 039 040 Map map = new HashMap(); 041 Iterator iter = ALL.iterator(); 042 while ( iter.hasNext() ) 043 { 044 ReportFormat reportFormat = (ReportFormat) iter.next(); 045 map.put( reportFormat.getId(), reportFormat ); 046 } 047 MAP = Collections.unmodifiableMap( map ); 048 } 049 050 /** 051 * get all the plugins defined (predefined and custom). 052 */ 053 public static List getAllReportFormats() 054 { 055 return ALL; 056 } 057 058 public static String listAllReportFormatIds() 059 { 060 return FormatUtil.join( ", ", MAP.keySet().iterator() ); 061 } 062 063 public static ReportFormat getReportFormat( String id ) 064 { 065 ReportFormat format = (ReportFormat) MAP.get( id ); 066 if ( format == null ) 067 { 068 throw new IllegalArgumentException( "unknown report format '" + id + "', known values are: " 069 + listAllReportFormatIds() ); 070 } 071 return format; 072 } 073 074 private static List loadExtensionReportFormats() 075 { 076 Iterator iter = ExtensionHelper.findExtensions( "reportformats" ).iterator(); 077 List reportformats = new ArrayList(); 078 while ( iter.hasNext() ) 079 { 080 String reportformatsClass = (String) iter.next(); 081 if ( reportformatsClass != null ) 082 { 083 reportformats.addAll( loadReportFormats( reportformatsClass ) ); 084 } 085 } 086 return reportformats; 087 } 088 089 private static List loadReportFormats( String reportFormatsClass ) 090 { 091 try 092 { 093 ReportFormats reportFormats = (ReportFormats) Class.forName( reportFormatsClass ).newInstance(); 094 return reportFormats.defineReportFormats(); 095 } 096 catch ( ClassNotFoundException cnfe ) 097 { 098 throw new RuntimeException( "unable to load report formats class " + reportFormatsClass, cnfe ); 099 } 100 catch ( IllegalAccessException iae ) 101 { 102 throw new RuntimeException( "unable to access report formats constructor for class " + reportFormatsClass, 103 iae ); 104 } 105 catch ( InstantiationException ie ) 106 { 107 throw new RuntimeException( "unable to instanciate report formats class " + reportFormatsClass, ie ); 108 } 109 } 110 }