1 ${database.allClassCopyright}package ${glPackageBaseCommonS2Dao};
\r
3 import java.util.ArrayList;
\r
4 import java.util.List;
\r
5 import java.sql.DatabaseMetaData;
\r
7 import org.seasar.extension.jdbc.PropertyType;
\r
8 import org.seasar.framework.beans.BeanDesc;
\r
9 import org.seasar.framework.beans.PropertyDesc;
\r
10 import org.seasar.dao.BeanAnnotationReader;
\r
11 import org.seasar.dao.ColumnNaming;
\r
12 import org.seasar.dao.Dbms;
\r
13 import org.seasar.dao.PropertyTypeFactory;
\r
14 import org.seasar.dao.PropertyTypeFactoryBuilder;
\r
15 import org.seasar.dao.ValueTypeFactory;
\r
16 import org.seasar.dao.impl.AbstractPropertyTypeFactory;
\r
18 import ${glPackageBaseCommon}.${glEntityInterfaceName};
\r
19 import ${glPackageBaseCommonDBMeta}.${glDBMetaInterfaceName};
\r
22 * The factory builder of property type for S2Dao. {Since S2Dao-1.0.47}
\r
23 * @author ${database.ClassAuthor}
\r
24 */${database.outputSuppressWarningsAfterLineSeparator()}
\r
25 public class ${glDaoPropertyTypeFactoryBuilderExtension} implements PropertyTypeFactoryBuilder {
\r
27 // ===================================================================================
\r
30 protected ValueTypeFactory valueTypeFactory;
\r
32 protected ColumnNaming columnNaming;
\r
34 // ===================================================================================
\r
37 public PropertyTypeFactory build(Class beanClass, BeanAnnotationReader beanAnnotationReader) {
\r
38 return new FastPropertyTypeFactoryExtension(beanClass, beanAnnotationReader, valueTypeFactory, columnNaming);
\r
41 public PropertyTypeFactory build(Class beanClass, BeanAnnotationReader beanAnnotationReader, Dbms dbms, DatabaseMetaData databaseMetaData) {
\r
42 return new FastPropertyTypeFactoryExtension(beanClass, beanAnnotationReader, valueTypeFactory, columnNaming, dbms);
\r
45 // ===================================================================================
\r
48 protected static class FastPropertyTypeFactoryExtension extends AbstractPropertyTypeFactory {
\r
50 protected ${glDBMetaInterfaceName} _dbmeta;
\r
51 protected String[] _noPersisteneProps;
\r
53 public FastPropertyTypeFactoryExtension(Class beanClass, BeanAnnotationReader beanAnnotationReader,
\r
54 ValueTypeFactory valueTypeFactory, ColumnNaming columnNaming) {
\r
55 super(beanClass, beanAnnotationReader, valueTypeFactory, columnNaming);
\r
56 initializeResources();
\r
59 public FastPropertyTypeFactoryExtension(Class beanClass, BeanAnnotationReader beanAnnotationReader,
\r
60 ValueTypeFactory valueTypeFactory, ColumnNaming columnNaming, Dbms dbms) {
\r
61 super(beanClass, beanAnnotationReader, valueTypeFactory, columnNaming, dbms);
\r
62 initializeResources();
\r
65 protected void initializeResources() {
\r
67 _dbmeta = findDBMeta();
\r
69 _noPersisteneProps = beanAnnotationReader.getNoPersisteneProps();
\r
72 protected boolean isEntity() {
\r
73 return ${glEntityInterfaceName}.class.isAssignableFrom(beanClass);
\r
76 protected boolean hasDBMeta() {
\r
77 return _dbmeta != null;
\r
80 protected ${glDBMetaInterfaceName} findDBMeta() {
\r
82 final ${glEntityInterfaceName} entity = (${glEntityInterfaceName}) beanClass.newInstance();
\r
83 return entity.getDBMeta();
\r
84 } catch (Exception e) {
\r
85 String msg = "beanClass.newInstance() threw the exception: beanClass=" + beanClass;
\r
86 throw new RuntimeException(msg, e);
\r
90 public PropertyType[] createBeanPropertyTypes(String tableName) {
\r
91 final List<PropertyType> list = new ArrayList<PropertyType>();
\r
92 final BeanDesc beanDesc = getBeanDesc();
\r
93 for (int i = 0; i < beanDesc.getPropertyDescSize(); ++i) {
\r
94 final PropertyDesc pd = beanDesc.getPropertyDesc(i);
\r
96 // Read-only property is unnecessary!
\r
97 if (!pd.hasWriteMethod()) {
\r
101 // Relation property is unnecessary!
\r
102 if (isRelation(pd)) {
\r
106 final PropertyType pt = createPropertyType(pd);
\r
107 pt.setPrimaryKey(isPrimaryKey(pd));
\r
108 pt.setPersistent(isPersistent(pt));
\r
111 return list.toArray(new PropertyType[list.size()]);
\r
115 protected boolean isRelation(PropertyDesc propertyDesc) {
\r
116 final String propertyName = propertyDesc.getPropertyName();
\r
117 if (hasDBMeta() && (_dbmeta.hasForeign(propertyName) || _dbmeta.hasReferrer(propertyName))) {
\r
120 return hasRelationNoAnnotation(propertyDesc);
\r
123 protected boolean hasRelationNoAnnotation(PropertyDesc propertyDesc) {
\r
124 return beanAnnotationReader.hasRelationNo(propertyDesc);
\r
128 protected boolean isPrimaryKey(PropertyDesc propertyDesc) {
\r
129 final String propertyName = propertyDesc.getPropertyName();
\r
130 if (hasDBMeta() && _dbmeta.hasPrimaryKey() && _dbmeta.hasColumn(propertyName)) {
\r
131 if (_dbmeta.findColumnInfo(propertyName).isPrimary()) {
\r
135 return hasIdAnnotation(propertyDesc);
\r
138 protected boolean hasIdAnnotation(PropertyDesc propertyDesc) {
\r
139 final Dbms dbms = getDbms();
\r
140 return beanAnnotationReader.getId(propertyDesc, dbms) != null;
\r
144 protected boolean isPersistent(PropertyType propertyType) {
\r
145 final String propertyName = propertyType.getPropertyName();
\r
146 final PropertyDesc propertyDesc = propertyType.getPropertyDesc();
\r
147 if ((hasDBMeta() && _dbmeta.hasColumn(propertyName)) || hasColumnAnnotation(propertyDesc)) {
\r
148 if (!isElementOfNoPersistentProps(propertyDesc)) {
\r
155 protected boolean hasColumnAnnotation(PropertyDesc propertyDesc) {
\r
156 return beanAnnotationReader.getColumnAnnotation(propertyDesc) != null;
\r
159 protected boolean isElementOfNoPersistentProps(PropertyDesc propertyDesc) {
\r
160 final String propertyName = propertyDesc.getPropertyName();
\r
161 final String[] props = _noPersisteneProps;
\r
162 if (props != null && props.length >= 0) {
\r
163 for (int i = 0; i < props.length; ++i) {
\r
164 if (props[i].equals(propertyName)) {
\r
173 // ===================================================================================
\r
176 public ValueTypeFactory getValueTypeFactory() {
\r
177 return valueTypeFactory;
\r
180 public void setValueTypeFactory(ValueTypeFactory valueTypeFactory) {
\r
181 this.valueTypeFactory = valueTypeFactory;
\r
184 public ColumnNaming getColumnNaming() {
\r
185 return columnNaming;
\r
188 public void setColumnNaming(ColumnNaming columnNaming) {
\r
189 this.columnNaming = columnNaming;
\r