1   
2   
3   
4   
5   
6   
7   
8   
9   
10  
11  
12  
13  
14  
15  
16  package org.apache.ibatis.builder;
17  
18  import java.util.Arrays;
19  import java.util.HashSet;
20  import java.util.Set;
21  import java.util.regex.Pattern;
22  
23  import org.apache.ibatis.mapping.ParameterMode;
24  import org.apache.ibatis.mapping.ResultSetType;
25  import org.apache.ibatis.session.Configuration;
26  import org.apache.ibatis.type.JdbcType;
27  import org.apache.ibatis.type.TypeAliasRegistry;
28  import org.apache.ibatis.type.TypeHandler;
29  import org.apache.ibatis.type.TypeHandlerRegistry;
30  
31  
32  
33  
34  public abstract class BaseBuilder {
35    protected final Configuration configuration;
36    protected final TypeAliasRegistry typeAliasRegistry;
37    protected final TypeHandlerRegistry typeHandlerRegistry;
38  
39    public BaseBuilder(Configuration configuration) {
40      this.configuration = configuration;
41      this.typeAliasRegistry = this.configuration.getTypeAliasRegistry();
42      this.typeHandlerRegistry = this.configuration.getTypeHandlerRegistry();
43    }
44  
45    public Configuration getConfiguration() {
46      return configuration;
47    }
48  
49    protected Pattern parseExpression(String regex, String defaultValue) {
50      return Pattern.compile(regex == null ? defaultValue : regex);
51    }
52  
53    protected Boolean booleanValueOf(String value, Boolean defaultValue) {
54      return value == null ? defaultValue : Boolean.valueOf(value);
55    }
56  
57    protected Integer integerValueOf(String value, Integer defaultValue) {
58      return value == null ? defaultValue : Integer.valueOf(value);
59    }
60  
61    protected Set<String> stringSetValueOf(String value, String defaultValue) {
62      value = value == null ? defaultValue : value;
63      return new HashSet<>(Arrays.asList(value.split(",")));
64    }
65  
66    protected JdbcType resolveJdbcType(String alias) {
67      if (alias == null) {
68        return null;
69      }
70      try {
71        return JdbcType.valueOf(alias);
72      } catch (IllegalArgumentException e) {
73        throw new BuilderException("Error resolving JdbcType. Cause: " + e, e);
74      }
75    }
76  
77    protected ResultSetType resolveResultSetType(String alias) {
78      if (alias == null) {
79        return null;
80      }
81      try {
82        return ResultSetType.valueOf(alias);
83      } catch (IllegalArgumentException e) {
84        throw new BuilderException("Error resolving ResultSetType. Cause: " + e, e);
85      }
86    }
87  
88    protected ParameterMode resolveParameterMode(String alias) {
89      if (alias == null) {
90        return null;
91      }
92      try {
93        return ParameterMode.valueOf(alias);
94      } catch (IllegalArgumentException e) {
95        throw new BuilderException("Error resolving ParameterMode. Cause: " + e, e);
96      }
97    }
98  
99    protected Object createInstance(String alias) {
100     Class<?> clazz = resolveClass(alias);
101     if (clazz == null) {
102       return null;
103     }
104     try {
105       return clazz.getDeclaredConstructor().newInstance();
106     } catch (Exception e) {
107       throw new BuilderException("Error creating instance. Cause: " + e, e);
108     }
109   }
110 
111   protected <T> Class<? extends T> resolveClass(String alias) {
112     if (alias == null) {
113       return null;
114     }
115     try {
116       return resolveAlias(alias);
117     } catch (Exception e) {
118       throw new BuilderException("Error resolving class. Cause: " + e, e);
119     }
120   }
121 
122   protected TypeHandler<?> resolveTypeHandler(Class<?> javaType, String typeHandlerAlias) {
123     if (typeHandlerAlias == null) {
124       return null;
125     }
126     Class<?> type = resolveClass(typeHandlerAlias);
127     if (type != null && !TypeHandler.class.isAssignableFrom(type)) {
128       throw new BuilderException("Type " + type.getName() + " is not a valid TypeHandler because it does not implement TypeHandler interface");
129     }
130     @SuppressWarnings("unchecked") 
131     Class<? extends TypeHandler<?>> typeHandlerType = (Class<? extends TypeHandler<?>>) type;
132     return resolveTypeHandler(javaType, typeHandlerType);
133   }
134 
135   protected TypeHandler<?> resolveTypeHandler(Class<?> javaType, Class<? extends TypeHandler<?>> typeHandlerType) {
136     if (typeHandlerType == null) {
137       return null;
138     }
139     
140     TypeHandler<?> handler = typeHandlerRegistry.getMappingTypeHandler(typeHandlerType);
141     if (handler == null) {
142       
143       handler = typeHandlerRegistry.getInstance(javaType, typeHandlerType);
144     }
145     return handler;
146   }
147 
148   protected <T> Class<? extends T> resolveAlias(String alias) {
149     return typeAliasRegistry.resolveAlias(alias);
150   }
151 }