OSDN Git Service

AUTO_INCREMENTに対応
[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(\r
113                                 pkg, Constants.STEREOTYPE_TABLE);\r
114                 _log.debug(objectList.size());\r
115 \r
116                 for (TObject object : objectList) {\r
117                         final TableModel table = generateTableModel(object);\r
118                         dbModel.addTable(table);\r
119                 }\r
120                 return dbModel;\r
121         }\r
122 \r
123         protected TPackage getPackage() {\r
124                 return _tPackageBhv.selectPackage(_config\r
125                                 .getProperty(ConfigKey.ER_PACKAGE_TREE));\r
126         }\r
127 \r
128         protected TableModel generateTableModel(TObject tobject) {\r
129                 final TableModel table = new TableModel();\r
130                 table.setName(tobject.getName());\r
131                 table.setAlias(tobject.getAlias());\r
132                 table.setNote(tobject.getNote());\r
133                 if (_config.getBoolean(_config.getProperty(ConfigKey.USE_SCHEMA))) {\r
134                         table.setSchema(_tObjectpropertiesBhv.getValue(tobject,\r
135                                         Constants.OBJECT_PROPERTIES_OWNER));\r
136                 }\r
137                 table.setSuppressCommonColumn(_tObjectconstraintBhv.hasConstraint(\r
138                                 tobject, Constants.SUPPRESS_COMMON_COLUMN));\r
139                 generateColumnModel(table, tobject);\r
140                 generatePKModel(table, tobject);\r
141                 generateFKModel(table, tobject);\r
142                 generateUniqueModel(table, tobject);\r
143                 generateIndexModel(table, tobject);\r
144                 return table;\r
145         }\r
146 \r
147         protected void generateColumnModel(TableModel table, TObject tobject) {\r
148                 final List<TAttribute> attributes = _tAttributeBhv\r
149                                 .selectColumns(tobject);\r
150                 for (TAttribute attribute : attributes) {\r
151                         table.addColumn(ColumnModel.create(attribute, _config));\r
152                 }\r
153         }\r
154 \r
155         protected String getColumnType(TAttribute attribute) {\r
156                 final String dictionary = _config.getProperty(attribute.getType());\r
157                 if (dictionary != null) {\r
158                         return dictionary;\r
159                 }\r
160                 return attribute.getType();\r
161         }\r
162 \r
163         protected void generatePKModel(TableModel table, TObject tobject) {\r
164                 final ListResultBean<TOperation> pkList = _tOperationBhv\r
165                                 .selectOperation(tobject, Constants.STEREOTYPE_PRIMARY_KEY);\r
166                 if (pkList.isEmpty()) {\r
167                         return;\r
168                 }\r
169                 final TOperation opePK = pkList.get(0);\r
170                 final ListResultBean<TOperationparams> params = _tOperationparamsBhv\r
171                                 .selectOperationParams(opePK);\r
172                 if (!params.isEmpty()) {\r
173                         final PrimaryKeyModel pk = new PrimaryKeyModel();\r
174                         pk.setName(opePK.getName());\r
175                         for (TOperationparams param : params) {\r
176                                 pk.addColumnName(param.getName());\r
177                         }\r
178                         table.setPrimaryKey(pk);\r
179                 }\r
180         }\r
181 \r
182         protected void generateFKModel(TableModel table, TObject tobject) {\r
183                 final ListResultBean<TOperation> fkList = _tOperationBhv\r
184                                 .selectOperation(tobject, Constants.STEREOTYPE_FOREIGN_KEY);\r
185                 for (TOperation opeFK : fkList) {\r
186                         final ForeignKeyModel fkModel = new ForeignKeyModel();\r
187                         fkModel.setName(opeFK.getName());\r
188 \r
189                         {\r
190                                 final ListResultBean<TOperationparams> params = _tOperationparamsBhv\r
191                                                 .selectOperationParams(opeFK);\r
192                                 for (TOperationparams param : params) {\r
193                                         fkModel.addColumnName(param.getName());\r
194                                 }\r
195                         }\r
196                         {\r
197                                 final TConnectorCB conCB = new TConnectorCB();\r
198                                 conCB.query().setStartObjectId_Equal(tobject.getObjectId());\r
199                                 conCB.query().setSourcerole_Equal(opeFK.getName());\r
200                                 final TConnector con = _tConnectorBhv.selectEntity(conCB);\r
201 \r
202                                 final TObject targetTable = _tObjectBhv.selectEntity(con\r
203                                                 .getEndObjectId());\r
204                                 fkModel.setTargetTable(targetTable.getName());\r
205 \r
206                                 final TOperationCB targetOpeCB = new TOperationCB();\r
207                                 targetOpeCB.query().setObjectId_Equal(con.getEndObjectId());\r
208                                 targetOpeCB.query().setName_Equal(con.getDestrole());\r
209                                 final TOperation targetOpe = _tOperationBhv\r
210                                                 .selectEntity(targetOpeCB);\r
211 \r
212                                 final ListResultBean<TOperationparams> targetParams = _tOperationparamsBhv\r
213                                                 .selectOperationParams(targetOpe);\r
214                                 for (TOperationparams targetParam : targetParams) {\r
215                                         fkModel.addTargetColumnName(targetParam.getName());\r
216                                 }\r
217                         }\r
218                         table.addForeignKey(fkModel);\r
219                 }\r
220         }\r
221 \r
222         protected void generateUniqueModel(TableModel table, TObject tobject) {\r
223                 final TOperationCB cb = new TOperationCB();\r
224                 cb.query().setObjectId_Equal(tobject.getObjectId());\r
225                 cb.query().setStereotype_Equal(Constants.STEREOTYPE_UNIQUE);\r
226                 final ListResultBean<TOperation> uniqueList = _tOperationBhv\r
227                                 .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\r
235                                         .selectList(opeCB);\r
236                         for (TOperationparams param : cols) {\r
237                                 uniqueModel.addColumnName(param.getName());\r
238                         }\r
239                         table.addUnique(uniqueModel);\r
240                 }\r
241         }\r
242 \r
243         protected void generateIndexModel(TableModel table, TObject tobject) {\r
244                 final ListResultBean<TOperation> indexList = _tOperationBhv\r
245                                 .selectOperation(tobject, "index");\r
246                 for (TOperation index : indexList) {\r
247                         final IndexModel indexModel = new IndexModel();\r
248                         indexModel.setName(index.getName());\r
249                         final ListResultBean<TOperationparams> params = _tOperationparamsBhv\r
250                                         .selectOperationParams(index);\r
251                         for (TOperationparams param : params) {\r
252                                 indexModel.addColumn(param.getName());\r
253                         }\r
254                         table.addIndex(indexModel);\r
255                 }\r
256         }\r
257 \r
258 }\r