001 002package gudusoft.gsqlparser.pp.mediator; 003 004import gudusoft.gsqlparser.pp.logger.PPLogger; 005import gudusoft.gsqlparser.pp.mediator.type.AbstractMediator; 006 007import java.util.ArrayList; 008import java.util.List; 009import java.util.Map; 010import java.util.concurrent.ConcurrentHashMap; 011 012public class MediatorFactory 013{ 014 015 /** 016 * the processor container 017 */ 018 private volatile static Map<String, AbstractMediator> mediator = new ConcurrentHashMap<String, AbstractMediator>( ); 019 020 private static Object object = new Object( ); 021 022 public static <E extends AbstractMediator> E getMediator( Class<E> clazz, 023 String sessionId ) 024 { 025 String id = sessionId + clazz.getName( ); 026 if ( !mediator.containsKey( id ) ) 027 { 028 synchronized ( MediatorFactory.class ) 029 { 030 if ( !mediator.containsKey( id ) ) 031 { 032 E processor = newInstance( clazz ); 033 mediator.put( id, processor ); 034 } 035 } 036 } 037 038 return (E) mediator.get( id ); 039 } 040 041 /** 042 * create a new mediator instance 043 * 044 * @param type 045 * the processor type 046 * @return insteance 047 */ 048 public static <E extends AbstractMediator> E newInstance( Class<E> type ) 049 { 050 try 051 { 052 return (E) type.newInstance( ); 053 } 054 catch ( InstantiationException e ) 055 { 056 PPLogger.error( e ); 057 return null; 058 } 059 catch ( IllegalAccessException e ) 060 { 061 PPLogger.error( e ); 062 return null; 063 } 064 } 065 066 public static void clear( String sessionId ) 067 { 068 synchronized ( object ) 069 { 070 List<String> removedKeys = new ArrayList<String>( ); 071 for ( String key : mediator.keySet( ) ) 072 { 073 if ( key.startsWith( sessionId ) ) 074 { 075 removedKeys.add( key ); 076 } 077 } 078 for ( String key : removedKeys ) 079 { 080 mediator.remove( key ); 081 } 082 } 083 } 084}