xuxiuxi
2017-07-22 4bee2fa9f76f7e200bf1bf01c24b709d16a58488
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
/*
 * Copyright (C) 2003, 2004, 2005, 2006 Joe Walnes.
 * Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 XStream Committers.
 * All rights reserved.
 *
 * The software in this package is published under the terms of the BSD
 * style license a copy of which has been included with this distribution in
 * the LICENSE.txt file.
 * 
 * Created on 26. September 2003 by Joe Walnes
 */
package com.awsle.aibatis.xml.engine.alias;
 
import java.util.HashMap;
import java.util.Map;
 
public class DefaultClassMapper implements ClassMapper {
 
    private Map typeToNameMap = new HashMap();
    private Map nameToTypeMap = new HashMap();
    private Map baseTypeToDefaultTypeMap = new HashMap();
 
    public DefaultClassMapper() {
        // register primitive types
        baseTypeToDefaultTypeMap.put(boolean.class, Boolean.class);
        baseTypeToDefaultTypeMap.put(char.class, Character.class);
        baseTypeToDefaultTypeMap.put(int.class, Integer.class);
        baseTypeToDefaultTypeMap.put(float.class, Float.class);
        baseTypeToDefaultTypeMap.put(double.class, Double.class);
        baseTypeToDefaultTypeMap.put(short.class, Short.class);
        baseTypeToDefaultTypeMap.put(byte.class, Byte.class);
        baseTypeToDefaultTypeMap.put(long.class, Long.class);
    }
 
    public void alias(String elementName, Class type, Class defaultImplementation) {
        nameToTypeMap.put(elementName, type.getName());
        typeToNameMap.put(type, elementName);
        if (!type.equals(defaultImplementation)) {
            typeToNameMap.put(defaultImplementation, elementName);
        }
        baseTypeToDefaultTypeMap.put(type, defaultImplementation);
    }
 
    public String lookupName(Class type) {
        boolean isArray = type.isArray();
        if (type.isArray()) {
            type = type.getComponentType();
        }
        String result = (String) typeToNameMap.get(type);
        if (result == null) {
            // the $ used in inner class names is illegal as an xml element name
            result = type.getName().replaceAll("\\$", "-");
        }
        if (isArray) {
            result += "-array";
        }
        return result;
    }
 
    public Class lookupType(String elementName) {
        if (elementName.equals("null")) {
            return null;
        }
        boolean isArray = elementName.endsWith("-array");
        if (isArray) {
            elementName = elementName.substring(0, elementName.length() - 6); // cut off -array
        }
        String mappedName = (String) nameToTypeMap.get(elementName);
        if (mappedName != null) {
            elementName = mappedName;
        }
        // the $ used in inner class names is illegal as an xml element name
        elementName = elementName.replaceAll("\\-", "\\$");
        try {
            if (isArray) {
                return Class.forName("[L" + elementName + ";");
            } else {
                return Class.forName(elementName);
            }
        } catch (ClassNotFoundException e) {
            throw new CannotResolveClassException(elementName);
        }
    }
 
    public Class lookupDefaultType(Class baseType) {
        return (Class) baseTypeToDefaultTypeMap.get(baseType);
    }
 
}