View Javadoc

1   package org.lcsim.material;
2   
3   import java.io.PrintStream;
4   import java.util.ArrayList;
5   import java.util.HashMap;
6   import java.util.List;
7   import java.util.Map;
8   
9   /**
10   * This class is the repository for Material and MaterialElement objects loaded into LCSim. 
11   * It is a singleton with only one existing per process.
12   * @author jeremym
13   * @version $Id: MaterialManager.java,v 1.14 2011/03/11 19:22:20 jeremy Exp $
14   */
15  // TODO Figure out best place to reset when new Detector is defined (geometry.Detector?  conditions?  event?)
16  public class MaterialManager
17  {
18      // The global manager instanec.
19      private static MaterialManager _instance = null;
20  
21      // FIXME These should not be static. Use mgr.instance() instead.
22      private static Map<String, Material> _materials = new HashMap<String, Material>();
23      private static Map<String, MaterialElement> _elements = new HashMap<String, MaterialElement>();
24  
25      /** 
26       * Direct instantiation is not allowed.  Use the {@link instance()} method. 
27       **/
28      private MaterialManager()
29      {}
30  
31      /**
32       * Get manager and create if necessary.
33       * @return The global MaterialManager.
34       */
35      public static MaterialManager instance()
36      {
37          if (_instance == null)
38          {
39              _instance = new MaterialManager();
40          }
41  
42          return _instance;
43      }
44      
45      public List<String> getMaterialNames()
46      {
47          // TODO Make list immutable.
48          return new ArrayList<String>(_materials.keySet());
49      }
50      
51      public List<String> getElementNames()
52      {
53          // TODO Make list immutable.
54          return new ArrayList<String>(_elements.keySet());
55      }
56  
57      // FIXME Remove this method.  Use getMaterialNames() with getMaterial() instead.
58      public Map<String, Material> materials()
59      {
60          return _materials;
61      }
62    
63      // FIXME Remove this method.  Use getElementNames() with getElement() instead.
64      public static Map<String, MaterialElement> elements()
65      {
66          return _elements;
67      }
68    
69      protected void addMaterial(Material material)
70      {
71          if (material == null)
72          {
73              throw new IllegalArgumentException("Argument points to null.");
74          }
75  
76          if (getMaterial(material.getName()) != null)
77          {
78              throw new RuntimeException("Material with name " + material.getName() + " already exists.");
79          }
80  
81          _materials.put(material.getName(), material);
82      }
83  
84      /**
85       * Get a material from the manager.
86       * @param materialName
87       * @return The material with name materialName. 
88       */
89      public Material getMaterial(String materialName)
90      {
91          return _materials.get(materialName);
92      }
93  
94      public MaterialElement getElement(String elementName)
95      {
96          return _elements.get(elementName);
97      }
98  
99      protected void addElement(MaterialElement me)
100     {
101         if (MaterialManager.instance().getElement(me.getName()) == null)        
102         {
103             _elements.put(me.getName(), me);
104         }
105         else
106         {
107             throw new RuntimeException("MaterialElement already exists: " + me.getName());
108         }
109     }
110     
111     public String toString()
112     {
113         StringBuffer buff = new StringBuffer();
114         for (MaterialElement me : _elements.values())
115         {
116             buff.append(me.toString());
117         }
118         for (Material m : _materials.values())
119         {
120             buff.append(m.toString());
121         }
122         return buff.toString();
123     }
124 
125     public void printMaterials(PrintStream ps)
126     {
127         for (Material m : materials().values())
128         {
129             ps.println(m.toString());
130         }
131     }
132 
133     public void printElements(PrintStream ps)
134     {
135         for (MaterialElement me : elements().values())
136         {
137             ps.println(me.toString());
138         }
139     }
140     
141     /**
142      * Reset the MaterialManager instance between runs.  This is currently
143      * called from XMLMaterialManager only.
144      */
145     void clear()
146     {
147         // Reset maps.
148         _materials = new HashMap<String, Material>();
149         _elements = new HashMap<String, MaterialElement>();
150         
151         // Set instance to null;
152         _instance = null;
153     }
154 }