Changeset 887 for MetadataBeans/trunk/src/main/java/org/eobjects/metamodel/XmlDataContextStrategy.java
- Timestamp:
- 02/04/10 21:56:24 (2 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
MetadataBeans/trunk/src/main/java/org/eobjects/metamodel/XmlDataContextStrategy.java
r886 r887 37 37 import org.eobjects.metamodel.query.SelectItem; 38 38 import org.eobjects.metamodel.schema.Column; 39 import org.eobjects.metamodel.schema.MutableColumn; 39 40 import org.eobjects.metamodel.schema.ColumnType; 41 import org.eobjects.metamodel.schema.ImmutableRelationship; 42 import org.eobjects.metamodel.schema.MutableSchema; 43 import org.eobjects.metamodel.schema.MutableTable; 40 44 import org.eobjects.metamodel.schema.Relationship; 41 import org.eobjects.metamodel.schema.Schema;42 45 import org.eobjects.metamodel.schema.Table; 43 46 import org.eobjects.metamodel.schema.TableType; … … 53 56 import org.xml.sax.InputSource; 54 57 55 56 58 /** 57 59 * A DataContext strategy that reads XML content and maps it to a table-based … … 69 71 public static final String NATIVE_TYPE_TEXT = "XML Text"; 70 72 private static final String TEXT_CONTENT_TEMP_SUFFIX = "_metamodel_text_content"; 71 private Schema _schema;73 private MutableSchema _schema; 72 74 private Map<String, List<Object[]>> _tableData = new HashMap<String, List<Object[]>>();; 73 75 private boolean _autoFlattenTables; … … 86 88 _autoFlattenTables = autoFlattenTables; 87 89 _schemaName = schemaName; 88 _schema = new Schema(_schemaName);90 _schema = new MutableSchema(_schemaName); 89 91 loadSchema(document); 90 92 } … … 195 197 196 198 @Override 197 protected Schema getMainSchema() throws MetaModelException {199 protected MutableSchema getMainSchema() throws MetaModelException { 198 200 loadSchema(); 199 201 return _schema; … … 214 216 public XmlDataContextStrategy loadSchema() { 215 217 if (_schema == null) { 216 _schema = new Schema(_schemaName);218 _schema = new MutableSchema(_schemaName); 217 219 try { 218 220 DocumentBuilderFactory dbf = DocumentBuilderFactory … … 237 239 // node or pure XML structure) 238 240 Table[] tables = _schema.getTables(); 239 for (Table table : tables) { 241 for (Table t : tables) { 242 MutableTable table = (MutableTable) t; 240 243 String tableName = table.getName(); 241 244 List<Object[]> tableRows = _tableData.get(tableName); … … 248 251 Column idColumn = getIdColumn(table); 249 252 Column column = table.getColumnByName("id"); 250 if (column == null ) {251 idColumn.setName("id");253 if (column == null && column instanceof MutableColumn) { 254 ((MutableColumn) idColumn).setName("id"); 252 255 } 253 256 … … 264 267 } 265 268 if (!found) { 266 table.removeColumn(textContentColumn);269 ((MutableTable) table).removeColumn(textContentColumn); 267 270 } else { 268 271 // Rename all text content columns to reasonable … … 274 277 column = table.getColumnByName(preferredName); 275 278 if (column == null) { 276 textContentColumn.setName(preferredName); 279 ((MutableColumn) textContentColumn) 280 .setName(preferredName); 277 281 } 278 282 } … … 285 289 286 290 private void loadTables(Element element, String tablePrefix, 287 Column parentKeyColumn, int parentKey) {291 MutableColumn parentKeyColumn, int parentKey) { 288 292 Attr[] attributes = getAttributes(element); 289 293 String textContent = getTextContent(element); … … 292 296 || hasSiblings(element)) { 293 297 // We need to represent this type of node with a table 294 Table table = _schema.getTableByName(tableName); 298 MutableTable table = (MutableTable) _schema 299 .getTableByName(tableName); 295 300 Column idColumn; 296 Column foreignKeyColumn;301 MutableColumn foreignKeyColumn; 297 302 List<Object[]> tableRows; 298 303 if (table == null) { 299 304 _log.info("Creating table: " + tableName); 300 table = new Table(tableName, TableType.TABLE, _schema);305 table = new MutableTable(tableName, TableType.TABLE, _schema); 301 306 _schema.addTable(table); 302 307 idColumn = getIdColumn(table); … … 306 311 if (parentKeyColumn != null) { 307 312 Table parentTable = parentKeyColumn.getTable(); 308 foreignKeyColumn = new Column( 309 parentTable.getName() + "_id", parentKeyColumn 310 .getType(), table, table.getColumnCount(), 311 false); 313 foreignKeyColumn = new MutableColumn(parentTable.getName() 314 + "_id", parentKeyColumn.getType(), table, table 315 .getColumnCount(), false); 312 316 foreignKeyColumn.setNativeType(NATIVE_TYPE_FOREIGN_KEY); 313 table.addColumn(foreignKeyColumn);314 315 Relationship.createRelationship(316 new Column[] { parentKeyColumn },317 new Column[] { foreignKeyColumn });317 ((MutableTable) table).addColumn(foreignKeyColumn); 318 319 ImmutableRelationship.createRelationship( 320 new MutableColumn[] { parentKeyColumn }, 321 new MutableColumn[] { foreignKeyColumn }); 318 322 319 323 } else { … … 325 329 Column[] foreignKeys = table.getForeignKeys(); 326 330 if (foreignKeys.length == 1) { 327 foreignKeyColumn = foreignKeys[0];331 foreignKeyColumn = (MutableColumn) foreignKeys[0]; 328 332 } else { 329 333 foreignKeyColumn = null; … … 333 337 Column textContentColumn = getTextContentColumn(table, element 334 338 .getNodeName()); 335 Map< Column, String> columnValues = new HashMap<Column, String>();339 Map<MutableColumn, String> columnValues = new HashMap<MutableColumn, String>(); 336 340 for (Attr attr : attributes) { 337 341 String name = attr.getName(); 338 Column column = table.getColumnByName(name); 342 MutableColumn column = (MutableColumn) table 343 .getColumnByName(name); 339 344 if (column == null) { 340 345 _log.info("Creating column: " + tableName + "." + name); 341 column = new Column(name, ColumnType.VARCHAR, table, table342 .getColumnCount(), true);346 column = new MutableColumn(name, ColumnType.VARCHAR, table, 347 table.getColumnCount(), true); 343 348 column.setNativeType(NATIVE_TYPE_ATTRIBUTE); 344 table.addColumn(column);349 ((MutableTable) table).addColumn(column); 345 350 } 346 351 columnValues.put(column, attr.getValue()); … … 360 365 } 361 366 // Add values for attributes 362 for (Entry< Column, String> entry : columnValues.entrySet()) {367 for (Entry<MutableColumn, String> entry : columnValues.entrySet()) { 363 368 rowData[entry.getKey().getColumnNumber()] = entry.getValue(); 364 369 } … … 373 378 // child tables can create relationship to it 374 379 parentKey = id; 375 parentKeyColumn = idColumn;380 parentKeyColumn = (MutableColumn) idColumn; 376 381 } 377 382 tableRows.add(rowData); … … 400 405 _log.info("Creating text content column for table: " 401 406 + table.getName()); 402 column = new Column(preferredColumnName + TEXT_CONTENT_TEMP_SUFFIX, 403 ColumnType.VARCHAR, table, table.getColumnCount(), true); 404 column.setNativeType(NATIVE_TYPE_TEXT); 405 table.addColumn(column); 407 MutableColumn c = new MutableColumn(preferredColumnName 408 + TEXT_CONTENT_TEMP_SUFFIX, ColumnType.VARCHAR, table, 409 table.getColumnCount(), true); 410 c.setNativeType(NATIVE_TYPE_TEXT); 411 ((MutableTable) table).addColumn(c); 412 column = c; 413 406 414 } 407 415 return column; 408 416 } 409 417 410 private Column getIdColumn( Table table) {418 private Column getIdColumn(MutableTable table) { 411 419 Column[] columns = table.getColumns(); 412 420 Column column = null; 413 421 for (Column col : columns) { 414 422 if (NATIVE_TYPE_PRIMARY_KEY.equals(col.getNativeType())) { 415 column = col;423 column = (MutableColumn) col; 416 424 break; 417 425 } … … 420 428 String tableName = table.getName(); 421 429 _log.info("Creating id column for table: " + tableName); 422 column = new Column(tableName + "_metamodel_surrogate_id", 423 ColumnType.INTEGER, table, table.getColumnCount(), false); 424 column.setNativeType(NATIVE_TYPE_PRIMARY_KEY); 425 column.setIndexed(true); 426 table.addColumn(column); 430 MutableColumn c = new MutableColumn(tableName 431 + "_mdbeans_surrogate_id", ColumnType.INTEGER, table, table 432 .getColumnCount(), false); 433 c.setNativeType(NATIVE_TYPE_PRIMARY_KEY); 434 c.setIndexed(true); 435 table.addColumn(c); 436 column = c; 427 437 } 428 438 return column; … … 492 502 493 503 public XmlDataContextStrategy flattenTables(Relationship relationship) { 494 Table primaryTable = relationship.getPrimaryTable(); 495 Table foreignTable = relationship.getForeignTable(); 504 MutableTable primaryTable = (MutableTable) relationship 505 .getPrimaryTable(); 506 MutableTable foreignTable = (MutableTable) relationship 507 .getForeignTable(); 496 508 497 509 // Check that foreignTable is not primary table in other relationships … … 530 542 531 543 Query q = new Query(); 532 q.select(primaryColumns.toArray(new Column[primaryColumns.size()])); 533 q.select(foreignColumns.toArray(new Column[foreignColumns.size()])); 544 q.select(primaryColumns 545 .toArray(new MutableColumn[primaryColumns.size()])); 546 q.select(foreignColumns 547 .toArray(new MutableColumn[foreignColumns.size()])); 534 548 q.from(new FromItem(JoinType.LEFT, relationship)); 535 549 if (_log.isDebugEnabled()) { … … 540 554 541 555 for (Column foreignColumn : foreignColumns) { 542 Column newPrimaryColumn = new Column(foreignColumn.getName(),543 foreignColumn.getType(), primaryTable, primaryTable544 .getColumnCount(), foreignColumn.isNullable());556 MutableColumn newPrimaryColumn = new MutableColumn(foreignColumn 557 .getName(), foreignColumn.getType(), primaryTable, 558 primaryTable.getColumnCount(), foreignColumn.isNullable()); 545 559 newPrimaryColumn.setIndexed(foreignColumn.isIndexed()); 546 560 newPrimaryColumn.setNativeType(foreignColumn.getNativeType()); 547 primaryTable.addColumn(newPrimaryColumn);561 ((MutableTable) primaryTable).addColumn(newPrimaryColumn); 548 562 } 549 563 _tableData.put(primaryTableName, tableRows); 550 foreignTable.getSchema().removeTable(foreignTable);564 ((MutableSchema) foreignTable.getSchema()).removeTable(foreignTable); 551 565 _tableData.remove(foreignTableName); 552 relationship.remove();566 ImmutableRelationship.remove(relationship); 553 567 554 568 if (_log.isInfoEnabled()) {
Note: See TracChangeset
for help on using the changeset viewer.
