@Test
  public void testGetConnUrl() throws Exception {
    DataSourceDefine ds = new DataSourceDefine();
    ds.setDataSourceType(DataSourceType.H2);
    ds.setDbInstance("test");
    ds.setHostAndPort("127.0.0.1:3306");
    String connUrl =
        DataSourceType.H2.getPrefix()
            + ds.getHostAndPort()
            + DataSourceType.H2.getDiv()
            + ds.getDbInstance();
    Assert.assertEquals(connUrl, dsConnService.getDataSourceConnUrl(ds));

    ds.setDataSourceType(DataSourceType.MYSQL);
    ds.setDbInstance("test");
    ds.setHostAndPort("127.0.0.1:3306");
    ds.setEncoding("utf8");
    connUrl =
        DataSourceType.MYSQL.getPrefix()
            + ds.getHostAndPort()
            + DataSourceType.MYSQL.getDiv()
            + ds.getDbInstance()
            + "?useUniCode=true&characterEncoding="
            + ds.getEncoding();
    Assert.assertEquals(connUrl, dsConnService.getDataSourceConnUrl(ds));
  }
  @Test
  public void testParseToDataSourceInfo() throws Exception {
    // 数据库连接基本信息,并构建内存数据库H2
    String username = "******";
    String password = "******";
    String dbInstance = "testDB";
    String securityKey = "0000000000000000";
    String passwordEncrypt = AesUtil.getInstance().encryptAndUrlEncoding(password, securityKey);

    DataSourceDefine ds = new DataSourceDefine();
    DataSourceType.H2.setPrefix("jdbc:h2:mem://");
    ds.setDataSourceType(DataSourceType.H2);
    ds.setDbInstance(dbInstance);
    ds.setDbPwd(passwordEncrypt);
    ds.setDbUser(username);
    ds.setHostAndPort("127.0.0.1:3306");

    Assert.assertNotNull(dsConnService.parseToDataSourceInfo(ds, securityKey));

    ds.setDataSourceType(DataSourceType.MYSQL);
    ds.setDbInstance(dbInstance);
    ds.setDbPwd(passwordEncrypt);
    ds.setDbUser(username);
    ds.setHostAndPort("127.0.0.1:3306");

    Assert.assertNotNull(dsConnService.parseToDataSourceInfo(ds, securityKey));

    ds.setDataSourceType(DataSourceType.ORACLE);
    ds.setDbInstance(dbInstance);
    ds.setDbPwd(passwordEncrypt);
    ds.setDbUser(username);
    ds.setHostAndPort("127.0.0.1:3306");

    Assert.assertNotNull(dsConnService.parseToDataSourceInfo(ds, securityKey));

    ds.setDataSourceType(DataSourceType.TXT);
    ds.setDbInstance(dbInstance);
    ds.setDbPwd(passwordEncrypt);
    ds.setDbUser(username);
    ds.setHostAndPort("127.0.0.1:3306");

    Assert.assertNotNull(dsConnService.parseToDataSourceInfo(ds, securityKey));
    // 设置正确的数据库前缀
    DataSourceType.H2.setPrefix("jdbc:h2:tcp://");
    DataSourceType.H2.setDriver("org.h2.Driver");
  }
  @Test
  public void test() throws Exception {
    // 数据库连接基本信息,并构建内存数据库H2
    String username = "******";
    String password = "******";
    String dbInstance = "testDB";
    String securityKey = "0000000000000000";
    String passwordEncrypt = AesUtil.getInstance().encryptAndUrlEncoding(password, securityKey);
    String url = "jdbc:h2:mem:" + dbInstance + ";";
    try {
      Class.forName("org.h2.Driver");
      Connection conn = DriverManager.getConnection(url, username, password);
      if (conn != null) {
        LOG.error("get H2 datasource by username:"******"jdbc:h2:mem://");
    ds.setDataSourceType(DataSourceType.H2);
    ds.setDbInstance(dbInstance);
    ds.setDbPwd(passwordEncrypt);
    ds.setDbUser(username);
    ds.setHostAndPort("127.0.0.1:3306");
    // 测试打开和关闭连接
    Connection conn = dsConnService.createConnection(ds, securityKey);
    Assert.assertNotNull(conn);
    Assert.assertTrue(dsConnService.closeConnection(conn));

    try {
      dsConnService.getDataSourceConnUrl(null);
    } catch (DataSourceConnectionException e) {
      Assert.assertNotNull(e);
    }

    String connUrl =
        DataSourceType.H2.getPrefix()
            + ds.getHostAndPort()
            + DataSourceType.H2.getDiv()
            + ds.getDbInstance();
    Assert.assertEquals(connUrl, dsConnService.getDataSourceConnUrl(ds));

    // 测试数据源连接是否有效
    Assert.assertTrue(dsConnService.isValidateDataSource(ds, securityKey));
    DataSourceType.H2.setDriver("this is not database driver");
    ds.setDataSourceType(DataSourceType.H2);
    Assert.assertFalse(dsConnService.isValidateDataSource(ds, securityKey));
    // 设置正确的数据库前缀
    DataSourceType.H2.setPrefix("jdbc:h2:tcp://");
    DataSourceType.H2.setDriver("org.h2.Driver");
  }
  /**
   * {@inheritDoc}
   *
   * @throws DataSourceOperationException
   */
  @Override
  public boolean publishReport(ReportDesignModel model, String securityKey)
      throws ReportModelOperationException, DataSourceOperationException {

    boolean result = false;
    String devReportLocation = this.generateDevReportLocation(model);
    String realeaseLocation = this.getReleaseReportLocation(model);
    try {
      // 删除原来已经发布的报表,如果不存在,忽略此处异常
      ReportDesignModel tmp = this.getModelByIdOrName(model.getId(), true);
      if (tmp != null) {
        try {
          fileService.rm(getReleaseReportLocation(tmp));
        } catch (Exception e) {
          fileService.rm(getOriReleaseReportLocation(tmp));
        }
      }
    } catch (FileServiceException e1) {
      logger.info(e1.getMessage(), e1);
    }
    try {
      result = this.fileService.copy(devReportLocation, realeaseLocation);
    } catch (FileServiceException e) {
      logger.error(e.getMessage(), e);
      throw new ReportModelOperationException("发布报表失败!");
    }
    if (!result) {
      logger.error("拷贝报表失败!");
      throw new ReportModelOperationException("发布报表失败!");
    }
    /** 发布 */
    DataSourceDefine dsDefine;
    DataSourceInfo dsInfo;
    try {
      dsDefine = dsService.getDsDefine(model.getDsId());
      DataSourceConnectionService<?> dsConnService =
          DataSourceConnectionServiceFactory.getDataSourceConnectionServiceInstance(
              dsDefine.getDataSourceType().name());
      dsInfo = dsConnService.parseToDataSourceInfo(dsDefine, securityKey);
    } catch (DataSourceOperationException e) {
      logger.error("Fail in Finding datasource define. ", e);
      throw e;
    } catch (DataSourceConnectionException e) {
      logger.error("Fail in parse datasource to datasourceInfo.", e);
      throw new DataSourceOperationException(e);
    }
    List<Cube> cubes = Lists.newArrayList();
    for (ExtendArea area : model.getExtendAreaList()) {
      try {
        if ((area.getType() != ExtendAreaType.TABLE
                && area.getType() != ExtendAreaType.LITEOLAP_TABLE
                && area.getType() != ExtendAreaType.CHART
                && area.getType() != ExtendAreaType.LITEOLAP_CHART)
            || area.getType() == ExtendAreaType.PLANE_TABLE
            || QueryUtils.isFilterArea(area.getType())) {
          continue;
        }
        Cube cube = QueryUtils.getCubeWithExtendArea(model, area);
        cubes.add(cube);
      } catch (QueryModelBuildException e) {
        logger.warn("It seems that logicmodel of area is null. Ingore this area. ");
        continue;
      }
    }
    if (cubes.size() == 0) {
      logger.info("cube is empty, don't need to create index!");
      return true;
    }
    new Thread() {
      public void run() {
        MiniCubeConnection connection = MiniCubeDriverManager.getConnection(dsInfo);
        connection.publishCubes(cubes, dsInfo);
      }
    }.start();
    return true;
  }