package xyz.anduo.kettle.utils; import org.pentaho.di.core.KettleEnvironment; import org.pentaho.di.core.database.DatabaseMeta; import org.pentaho.di.core.exception.KettleEOFException; import org.pentaho.di.core.exception.KettleException; import org.pentaho.di.repository.RepositoryDirectory; import org.pentaho.di.repository.RepositoryDirectoryInterface; import org.pentaho.di.repository.filerep.KettleFileRepository; import org.pentaho.di.repository.filerep.KettleFileRepositoryMeta; import org.pentaho.di.repository.kdr.KettleDatabaseRepository; import org.pentaho.di.repository.kdr.KettleDatabaseRepositoryMeta; import org.pentaho.di.trans.Trans; import org.pentaho.di.trans.TransMeta; /** * * @ClassName: KettleUtils * @Description: Kettle工具类 * @author anduo * @date 2015年1月22日 上午10:27:14 * */ public class KettleUtils { /** * @title initKettleFileRepository * @description 初始化一个kettle文件资源库 * @param dir * @return KettleFileRepository * @throws KettleException */ public static KettleFileRepository initFileRepository(String dir) throws KettleException { KettleFileRepository repository = null; // 初始化 KettleEnvironment.init(); // 资源库元对象 KettleFileRepositoryMeta repMeta = new KettleFileRepositoryMeta("", "", "数据采集", "file:///" + dir); // 文件形式的资源库 repository = new KettleFileRepository(); repository.init(repMeta); return repository; } public static KettleDatabaseRepository initDatabaseRepository(DbRepParams params) throws KettleException { KettleDatabaseRepository repository = null; // 初始化 KettleEnvironment.init(); DatabaseMeta databaseMeta = new DatabaseMeta(params.getName(), params.getType(), params.getAccess(), params.getHost(), params.getDb(), params.getPort(), params.getUser(), params.getPass()); KettleDatabaseRepositoryMeta repositoryMeta = new KettleDatabaseRepositoryMeta(); repositoryMeta.setConnection(databaseMeta); repository = new KettleDatabaseRepository(); repository.init(repositoryMeta); repository.connect(params.getUsername(), params.getPassword()); RepositoryDirectoryInterface dir = new RepositoryDirectory(); dir.setObjectId(repository.getRootDirectoryID()); return repository; } public static Trans executeTrans(String transname, Object rep) throws Exception { return executeTrans(transname, rep, true); } /** * @Title: executeTrans * @Description: 执行转换 * @param transname * @param rep * @throws Exception */ public static Trans executeTrans(String transname, Object rep, boolean isWaitUntilFinished) throws Exception { // 转换对象 Trans trans = null; if (transname != null && !"".equals(transname)) { TransMeta transMeta = null; if (rep instanceof KettleFileRepository) { KettleFileRepository repository = (KettleFileRepository) rep; transMeta = repository.loadTransformation(repository.getTransformationID(transname, null), null); } else if (rep instanceof KettleDatabaseRepository) { KettleDatabaseRepository repository = (KettleDatabaseRepository) rep; RepositoryDirectoryInterface dir = new RepositoryDirectory(); dir.setObjectId(repository.getRootDirectoryID()); transMeta = repository.loadTransformation(repository.getTransformationID(transname, dir), null); } // 转换 trans = new Trans(transMeta); // 执行转换 trans.execute(null); // 等待转换执行结束 if (isWaitUntilFinished) { trans.waitUntilFinished(); } // 抛出异常 if (trans.getErrors() > 0) { trans.stopAll(); throw new Exception("传输过程中发生异常"); } } else { throw new KettleEOFException("传输名为空!"); } return trans; } }