示例#1
0
文件: DataDiff.java 项目: digoal/metl
  protected void createDatabase() {
    if (databasePlatform == null) {
      ResettableBasicDataSource ds = new ResettableBasicDataSource();
      ds.setDriverClassName(Driver.class.getName());
      ds.setMaxActive(1);
      ds.setInitialSize(1);
      ds.setMinIdle(1);
      ds.setMaxIdle(1);
      databaseName = UUID.randomUUID().toString();
      if (inMemoryCompare) {
        ds.setUrl("jdbc:h2:mem:" + databaseName);
      } else {
        ds.setUrl("jdbc:h2:file:./" + databaseName);
      }
      databasePlatform =
          JdbcDatabasePlatformFactory.createNewPlatformInstance(
              ds, new SqlTemplateSettings(), true, false);

      Model inputModel = context.getFlowStep().getComponent().getInputModel();
      List<ModelEntity> entities = inputModel.getModelEntities();
      for (ModelEntity entity : entities) {
        Table table = new Table();
        table.setName(entity.getName() + "_1");
        List<ModelAttribute> attributes = entity.getModelAttributes();
        for (ModelAttribute attribute : attributes) {
          DataType dataType = attribute.getDataType();
          Column column = new Column(attribute.getName());
          if (dataType.isNumeric()) {
            column.setTypeCode(Types.DECIMAL);
          } else if (dataType.isBoolean()) {
            column.setTypeCode(Types.BOOLEAN);
          } else if (dataType.isTimestamp()) {
            column.setTypeCode(Types.TIMESTAMP);
          } else if (dataType.isBinary()) {
            column.setTypeCode(Types.BLOB);
          } else {
            column.setTypeCode(Types.LONGVARCHAR);
          }

          column.setPrimaryKey(attribute.isPk());
          table.addColumn(column);
        }
        alterCaseToMatchLogicalCase(table);
        databasePlatform.createTables(false, false, table);

        table.setName(entity.getName().toUpperCase() + "_2");
        databasePlatform.createTables(false, false, table);
      }

      log(LogLevel.INFO, "Creating databasePlatform with the following url: %s", ds.getUrl());
    }
  }
  public static Table nextTable(XmlPullParser parser, String catalog, String schema) {
    try {
      Table table = null;
      ForeignKey fk = null;
      IIndex index = null;
      boolean done = false;
      int eventType = parser.getEventType();
      while (eventType != XmlPullParser.END_DOCUMENT && !done) {
        switch (eventType) {
          case XmlPullParser.START_TAG:
            String name = parser.getName();
            if (name.equalsIgnoreCase("table")) {
              table = new Table();
              table.setCatalog(catalog);
              table.setSchema(schema);
              for (int i = 0; i < parser.getAttributeCount(); i++) {
                String attributeName = parser.getAttributeName(i);
                String attributeValue = parser.getAttributeValue(i);
                if (attributeName.equalsIgnoreCase("name")) {
                  table.setName(attributeValue);
                } else if (attributeName.equalsIgnoreCase("description")) {
                  table.setDescription(attributeValue);
                }
              }
            } else if (name.equalsIgnoreCase("column")) {
              Column column = new Column();
              for (int i = 0; i < parser.getAttributeCount(); i++) {
                String attributeName = parser.getAttributeName(i);
                String attributeValue = parser.getAttributeValue(i);
                if (attributeName.equalsIgnoreCase("name")) {
                  column.setName(attributeValue);
                } else if (attributeName.equalsIgnoreCase("primaryKey")) {
                  column.setPrimaryKey(FormatUtils.toBoolean(attributeValue));
                } else if (attributeName.equalsIgnoreCase("required")) {
                  column.setRequired(FormatUtils.toBoolean(attributeValue));
                } else if (attributeName.equalsIgnoreCase("type")) {
                  column.setMappedType(attributeValue);
                } else if (attributeName.equalsIgnoreCase("size")) {
                  column.setSize(attributeValue);
                } else if (attributeName.equalsIgnoreCase("default")) {
                  if (StringUtils.isNotBlank(attributeValue)) {
                    column.setDefaultValue(attributeValue);
                  }
                } else if (attributeName.equalsIgnoreCase("autoIncrement")) {
                  column.setAutoIncrement(FormatUtils.toBoolean(attributeValue));
                } else if (attributeName.equalsIgnoreCase("javaName")) {
                  column.setJavaName(attributeValue);
                } else if (attributeName.equalsIgnoreCase("description")) {
                  column.setDescription(attributeValue);
                }
              }
              if (table != null) {
                table.addColumn(column);
              }
            } else if (name.equalsIgnoreCase("platform-column")) {
              PlatformColumn platformColumn = new PlatformColumn();
              for (int i = 0; i < parser.getAttributeCount(); i++) {
                String attributeName = parser.getAttributeName(i);
                String attributeValue = parser.getAttributeValue(i);
                if (attributeName.equalsIgnoreCase("name")) {
                  platformColumn.setName(attributeValue);
                } else if (attributeName.equalsIgnoreCase("type")) {
                  platformColumn.setType(attributeValue);
                } else if (attributeName.equalsIgnoreCase("default")) {
                  platformColumn.setDefaultValue(attributeValue);
                } else if (attributeName.equalsIgnoreCase("size")) {
                  if (isNotBlank(attributeValue)) {
                    platformColumn.setSize(Integer.parseInt(attributeValue));
                  }
                } else if (attributeName.equalsIgnoreCase("decimalDigits")) {
                  if (isNotBlank(attributeValue)) {
                    platformColumn.setDecimalDigits(Integer.parseInt(attributeValue));
                  }
                }
              }
              if (table != null && table.getColumnCount() > 0) {
                table.getColumn(table.getColumnCount() - 1).addPlatformColumn(platformColumn);
              }
            } else if (name.equalsIgnoreCase("foreign-key")) {
              fk = new ForeignKey();
              for (int i = 0; i < parser.getAttributeCount(); i++) {
                String attributeName = parser.getAttributeName(i);
                String attributeValue = parser.getAttributeValue(i);
                if (attributeName.equalsIgnoreCase("name")) {
                  fk.setName(attributeValue);
                } else if (attributeName.equalsIgnoreCase("foreignTable")) {
                  fk.setForeignTableName(attributeValue);
                }
              }
              table.addForeignKey(fk);
            } else if (name.equalsIgnoreCase("reference")) {
              Reference ref = new Reference();
              for (int i = 0; i < parser.getAttributeCount(); i++) {
                String attributeName = parser.getAttributeName(i);
                String attributeValue = parser.getAttributeValue(i);
                if (attributeName.equalsIgnoreCase("local")) {
                  ref.setLocalColumnName(attributeValue);
                } else if (attributeName.equalsIgnoreCase("foreign")) {
                  ref.setForeignColumnName(attributeValue);
                }
              }
              fk.addReference(ref);
            } else if (name.equalsIgnoreCase("index") || name.equalsIgnoreCase("unique")) {
              if (name.equalsIgnoreCase("index")) {
                index = new NonUniqueIndex();
              } else {
                index = new UniqueIndex();
              }
              for (int i = 0; i < parser.getAttributeCount(); i++) {
                String attributeName = parser.getAttributeName(i);
                String attributeValue = parser.getAttributeValue(i);
                if (attributeName.equalsIgnoreCase("name")) {
                  index.setName(attributeValue);
                }
              }
              table.addIndex(index);
            } else if (name.equalsIgnoreCase("index-column")
                || name.equalsIgnoreCase("unique-column")) {
              IndexColumn indexColumn = new IndexColumn();
              for (int i = 0; i < parser.getAttributeCount(); i++) {
                String attributeName = parser.getAttributeName(i);
                String attributeValue = parser.getAttributeValue(i);
                if (attributeName.equalsIgnoreCase("name")) {
                  indexColumn.setName(attributeValue);
                } else if (attributeName.equalsIgnoreCase("size")) {
                  indexColumn.setSize(attributeValue);
                }
              }

              indexColumn.setColumn(table.getColumnWithName(indexColumn.getName()));
              if (index != null) {
                index.addColumn(indexColumn);
              }
            }
            break;
          case XmlPullParser.END_TAG:
            name = parser.getName();
            if (name.equalsIgnoreCase("table")) {
              done = true;
            } else if (name.equalsIgnoreCase("index") || name.equalsIgnoreCase("unique")) {
              index = null;
            } else if (name.equalsIgnoreCase("table")) {
              table = null;
            } else if (name.equalsIgnoreCase("foreign-key")) {
              fk = null;
            }
            break;
        }

        if (!done) {
          eventType = parser.next();
        }
      }

      return table;
    } catch (XmlPullParserException e) {
      throw new IoException(e);
    } catch (IOException e) {
      throw new IoException(e);
    }
  }