View Javadoc

1   package net.sourceforge.jparam.parser;
2   
3   import java.lang.reflect.Constructor;
4   import java.util.HashMap;
5   import java.util.Iterator;
6   import java.util.List;
7   import java.util.Map;
8   
9   import net.sourceforge.jparam.JParamException;
10  import net.sourceforge.jparam.conversion.ConverterRegistry;
11  import net.sourceforge.jparam.conversion.weights.ScalarConversionWeight;
12  
13  /***
14   * A description of class MapLeaf
15   */
16  public class MapLeaf implements TreeNode {
17  	private List items;
18  
19  	/***
20  	 * Create a new MapLeaf object, with the given MapItems as items
21  	 */
22  	public MapLeaf(List items) {
23  		this.items = items;
24  	}
25  
26  	public Object getConstructedValue(Class expectedType)
27  			throws JParamException {
28  		Map map;
29  		
30  		if (Map.class.isAssignableFrom(expectedType)){
31  		    try{
32  		        Constructor emptyConstructor = expectedType.getConstructor(new Class[]{});
33  		        map = (Map)emptyConstructor.newInstance(new Object[]{});
34  		    } catch (Exception e){
35  		        throw new JParamException("Expected type is a map subclass with no empty constructor, cannot create a map of this type: " + expectedType.getName());
36  		    }
37  		} else {
38  		    map = new HashMap();
39  		}
40  		
41  		Iterator itr = items.iterator();
42  
43  		while (itr.hasNext()) {
44  			MapItem item = (MapItem) itr.next();
45  
46  			Object key = item.getKey().getConstructedValue(Object.class);
47  			Object value = item.getValue().getConstructedValue(Object.class);
48  			map.put(key, value);
49  		}
50  		return map;
51  	}
52  
53  	public String toString() {
54  		StringBuffer res = new StringBuffer("MapLeaf, items={");
55  		boolean isFirst = true;
56  
57  		Iterator itr = items.iterator();
58  		while (itr.hasNext()) {
59  			if (isFirst) {
60  				isFirst = false;
61  			} else {
62  				res.append(" ,");
63  			}
64  			res.append(itr.next().toString());
65  		}
66  		res.append('}');
67  		return res.toString();
68  	}
69  
70  	public ScalarConversionWeight getConversionWeight(Class expectedClass) {
71  		return ConverterRegistry.getInstance().getConversionWeight(
72  				HashMap.class, expectedClass);
73  	}
74  }