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}