OSDN Git Service

DBFlute-0.9.3に更新
[ea2ddl/ea2ddl.git] / ea2ddl-ddl / src / main / java / jp / sourceforge / ea2ddl / ddl / factory / impl / DatabaseModelFactoryImpl.java
1 /**\r
2  * \r
3  */\r
4 package jp.sourceforge.ea2ddl.ddl.factory.impl;\r
5 \r
6 import java.util.List;\r
7 \r
8 import jp.sourceforge.ea2ddl.common.config.Config;\r
9 import jp.sourceforge.ea2ddl.dao.cbean.TConnectorCB;\r
10 import jp.sourceforge.ea2ddl.dao.cbean.TOperationCB;\r
11 import jp.sourceforge.ea2ddl.dao.cbean.TOperationparamsCB;\r
12 import jp.sourceforge.ea2ddl.dao.exbhv.TAttributeBhv;\r
13 import jp.sourceforge.ea2ddl.dao.exbhv.TConnectorBhv;\r
14 import jp.sourceforge.ea2ddl.dao.exbhv.TObjectBhv;\r
15 import jp.sourceforge.ea2ddl.dao.exbhv.TObjectconstraintBhv;\r
16 import jp.sourceforge.ea2ddl.dao.exbhv.TObjectpropertiesBhv;\r
17 import jp.sourceforge.ea2ddl.dao.exbhv.TOperationBhv;\r
18 import jp.sourceforge.ea2ddl.dao.exbhv.TOperationparamsBhv;\r
19 import jp.sourceforge.ea2ddl.dao.exbhv.TPackageBhv;\r
20 import jp.sourceforge.ea2ddl.dao.exentity.TAttribute;\r
21 import jp.sourceforge.ea2ddl.dao.exentity.TConnector;\r
22 import jp.sourceforge.ea2ddl.dao.exentity.TObject;\r
23 import jp.sourceforge.ea2ddl.dao.exentity.TOperation;\r
24 import jp.sourceforge.ea2ddl.dao.exentity.TOperationparams;\r
25 import jp.sourceforge.ea2ddl.dao.exentity.TPackage;\r
26 import jp.sourceforge.ea2ddl.ddl.ConfigKey;\r
27 import jp.sourceforge.ea2ddl.ddl.Constants;\r
28 import jp.sourceforge.ea2ddl.ddl.factory.ModelFactory;\r
29 import jp.sourceforge.ea2ddl.ddl.model.ColumnModel;\r
30 import jp.sourceforge.ea2ddl.ddl.model.DatabaseModel;\r
31 import jp.sourceforge.ea2ddl.ddl.model.ForeignKeyModel;\r
32 import jp.sourceforge.ea2ddl.ddl.model.IndexModel;\r
33 import jp.sourceforge.ea2ddl.ddl.model.PrimaryKeyModel;\r
34 import jp.sourceforge.ea2ddl.ddl.model.TableModel;\r
35 import jp.sourceforge.ea2ddl.ddl.model.UniqueModel;\r
36 \r
37 import org.apache.commons.logging.Log;\r
38 import org.apache.commons.logging.LogFactory;\r
39 import org.seasar.dbflute.cbean.ListResultBean;\r
40 import org.seasar.framework.container.annotation.tiger.Binding;\r
41 \r
42 /**\r
43  * @author taktos\r
44  * \r
45  */\r
46 public class DatabaseModelFactoryImpl implements ModelFactory {\r
47         private Log _log = LogFactory.getLog(DatabaseModelFactoryImpl.class);\r
48 \r
49         private Config _config;\r
50         private TPackageBhv _tPackageBhv;\r
51         private TObjectBhv _tObjectBhv;\r
52         private TObjectpropertiesBhv _tObjectpropertiesBhv;\r
53         private TObjectconstraintBhv _tObjectconstraintBhv;\r
54         private TAttributeBhv _tAttributeBhv;\r
55         private TConnectorBhv _tConnectorBhv;\r
56         private TOperationBhv _tOperationBhv;\r
57         private TOperationparamsBhv _tOperationparamsBhv;\r
58 \r
59         @Binding\r
60         public void setConfig(Config config) {\r
61                 _config = config;\r
62         }\r
63 \r
64         @Binding\r
65         public void setTPackageBhv(TPackageBhv packageBhv) {\r
66                 _tPackageBhv = packageBhv;\r
67         }\r
68 \r
69         @Binding\r
70         public void setTObjectBhv(TObjectBhv objectBhv) {\r
71                 _tObjectBhv = objectBhv;\r
72         }\r
73 \r
74         @Binding\r
75         public void setTObjectpropertiesBhv(TObjectpropertiesBhv objectpropertiesBhv) {\r
76                 _tObjectpropertiesBhv = objectpropertiesBhv;\r
77         }\r
78 \r
79         @Binding\r
80         public void setTObjectconstraintBhv(TObjectconstraintBhv objectconstraintBhv) {\r
81                 _tObjectconstraintBhv = objectconstraintBhv;\r
82         }\r
83 \r
84         @Binding\r
85         public void setTAttributeBhv(TAttributeBhv attributeBhv) {\r
86                 _tAttributeBhv = attributeBhv;\r
87         }\r
88 \r
89         @Binding\r
90         public void setTConnectorBhv(TConnectorBhv connectorBhv) {\r
91                 _tConnectorBhv = connectorBhv;\r
92         }\r
93 \r
94         @Binding\r
95         public void setTOperationBhv(TOperationBhv operationBhv) {\r
96                 _tOperationBhv = operationBhv;\r
97         }\r
98 \r
99         @Binding\r
100         public void setTOperationparamsBhv(TOperationparamsBhv operationparamsBhv) {\r
101                 _tOperationparamsBhv = operationparamsBhv;\r
102         }\r
103 \r
104         /*\r
105          * (�� Javadoc)\r
106          * \r
107          * @see jp.sourceforge.ea2ddl.ddl.factory.Generator#execute()\r
108          */\r
109         public DatabaseModel create() {\r
110                 final DatabaseModel dbModel = new DatabaseModel();\r
111                 final TPackage pkg = getPackage();\r
112                 final List<TObject> objectList = _tObjectBhv.selectListByStereotype(pkg, Constants.STEREOTYPE_TABLE);\r
113                 _log.debug(objectList.size());\r
114 \r
115                 for (TObject object : objectList) {\r
116                         final TableModel table = generateTableModel(object);\r
117                         dbModel.addTable(table);\r
118                 }\r
119                 return dbModel;\r
120         }\r
121 \r
122         protected TPackage getPackage() {\r
123                 return _tPackageBhv.selectPackage(_config.getProperty(ConfigKey.ER_PACKAGE_TREE));\r
124         }\r
125 \r
126         protected TableModel generateTableModel(TObject tobject) {\r
127                 final TableModel table = new TableModel();\r
128                 table.setName(tobject.getName());\r
129                 table.setAlias(tobject.getAlias());\r
130                 table.setNote(tobject.getNote());\r
131                 if (_config.getBoolean(_config.getProperty(ConfigKey.USE_SCHEMA))) {\r
132                         table.setSchema(_tObjectpropertiesBhv.getValue(tobject, Constants.OBJECT_PROPERTIES_OWNER));\r
133                 }\r
134                 table.setSuppressCommonColumn(_tObjectconstraintBhv.hasConstraint(tobject, Constants.SUPPRESS_COMMON_COLUMN));\r
135                 generateColumnModel(table, tobject);\r
136                 generatePKModel(table, tobject);\r
137                 generateFKModel(table, tobject);\r
138                 generateUniqueModel(table, tobject);\r
139                 generateIndexModel(table, tobject);\r
140 \r
141                 return table;\r
142         }\r
143 \r
144         protected void generateColumnModel(TableModel table, TObject tobject) {\r
145                 final List<TAttribute> attributes = _tAttributeBhv.selectColumns(tobject);\r
146                 for (TAttribute attribute : attributes) {\r
147                         final ColumnModel column = new ColumnModel();\r
148                         column.setName(attribute.getName());\r
149                         column.setAlias(attribute.getStyle());\r
150                         column.setType(getColumnType(attribute));\r
151                         column.setLength(attribute.getLength());\r
152                         column.setPrecision(attribute.getPrecision());\r
153                         column.setScale(attribute.getScale());\r
154                         column.setNullable(Integer.valueOf(0).equals(attribute.getAllowduplicates()));\r
155                         column.setNote(attribute.getNotes());\r
156                         table.addColumn(column);\r
157                 }\r
158         }\r
159 \r
160         protected String getColumnType(TAttribute attribute) {\r
161                 final String dictionary = _config.getProperty(attribute.getName());\r
162                 if (dictionary != null) {\r
163                         return dictionary;\r
164                 }\r
165                 return attribute.getType();\r
166         }\r
167 \r
168         protected void generatePKModel(TableModel table, TObject tobject) {\r
169                 final ListResultBean<TOperation> pkList = _tOperationBhv.selectOperation(tobject,\r
170                                 Constants.STEREOTYPE_PRIMARY_KEY);\r
171                 if (pkList.isEmpty()) {\r
172                         return;\r
173                 }\r
174                 final TOperation opePK = pkList.get(0);\r
175                 final ListResultBean<TOperationparams> params = _tOperationparamsBhv.selectOperationParams(opePK);\r
176                 if (!params.isEmpty()) {\r
177                         final PrimaryKeyModel pk = new PrimaryKeyModel();\r
178                         pk.setName(opePK.getName());\r
179                         for (TOperationparams param : params) {\r
180                                 pk.addColumnName(param.getName());\r
181                         }\r
182                         table.setPrimaryKey(pk);\r
183                 }\r
184         }\r
185 \r
186         protected void generateFKModel(TableModel table, TObject tobject) {\r
187                 final ListResultBean<TOperation> fkList = _tOperationBhv.selectOperation(tobject,\r
188                                 Constants.STEREOTYPE_FOREIGN_KEY);\r
189                 for (TOperation opeFK : fkList) {\r
190                         final ForeignKeyModel fkModel = new ForeignKeyModel();\r
191                         fkModel.setName(opeFK.getName());\r
192 \r
193                         {\r
194                                 final ListResultBean<TOperationparams> params = _tOperationparamsBhv.selectOperationParams(opeFK);\r
195                                 for (TOperationparams param : params) {\r
196                                         fkModel.addColumnName(param.getName());\r
197                                 }\r
198                         }\r
199                         {\r
200                                 final TConnectorCB conCB = new TConnectorCB();\r
201                                 conCB.query().setStartObjectId_Equal(tobject.getObjectId());\r
202                                 conCB.query().setSourcerole_Equal(opeFK.getName());\r
203                                 final TConnector con = _tConnectorBhv.selectEntity(conCB);\r
204 \r
205                                 final TObject targetTable = _tObjectBhv.selectEntity(con.getEndObjectId());\r
206                                 fkModel.setTargetTable(targetTable.getName());\r
207 \r
208                                 final TOperationCB targetOpeCB = new TOperationCB();\r
209                                 targetOpeCB.query().setObjectId_Equal(con.getEndObjectId());\r
210                                 targetOpeCB.query().setName_Equal(con.getDestrole());\r
211                                 final TOperation targetOpe = _tOperationBhv.selectEntity(targetOpeCB);\r
212 \r
213                                 final ListResultBean<TOperationparams> targetParams = _tOperationparamsBhv\r
214                                                 .selectOperationParams(targetOpe);\r
215                                 for (TOperationparams targetParam : targetParams) {\r
216                                         fkModel.addTargetColumnName(targetParam.getName());\r
217                                 }\r
218                         }\r
219                         table.addForeignKey(fkModel);\r
220                 }\r
221         }\r
222 \r
223         protected void generateUniqueModel(TableModel table, TObject tobject) {\r
224                 final TOperationCB cb = new TOperationCB();\r
225                 cb.query().setObjectId_Equal(tobject.getObjectId());\r
226                 cb.query().setStereotype_Equal(Constants.STEREOTYPE_UNIQUE);\r
227                 final ListResultBean<TOperation> uniqueList = _tOperationBhv.selectList(cb);\r
228                 for (TOperation unique : uniqueList) {\r
229                         final UniqueModel uniqueModel = new UniqueModel();\r
230                         uniqueModel.setName(unique.getName());\r
231                         final TOperationparamsCB opeCB = new TOperationparamsCB();\r
232                         opeCB.query().setOperationid_Equal(unique.getOperationid());\r
233                         opeCB.query().addOrderBy_Pos_Asc();\r
234                         final ListResultBean<TOperationparams> cols = _tOperationparamsBhv.selectList(opeCB);\r
235                         for (TOperationparams param : cols) {\r
236                                 uniqueModel.addColumnName(param.getName());\r
237                         }\r
238                         table.addUnique(uniqueModel);\r
239                 }\r
240         }\r
241 \r
242         protected void generateIndexModel(TableModel table, TObject tobject) {\r
243                 final ListResultBean<TOperation> indexList = _tOperationBhv.selectOperation(tobject, "index");\r
244                 for (TOperation index : indexList) {\r
245                         final IndexModel indexModel = new IndexModel();\r
246                         indexModel.setName(index.getName());\r
247                         final ListResultBean<TOperationparams> params = _tOperationparamsBhv.selectOperationParams(index);\r
248                         for (TOperationparams param : params) {\r
249                                 indexModel.addColumn(param.getName());\r
250                         }\r
251                         table.addIndex(indexModel);\r
252                 }\r
253         }\r
254 \r
255 }\r