1 package com.thoughtworks.xstream.alias;
2
3 import java.util.HashMap;
4 import java.util.Map;
5
6 public class DefaultClassMapper implements ClassMapper {
7
8 private Map typeToNameMap = new HashMap();
9 private Map nameToTypeMap = new HashMap();
10 private Map baseTypeToDefaultTypeMap = new HashMap();
11
12 public DefaultClassMapper() {
13 // register primitive types
14 baseTypeToDefaultTypeMap.put(boolean.class, Boolean.class);
15 baseTypeToDefaultTypeMap.put(char.class, Character.class);
16 baseTypeToDefaultTypeMap.put(int.class, Integer.class);
17 baseTypeToDefaultTypeMap.put(float.class, Float.class);
18 baseTypeToDefaultTypeMap.put(double.class, Double.class);
19 baseTypeToDefaultTypeMap.put(short.class, Short.class);
20 baseTypeToDefaultTypeMap.put(byte.class, Byte.class);
21 baseTypeToDefaultTypeMap.put(long.class, Long.class);
22 }
23
24 public void alias(String elementName, Class type, Class defaultImplementation) {
25 nameToTypeMap.put(elementName, type.getName());
26 typeToNameMap.put(type, elementName);
27 if (!type.equals(defaultImplementation)) {
28 typeToNameMap.put(defaultImplementation, elementName);
29 }
30 baseTypeToDefaultTypeMap.put(type, defaultImplementation);
31 }
32
33 public String lookupName(Class type) {
34 boolean isArray = type.isArray();
35 if (type.isArray()) {
36 type = type.getComponentType();
37 }
38 String result = (String) typeToNameMap.get(type);
39 if (result == null) {
40 // the $ used in inner class names is illegal as an xml element name
41 result = type.getName().replaceAll("//$", "-");
42 }
43 if (isArray) {
44 result += "-array";
45 }
46 return result;
47 }
48
49 public Class lookupType(String elementName) {
50 if (elementName.equals("null")) {
51 return null;
52 }
53 boolean isArray = elementName.endsWith("-array");
54 if (isArray) {
55 elementName = elementName.substring(0, elementName.length() - 6); // cut off -array
56 }
57 String mappedName = (String) nameToTypeMap.get(elementName);
58 if (mappedName != null) {
59 elementName = mappedName;
60 }
61 // the $ used in inner class names is illegal as an xml element name
62 elementName = elementName.replaceAll("//-", "//$");
63 try {
64 if (isArray) {
65 return Class.forName("[L" + elementName + ";");
66 } else {
67 return Class.forName(elementName);
68 }
69 } catch (ClassNotFoundException e) {
70 throw new CannotResolveClassException(elementName);
71 }
72 }
73
74 public Class lookupDefaultType(Class baseType) {
75 return (Class) baseTypeToDefaultTypeMap.get(baseType);
76 }
77
78 }
This page was automatically generated by Maven