View Javadoc

1   package org.lcsim.lcio;
2   
3   import java.util.HashMap;
4   import java.util.LinkedHashMap;
5   import java.util.Map;
6   
7   /**
8    *
9    * @author tonyj
10   */
11  class HandlerManager
12  {
13     private Map<String,LCIOBlockHandler> handlerForType = new HashMap<String,LCIOBlockHandler>();
14     private Map<Class,LCIOBlockHandler> handlerForClass = new LinkedHashMap<Class,LCIOBlockHandler>();
15     private void register(LCIOBlockHandler handler)
16     {
17        handlerForType.put(handler.getType(),handler);
18        handlerForClass.put(handler.getClassForType(),handler);
19     }
20     private static HandlerManager theHandlerManager = new HandlerManager();
21     /** Creates a new instance of HandlerManager */
22     private HandlerManager()
23     {
24        // Note: order is important, most specific (e.g. SimCalorimeterHit) must come
25        // before less specific (e.g. CalorimeterHit).
26        register(new SIOSimCalorimeterHitBlockHandler());
27        register(new SIOSimTrackerHitBlockHandler());
28        register(new SIOMCParticleBlockHandler());
29        register(new SIOClusterBlockHandler());
30        register(new SIOTPCHitBlockHandler());
31        register(new SIOTrackerHitBlockHandler());
32        register(new SIOTrackBlockHandler());
33        register(new SIORawCalorimeterHitBlockHandler());
34        register(new SIOLCRelationBlockHandler());
35        register(new SIOReconstructedParticleBlockHandler());
36        register(new SIOCalorimeterHitBlockHandler());
37        register(new SIOGenericObjectBlockHandler());
38        register(new SIORawTrackerHitBlockHandler());
39        register(new SIOSiliconTrackerHitBlockHandler());
40        register(new SIOTrackerDataBlockHandler());
41        register(new SIOTrackerPulseBlockHandler());
42        register(new SIOVertexBlockHandler());
43        register(new SIOFloatVecBlockHandler());
44        register(new SIOIntVecBlockHandler());
45        register(new SIOStringVecBlockHandler());
46     }
47     static HandlerManager instance()
48     {
49        return theHandlerManager;
50     }
51     LCIOBlockHandler handlerForType(String type)
52     {
53        if (type.endsWith(LCIOConstants.references))
54        {
55           String subType = type.substring(0,type.length()-LCIOConstants.references.length());
56           LCIOBlockHandler subHandler = handlerForType.get(subType);
57           if (subHandler == null) return null;
58           else return new SIOReferencesBlockHandler(subType,subHandler.getClassForType());
59        }
60        else return handlerForType.get(type);
61     }
62     LCIOBlockHandler handlerForClass(Class type, int flags)
63     {
64        LCIOBlockHandler handler = handlerForClass.get(type);
65  
66        if (handler == null)
67        {
68           for (LCIOBlockHandler h : handlerForType.values())
69           {
70              if (h.getClassForType().isAssignableFrom(type))
71              {
72                 handler = h;
73                 handlerForClass.put(type,h);
74                 break; // Fixme: What if a better match
75              }
76           }
77        }
78        if (LCIOUtil.bitTest(flags,LCIOConstants.BITSubset))
79        {
80           return new SIOReferencesBlockHandler(handler.getType()+LCIOConstants.references,type);
81        }
82        else return handler;
83     }
84  }