001/* 002 * $RCSfile: FacilityManager.java,v $ 003 * $Revision: 1.1 $ 004 * $Date: 2005/02/11 05:02:25 $ 005 * $State: Exp $ 006 * 007 * Class: MsgLoggerManager 008 * 009 * Description: Manages common facilities across threads 010 * 011 * 012 * 013 * COPYRIGHT: 014 * 015 * This software module was originally developed by Raphaël Grosbois and 016 * Diego Santa Cruz (Swiss Federal Institute of Technology-EPFL); Joel 017 * Askelöf (Ericsson Radio Systems AB); and Bertrand Berthelot, David 018 * Bouchard, Félix Henry, Gerard Mozelle and Patrice Onno (Canon Research 019 * Centre France S.A) in the course of development of the JPEG2000 020 * standard as specified by ISO/IEC 15444 (JPEG 2000 Standard). This 021 * software module is an implementation of a part of the JPEG 2000 022 * Standard. Swiss Federal Institute of Technology-EPFL, Ericsson Radio 023 * Systems AB and Canon Research Centre France S.A (collectively JJ2000 024 * Partners) agree not to assert against ISO/IEC and users of the JPEG 025 * 2000 Standard (Users) any of their rights under the copyright, not 026 * including other intellectual property rights, for this software module 027 * with respect to the usage by ISO/IEC and Users of this software module 028 * or modifications thereof for use in hardware or software products 029 * claiming conformance to the JPEG 2000 Standard. Those intending to use 030 * this software module in hardware or software products are advised that 031 * their use may infringe existing patents. The original developers of 032 * this software module, JJ2000 Partners and ISO/IEC assume no liability 033 * for use of this software module or modifications thereof. No license 034 * or right to this software module is granted for non JPEG 2000 Standard 035 * conforming products. JJ2000 Partners have full right to use this 036 * software module for his/her own purpose, assign or donate this 037 * software module to any third party and to inhibit third parties from 038 * using this software module for non JPEG 2000 Standard conforming 039 * products. This copyright notice must be included in all copies or 040 * derivative works of this software module. 041 * 042 * Copyright (c) 1999/2000 JJ2000 Partners. 043 * 044 * 045 * 046 */ 047 048 049package jj2000.j2k.util; 050 051import java.util.*; 052import java.io.*; 053 054/** 055 * This class manages common facilities for mutithreading environments, It can 056 * register different facilities for each thread, and also a default one, so 057 * that they can be referred by static methods, while possibly having 058 * different ones for different threads. Also a default facility exists that 059 * is used for threads for which no particular facility has been registerd 060 * registered. 061 * 062 * <P>Currently the only kind of facilities managed is MsgLogger. 063 * 064 * <P>An example use of this class is if 2 instances of a decoder are running 065 * in different threads and the messages of the 2 instances should be 066 * separated. 067 * 068 * <P>The default MsgLogger is a StreamMsgLogger that uses System.out as 069 * the 'out' stream and System.err as the 'err' stream, and a line width of 070 * 78. This can be changed using the registerMsgLogger() method. 071 * 072 * @see MsgLogger 073 * 074 * @see StreamMsgLogger 075 * */ 076public class FacilityManager { 077 078 /** The loggers associated to different threads */ 079 private final static Hashtable loggerList = new Hashtable(); 080 081 /** The default logger, for threads that have none associated with them */ 082 private static MsgLogger defMsgLogger = 083 new StreamMsgLogger(System.out,System.err,78); 084 085 /** The ProgressWatch instance associated to different threads */ 086 private final static Hashtable watchProgList = new Hashtable(); 087 088 /** The default ProgressWatch for threads that have none 089 * associated with them. */ 090 private static ProgressWatch defWatchProg = null; 091 092 /** */ 093 public static void registerProgressWatch(Thread t,ProgressWatch pw) { 094 if(pw==null) { 095 throw new NullPointerException(); 096 } 097 if(t==null) { 098 defWatchProg = pw; 099 } 100 else { 101 watchProgList.put(t,pw); 102 } 103 } 104 105 /** 106 * Returns the ProgressWatch instance registered with the current 107 * thread (the thread that calls this method). If the current 108 * thread has no registered ProgressWatch, then the default one is used. 109 * */ 110 public static ProgressWatch getProgressWatch() { 111 ProgressWatch pw = (ProgressWatch) 112 watchProgList.get(Thread.currentThread()); 113 return (pw==null) ? defWatchProg : pw; 114 } 115 116 /** 117 * Registers the MsgLogger 'ml' as the logging facility of the 118 * thread 't'. If any other logging facility was registered with the 119 * thread 't' it is overriden by 'ml'. If 't' is null then 'ml' is taken 120 * as the default message logger that is used for threads that have no 121 * MsgLogger registered. 122 * 123 * @param t The thread to associate with 'ml' 124 * 125 * @param ml The MsgLogger to associate with therad ml 126 * */ 127 public static void registerMsgLogger(Thread t, MsgLogger ml) { 128 if (ml == null) { 129 throw new NullPointerException(); 130 } 131 if (t == null) { 132 defMsgLogger = ml; 133 } 134 else { 135 loggerList.put(t,ml); 136 } 137 } 138 139 /** 140 * Returns the MsgLogger registered with the current thread (the 141 * thread that calls this method). If the current thread has no registered 142 * MsgLogger then the default message logger is returned. 143 * 144 * @return The MsgLogger registerd for the current thread, or the 145 * default one if there is none registered for it. 146 * 147 * 148 * */ 149 public static MsgLogger getMsgLogger() { 150 MsgLogger ml = 151 (MsgLogger) loggerList.get(Thread.currentThread()); 152 return (ml == null) ? defMsgLogger : ml; 153 } 154 155 /** 156 * Returns the MsgLogger registered with the thread 't' (the thread 157 * that calls this method). If the thread 't' has no registered 158 * MsgLogger then the default message logger is returned. 159 * 160 * @param t The thread for which to return the MsgLogger 161 * 162 * @return The MsgLogger registerd for the current thread, or the 163 * default one if there is none registered for it. 164 * 165 * 166 * */ 167 public static MsgLogger getMsgLogger(Thread t) { 168 MsgLogger ml = 169 (MsgLogger) loggerList.get(t); 170 return (ml == null) ? defMsgLogger : ml; 171 } 172}