View Javadoc

1   package org.lcsim.geometry.compact;
2   
3   import java.util.Map;
4   import java.util.HashMap;
5   import java.util.Set;
6   import org.jdom.Element;
7   
8   /**
9    * 
10   * ParameterSet is used to store generic subdetector parameters within the
11   * compact Subdetector object. Values are converted from <parameter> elements
12   * within the <detector> element. The parameters can be of type Double, Integer,
13   * or String.
14   * 
15   * @author jeremym
16   * @version $Id: ParameterSet.java,v 1.5 2006/02/01 23:40:43 jeremy Exp $
17   */
18  public class ParameterSet
19  {
20  	/* Map for storing and looking up parameters by name. */
21  	Map<String, Object> _parameters = new HashMap<String, Object>();
22  
23  	/** Constructor taking the <detector> node for a subdetector. */
24  	protected ParameterSet(Element node)
25  	{
26  		convertFromXML(node);
27  	}
28  
29  	/** Constructor without Element argument. */
30  	protected ParameterSet()
31  	{}
32  	
33  	/** Convert <parameter> elements within <detector>. */
34  	private void convertFromXML(Element node)
35  	{
36  		assert (node != null);
37  		assert (node.getName().compareTo("detector") == 0);
38  
39  		// Iterate over <parameter> elements
40  		for (Object object : node.getChildren("parameter"))
41  		{
42  			Element element = (Element) object;
43  
44  			// Get name
45  			String name = element.getAttributeValue("name");
46  			assert (name != null);
47  
48  			// Get parameter type
49  			String type = element.getAttributeValue("type");
50  
51  			// Get parameter value (can be null)
52  			String value = element.getAttributeValue("value");
53  
54  			// Get value from text data within the tag if no value attribute
55  			// exists
56  			if ( value == null )
57  			{
58  				value = element.getTextNormalize();
59  			}
60  
61  			Object convert = null;
62  
63  			// Explicit type conversion
64  			if ( type != null )
65  			{
66  				// Convert to Double
67  				if ( type.compareToIgnoreCase("double") == 0 ||
68  						type.compareToIgnoreCase("dbl") == 0 )
69  				{
70  					convert = Double.parseDouble(value);
71  				}
72  				// Convert to Integer
73  				else if ( type.compareToIgnoreCase("integer") == 0
74  						|| type.compareToIgnoreCase("int") == 0 )
75  				{
76  					convert = Integer.parseInt(value);
77  				}
78  				// Convert to String
79  				else if ( type.compareToIgnoreCase("string") == 0 || 
80  						type.compareToIgnoreCase("str") == 0)
81  				{
82  					convert = value;
83  				}
84  				// Type is invalid
85  				else
86  				{
87  					throw new RuntimeException("Unknown type " + type + " for parameter " + name);
88  				}
89  			} 
90  			// Implicit type conversion
91  			else
92  			{
93  				try
94  				{
95  					// First try parsing as Double
96  					convert = Double.parseDouble(value);
97  				} 
98  				catch (Exception e)
99  				{
100 
101 					try
102 					{
103 						// Next try Int
104 						convert = Integer.parseInt(value);
105 					} 
106 					catch (Exception ee)
107 					{
108 						// Lastly, default to String
109 						convert = value;
110 					}
111 				}
112 			}
113 
114 			// add the parameter
115 			//System.out.println("adding parameter " + name + "=" + value + " of type " + type);
116 			addParameter(name, convert);
117 		}
118 	}
119 
120 	/** Add a parameter to the ParameterSet, checking that the type is valid. */
121 	public void addParameter(String name, Object object)
122 	{
123 		if ( object instanceof Double || object instanceof Integer
124 				|| object instanceof String )
125 		{
126 			if ( _parameters.get(name) == null )
127 			{
128 				_parameters.put(name, object);
129 			} else
130 			{
131 				throw new RuntimeException("Parameter " + name
132 						+ " already exists in this ParameterSet.");
133 			}
134 		} else
135 		{
136 			throw new RuntimeException("Parameter " + name
137 					+ " is not of type Double, Integer or String.");
138 		}
139 	}
140 
141 	/** Return a named parameter as a generic java Object. */
142 	public Object getParameter(String name, Class klass)
143 	{
144 		Object object = _parameters.get(name);
145 		if ( object.getClass() == klass )
146 		{
147 			return object;
148 		} else
149 		{
150 			System.err.println("Found object but type does not match.");
151 			return null;
152 		}
153 	}
154 
155 	/** Checks if the parameter exists. */
156 	public boolean exists(String name)
157 	{
158 		return _parameters.containsKey(name);
159 	}
160 
161 	/** Return the list of parameter names. */
162 	public Set<String> getParameterNames()
163 	{
164 		return _parameters.keySet();
165 	}
166 
167 	/** Return a named parameter of type Double. */
168 	public Double getDouble(String name)
169 	{
170 		return (Double) getParameter(name, Double.class);
171 	}
172 
173 	/** Return a named parameter of type Integer. */
174 	public Integer getInteger(String name)
175 	{
176 		return (Integer) getParameter(name, Integer.class);
177 	}
178 
179 	/** Return a named parameter of type String. */
180 	public String getString(String name)
181 	{
182 		return (String) getParameter(name, String.class);
183 	}
184 }