Java tutorial
/*! * Copyright 2010 - 2016 Pentaho Corporation. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ package org.pentaho.di.repository; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import java.util.ArrayList; import java.util.Arrays; import java.util.Calendar; import java.util.Collections; import java.util.Date; import java.util.EnumSet; import java.util.List; import java.util.Stack; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.junit.Ignore; import org.junit.Test; import org.pentaho.di.cluster.ClusterSchema; import org.pentaho.di.cluster.SlaveServer; import org.pentaho.di.core.CheckResultInterface; import org.pentaho.di.core.Condition; import org.pentaho.di.core.NotePadMeta; import org.pentaho.di.core.Result; import org.pentaho.di.core.annotations.JobEntry; import org.pentaho.di.core.annotations.Step; import org.pentaho.di.core.database.DatabaseMeta; import org.pentaho.di.core.exception.KettleException; import org.pentaho.di.core.exception.KettleXMLException; import org.pentaho.di.core.logging.ChannelLogTable; import org.pentaho.di.core.logging.JobEntryLogTable; import org.pentaho.di.core.logging.JobLogTable; import org.pentaho.di.core.logging.PerformanceLogTable; import org.pentaho.di.core.logging.StepLogTable; import org.pentaho.di.core.logging.TransLogTable; import org.pentaho.di.core.row.RowMetaInterface; import org.pentaho.di.core.variables.VariableSpace; import org.pentaho.di.job.JobHopMeta; import org.pentaho.di.job.JobMeta; import org.pentaho.di.job.entry.JobEntryBase; import org.pentaho.di.job.entry.JobEntryCopy; import org.pentaho.di.job.entry.JobEntryInterface; import org.pentaho.di.partition.PartitionSchema; import org.pentaho.di.repository.ObjectRecipient.Type; import org.pentaho.di.repository.pur.model.ObjectAce; import org.pentaho.di.repository.pur.model.ObjectAcl; import org.pentaho.di.repository.pur.model.RepositoryObjectAce; import org.pentaho.di.repository.pur.model.RepositoryObjectRecipient; import org.pentaho.di.trans.SlaveStepCopyPartitionDistribution; import org.pentaho.di.trans.Trans; import org.pentaho.di.trans.TransDependency; import org.pentaho.di.trans.TransHopMeta; import org.pentaho.di.trans.TransMeta; import org.pentaho.di.trans.step.BaseStepMeta; import org.pentaho.di.trans.step.StepDataInterface; import org.pentaho.di.trans.step.StepErrorMeta; import org.pentaho.di.trans.step.StepInterface; import org.pentaho.di.trans.step.StepMeta; import org.pentaho.di.trans.step.StepMetaInterface; import org.pentaho.di.trans.steps.tableinput.TableInputMeta; import org.pentaho.di.ui.repository.pur.services.IAclService; import org.pentaho.di.ui.repository.pur.services.ILockService; import org.pentaho.di.ui.repository.pur.services.IRevisionService; import org.pentaho.metastore.api.IMetaStore; import org.pentaho.platform.api.repository2.unified.RepositoryFilePermission; import org.w3c.dom.Node; public abstract class RepositoryTestBase extends RepositoryTestLazySupport { // ~ Static fields/initializers ====================================================================================== protected static final String EXP_USERNAME = "Apache Tomcat"; protected static final String EXP_LOGIN = "admin"; protected static final String EXP_TENANT = "acme"; protected static final String EXP_LOGIN_PLUS_TENANT = EXP_LOGIN + "-/pentaho/" + EXP_TENANT; protected static final String VERSION_COMMENT_V1 = "hello"; protected static final String VERSION_LABEL_V1 = "1.0"; protected static final Log logger = LogFactory.getLog(RepositoryTestBase.class); protected static final String DIR_CONNECTIONS = "connections"; protected static final String DIR_SCHEMAS = "schemas"; protected static final String DIR_SLAVES = "slaves"; protected static final String DIR_CLUSTERS = "clusters"; protected static final String DIR_TRANSFORMATIONS = "transformations"; protected static final String DIR_JOBS = "jobs"; protected static final String DIR_TMP = "tmp"; protected static final String EXP_JOB_NAME = "job1"; protected static final String EXP_JOB_DESC = "jobDesc"; protected static final String EXP_JOB_EXTENDED_DESC = "jobExtDesc"; protected static final String EXP_JOB_VERSION = "anything"; protected static final int EXP_JOB_STATUS = 12; protected static final String EXP_JOB_CREATED_USER = "jerry"; protected static final Date EXP_JOB_CREATED_DATE = new Date(); protected static final String EXP_JOB_MOD_USER = "george"; protected static final Date EXP_JOB_MOD_DATE = new Date(); protected static final String EXP_JOB_PARAM_1_DESC = "param1desc"; protected static final String EXP_JOB_PARAM_1_NAME = "param1"; protected static final String EXP_JOB_PARAM_1_DEF = "param1default"; protected static final String EXP_JOB_LOG_TABLE_INTERVAL = "15"; protected static final String EXP_JOB_LOG_TABLE_CONN_NAME = "connName"; protected static final String EXP_JOB_LOG_TABLE_SCHEMA_NAME = "schemaName"; protected static final String EXP_JOB_LOG_TABLE_TABLE_NAME = "tableName"; protected static final String EXP_JOB_LOG_TABLE_TIMEOUT_IN_DAYS = "2"; protected static final String EXP_JOB_LOG_TABLE_SIZE_LIMIT = "250"; protected static final boolean EXP_JOB_BATCH_ID_PASSED = true; protected static final String EXP_JOB_SHARED_OBJECTS_FILE = ".kettle/whatever"; protected static final String EXP_JOB_ENTRY_1_NAME = "createFile"; protected static final String EXP_JOB_ENTRY_1_FILENAME = "/tmp/whatever"; protected static final String EXP_JOB_ENTRY_2_NAME = "deleteFile"; protected static final String EXP_JOB_ENTRY_2_FILENAME = "/tmp/whatever"; protected static final int EXP_JOB_ENTRY_1_COPY_X_LOC = 10; protected static final int EXP_JOB_ENTRY_1_COPY_Y_LOC = 10; protected static final int EXP_JOB_ENTRY_2_COPY_X_LOC = 75; protected static final int EXP_JOB_ENTRY_2_COPY_Y_LOC = 10; protected static final int EXP_NOTEPAD_X = 10; protected static final String EXP_NOTEPAD_NOTE = "blah"; protected static final int EXP_NOTEPAD_Y = 200; protected static final int EXP_NOTEPAD_WIDTH = 50; protected static final int EXP_NOTEPAD_HEIGHT = 25; protected static final String EXP_DBMETA_NAME = "haha"; protected static final String EXP_DBMETA_HOSTNAME = "acme"; protected static final String EXP_DBMETA_TYPE = "ORACLE"; protected static final int EXP_DBMETA_ACCESS = DatabaseMeta.TYPE_ACCESS_NATIVE; protected static final String EXP_DBMETA_DBNAME = "lksjdf"; protected static final String EXP_DBMETA_PORT = "10521"; protected static final String EXP_DBMETA_USERNAME = "elaine"; protected static final String EXP_DBMETA_PASSWORD = "password"; protected static final String EXP_DBMETA_SERVERNAME = "serverName"; protected static final String EXP_DBMETA_DATA_TABLESPACE = "dataTablespace"; protected static final String EXP_DBMETA_INDEX_TABLESPACE = "indexTablespace"; protected static final String EXP_SLAVE_NAME = "slave54545"; protected static final String EXP_SLAVE_HOSTNAME = "slave98745"; protected static final String EXP_SLAVE_PORT = "11111"; protected static final String EXP_SLAVE_USERNAME = "cosmo"; protected static final String EXP_SLAVE_PASSWORD = "password"; protected static final String EXP_SLAVE_PROXY_HOSTNAME = "proxySlave542254"; protected static final String EXP_SLAVE_PROXY_PORT = "11112"; protected static final String EXP_SLAVE_NON_PROXY_HOSTS = "ljksdflsdf"; protected static final boolean EXP_SLAVE_MASTER = true; protected static final String EXP_SLAVE_HOSTNAME_V2 = "slave98561111"; protected static final String EXP_DBMETA_HOSTNAME_V2 = "acme98734"; protected static final String VERSION_COMMENT_V2 = "v2 blah blah blah"; protected static final String EXP_JOB_DESC_V2 = "jobDesc0368"; protected static final String EXP_TRANS_NAME = "transMeta"; protected static final String EXP_TRANS_DESC = "transMetaDesc"; protected static final String EXP_TRANS_EXTENDED_DESC = "transMetaExtDesc"; protected static final String EXP_TRANS_VERSION = "2.0"; protected static final int EXP_TRANS_STATUS = 2; protected static final String EXP_TRANS_PARAM_1_DESC = "transParam1Desc"; protected static final String EXP_TRANS_PARAM_1_DEF = "transParam1Def"; protected static final String EXP_TRANS_PARAM_1_NAME = "transParamName"; protected static final String EXP_TRANS_CREATED_USER = "newman"; protected static final Date EXP_TRANS_CREATED_DATE = new Date(); protected static final String EXP_TRANS_MOD_USER = "banya"; protected static final Date EXP_TRANS_MOD_DATE = new Date(); protected static final String EXP_TRANS_LOG_TABLE_CONN_NAME = "transLogTableConnName"; protected static final String EXP_TRANS_LOG_TABLE_INTERVAL = "34"; protected static final String EXP_TRANS_LOG_TABLE_SCHEMA_NAME = "transLogTableSchemaName"; protected static final String EXP_TRANS_LOG_TABLE_SIZE_LIMIT = "600"; protected static final String EXP_TRANS_LOG_TABLE_TABLE_NAME = "transLogTableTableName"; protected static final String EXP_TRANS_LOG_TABLE_TIMEOUT_IN_DAYS = "5"; protected static final String EXP_TRANS_MAX_DATE_TABLE = "transMaxDateTable"; protected static final String EXP_TRANS_MAX_DATE_FIELD = "transMaxDateField"; protected static final double EXP_TRANS_MAX_DATE_OFFSET = 55; protected static final double EXP_TRANS_MAX_DATE_DIFF = 70; protected static final int EXP_TRANS_SIZE_ROWSET = 833; protected static final int EXP_TRANS_SLEEP_TIME_EMPTY = 4; protected static final int EXP_TRANS_SLEEP_TIME_FULL = 9; protected static final boolean EXP_TRANS_USING_UNIQUE_CONN = true; protected static final boolean EXP_TRANS_FEEDBACK_SHOWN = true; protected static final int EXP_TRANS_FEEDBACK_SIZE = 222; protected static final boolean EXP_TRANS_USING_THREAD_PRIORITY_MGMT = true; protected static final String EXP_TRANS_SHARED_OBJECTS_FILE = "transSharedObjectsFile"; protected static final boolean EXP_TRANS_CAPTURE_STEP_PERF_SNAPSHOTS = true; protected static final long EXP_TRANS_STEP_PERF_CAP_DELAY = 81; protected static final String EXP_TRANS_DEP_TABLE_NAME = "KLKJSDF"; protected static final String EXP_TRANS_DEP_FIELD_NAME = "lkjsdfflll11"; protected static final String EXP_PART_SCHEMA_NAME = "partitionSchemaName"; protected static final String EXP_PART_SCHEMA_PARTID_2 = "partitionSchemaId2"; protected static final boolean EXP_PART_SCHEMA_DYN_DEF = true; protected static final String EXP_PART_SCHEMA_PART_PER_SLAVE_COUNT = "562"; protected static final String EXP_PART_SCHEMA_PARTID_1 = "partitionSchemaId1"; protected static final String EXP_PART_SCHEMA_DESC = "partitionSchemaDesc"; protected static final String EXP_PART_SCHEMA_PART_PER_SLAVE_COUNT_V2 = "563"; protected static final String EXP_CLUSTER_SCHEMA_NAME = "clusterSchemaName"; protected static final String EXP_CLUSTER_SCHEMA_SOCKETS_BUFFER_SIZE = "2048"; protected static final String EXP_CLUSTER_SCHEMA_BASE_PORT = "12456"; protected static final String EXP_CLUSTER_SCHEMA_SOCKETS_FLUSH_INTERVAL = "1500"; protected static final boolean EXP_CLUSTER_SCHEMA_SOCKETS_COMPRESSED = true; protected static final boolean EXP_CLUSTER_SCHEMA_DYN = true; protected static final String EXP_CLUSTER_SCHEMA_BASE_PORT_V2 = "12457"; protected static final String EXP_TRANS_STEP_1_NAME = "transStep1"; protected static final String EXP_TRANS_STEP_2_NAME = "transStep2"; protected static final boolean EXP_TRANS_STEP_ERROR_META_1_ENABLED = true; protected static final String EXP_TRANS_STEP_ERROR_META_1_NR_ERRORS_VALUE_NAME = "ihwefmcd"; protected static final String EXP_TRANS_STEP_ERROR_META_1_DESC_VALUE_NAME = "lxeslsdff"; protected static final String EXP_TRANS_STEP_ERROR_META_1_FIELDS_VALUE_NAME = "uiwcm"; protected static final String EXP_TRANS_STEP_ERROR_META_1_CODES_VALUE_NAME = "wedsse"; protected static final String EXP_TRANS_STEP_ERROR_META_1_MAX_ERRORS = "2000"; protected static final String EXP_TRANS_STEP_ERROR_META_1_MAX_PERCENT_ERRORS = "29"; protected static final String EXP_TRANS_STEP_ERROR_META_1_MIN_PERCENT_ROWS = "12"; protected static final boolean EXP_TRANS_SLAVE_TRANSFORMATION = true; protected static final String EXP_TRANS_DESC_V2 = "transMetaDesc2"; protected static final String EXP_TRANS_LOCK_MSG = "98u344jerfnsdmklfe"; protected static final String EXP_JOB_LOCK_MSG = "ihesfdnmsdm348iesdm"; protected static final String DIR_TMP2_NEW_NAME = "tmp2_new"; protected static final String DIR_TMP2 = "tmp2"; protected static final String EXP_JOB_NAME_NEW = "job98u34u5"; protected static final String EXP_TRANS_NAME_NEW = "trans98jksdf32"; protected static final String EXP_DBMETA_NAME_NEW = "database983kdaerer"; private static final String EXP_DBMETA_ATTR1_VALUE = "LKJSDFKDSJKF"; private static final String EXP_DBMETA_ATTR1_KEY = "IOWUEIOUEWR"; private static final String EXP_DBMETA_ATTR2_KEY = "XDKDSDF"; private static final String EXP_DBMETA_ATTR2_VALUE = "POYIUPOUI"; private static final String EXP_DBMETA2_NAME = "abc_db2"; private static final String EXP_DBMETA_NAME_STEP = "khdfsghk438"; private static final String EXP_DBMETA_NAME_JOB = "KLJSDFJKL2"; // ~ Instance fields ================================================================================================= protected RepositoryMeta repositoryMeta; protected Repository repository; protected UserInfo userInfo; // necessary to delete in the correct order to avoid referential integrity problems protected Stack<RepositoryElementInterface> deleteStack; // ~ Constructors ==================================================================================================== public RepositoryTestBase(Boolean lazyRepo) { super(lazyRepo); } // ~ Methods ========================================================================================================= public void setUp() throws Exception { deleteStack = new Stack<RepositoryElementInterface>(); } public void tearDown() throws Exception { while (!deleteStack.empty()) { delete(deleteStack.pop().getObjectId()); } } protected abstract void delete(ObjectId id); /** * getUserInfo() getVersion() getName() isConnected() getRepositoryMeta() getLog() */ @Test public void testVarious() throws Exception { // unfortunately UserInfo doesn't override equals() // for now, disable user checks, as a connection isn't made so no // user info is available // UserInfo userInfo = repository.getUserInfo(); // assertEquals(EXP_LOGIN, userInfo.getName()); // assertEquals("password", userInfo.getPassword()); // assertEquals(EXP_USERNAME, userInfo.getUsername()); // assertEquals("Apache Tomcat user", userInfo.getDescription()); // assertTrue(userInfo.isEnabled()); assertEquals(VERSION_LABEL_V1, repository.getVersion()); assertEquals("JackRabbit", repository.getName()); assertTrue(repository.isConnected()); RepositoryMeta repoMeta = repository.getRepositoryMeta(); assertEquals("JackRabbit", repoMeta.getName()); assertEquals("JackRabbit test repository", repoMeta.getDescription()); RepositoryCapabilities caps = repoMeta.getRepositoryCapabilities(); assertTrue(caps.supportsUsers()); assertTrue(caps.managesUsers()); assertFalse(caps.isReadOnly()); assertTrue(caps.supportsRevisions()); assertTrue(caps.supportsMetadata()); assertTrue(caps.supportsLocking()); assertTrue(caps.hasVersionRegistry()); assertNotNull(repository.getLog()); } protected RepositoryDirectoryInterface initRepo() throws Exception { RepositoryDirectoryInterface startDir = loadStartDirectory(); repository.createRepositoryDirectory(startDir, DIR_CONNECTIONS); repository.createRepositoryDirectory(startDir, DIR_SCHEMAS); repository.createRepositoryDirectory(startDir, DIR_SLAVES); repository.createRepositoryDirectory(startDir, DIR_CLUSTERS); repository.createRepositoryDirectory(startDir, DIR_TRANSFORMATIONS); repository.createRepositoryDirectory(startDir, DIR_JOBS); return loadStartDirectory(); } /** * createRepositoryDirectory() loadRepositoryTree() deleteRepositoryDirectory() getDirectoryNames() * saveRepositoryDirectory() */ @Ignore @Test public void testDirectories() throws Exception { RepositoryDirectoryInterface startDir = loadStartDirectory(); RepositoryDirectoryInterface connDir = repository.createRepositoryDirectory(startDir, DIR_CONNECTIONS); assertNotNull(connDir); assertNotNull(connDir.getObjectId()); assertEquals(startDir.getPath() + (startDir.getPath().endsWith("/") ? "" : RepositoryDirectory.DIRECTORY_SEPARATOR) + DIR_CONNECTIONS, connDir.getPath()); repository.createRepositoryDirectory(startDir, DIR_SCHEMAS); repository.createRepositoryDirectory(startDir, DIR_SLAVES); repository.saveRepositoryDirectory(new RepositoryDirectory(startDir, DIR_CLUSTERS)); repository.createRepositoryDirectory(startDir, DIR_TRANSFORMATIONS); repository.createRepositoryDirectory(startDir, DIR_JOBS); startDir = loadStartDirectory(); assertNotNull(startDir.findDirectory(DIR_CONNECTIONS)); assertNotNull(startDir.findDirectory(DIR_SCHEMAS)); assertNotNull(startDir.findDirectory(DIR_SLAVES)); assertNotNull(startDir.findDirectory(DIR_CLUSTERS)); assertNotNull(startDir.findDirectory(DIR_TRANSFORMATIONS)); assertNotNull(startDir.findDirectory(DIR_JOBS)); RepositoryDirectoryInterface tmpDir = repository.createRepositoryDirectory(startDir, DIR_TMP); repository.deleteRepositoryDirectory(tmpDir); startDir = loadStartDirectory(); assertNull(startDir.findDirectory(DIR_TMP)); RepositoryDirectoryInterface moveTestDestDir = repository.createRepositoryDirectory(startDir, "moveTestDest"); assertNotNull(moveTestDestDir.getObjectId()); RepositoryDirectoryInterface moveTestSrcDir = repository.createRepositoryDirectory(startDir, "moveTestSrc"); assertNotNull(moveTestSrcDir.getObjectId()); // Rename and move the folder repository.renameRepositoryDirectory(moveTestSrcDir.getObjectId(), moveTestDestDir, "moveTestSrcNewName"); startDir = loadStartDirectory(); assertNull(startDir.findDirectory("moveTestSrc")); assertNotNull(startDir.findDirectory("moveTestDest/moveTestSrcNewName")); String[] dirs = repository.getDirectoryNames(startDir.getObjectId()); assertEquals(7, dirs.length); boolean foundDir = false; for (String dir : dirs) { if (dir.equals(DIR_CONNECTIONS)) { // spot check foundDir = true; break; } } assertTrue(foundDir); } protected RepositoryDirectoryInterface loadStartDirectory() throws Exception { return repository.loadRepositoryDirectoryTree(); } /** * save(job) loadJob() exists() deleteJob() getJobNames() getJobObjects() getJobId() getJobLock() lockJob() * unlockJob() */ @Ignore @Test public void testJobs() throws Exception { ILockService service = (ILockService) repository.getService(ILockService.class); RepositoryDirectoryInterface rootDir = initRepo(); JobMeta jobMeta = createJobMeta(EXP_JOB_NAME); RepositoryDirectoryInterface jobsDir = rootDir.findDirectory(DIR_JOBS); repository.save(jobMeta, VERSION_COMMENT_V1, null); deleteStack.push(jobMeta); assertNotNull(jobMeta.getObjectId()); ObjectRevision version = jobMeta.getObjectRevision(); assertNotNull(version); assertTrue(hasVersionWithComment(jobMeta, VERSION_COMMENT_V1)); assertTrue(repository.exists(EXP_JOB_NAME, jobsDir, RepositoryObjectType.JOB)); JobMeta fetchedJob = repository.loadJob(EXP_JOB_NAME, jobsDir, null, null); assertEquals(EXP_JOB_NAME, fetchedJob.getName()); assertEquals(EXP_JOB_DESC, fetchedJob.getDescription()); assertEquals(EXP_JOB_EXTENDED_DESC, fetchedJob.getExtendedDescription()); assertEquals(jobsDir.getPath(), fetchedJob.getRepositoryDirectory().getPath()); assertEquals(EXP_JOB_VERSION, fetchedJob.getJobversion()); assertEquals(EXP_JOB_STATUS, fetchedJob.getJobstatus()); assertEquals(EXP_JOB_CREATED_USER, fetchedJob.getCreatedUser()); assertEquals(EXP_JOB_CREATED_DATE, fetchedJob.getCreatedDate()); assertEquals(EXP_JOB_MOD_USER, fetchedJob.getModifiedUser()); assertEquals(EXP_JOB_MOD_DATE, fetchedJob.getModifiedDate()); assertEquals(1, fetchedJob.listParameters().length); assertEquals(EXP_JOB_PARAM_1_DEF, fetchedJob.getParameterDefault(EXP_JOB_PARAM_1_NAME)); assertEquals(EXP_JOB_PARAM_1_DESC, fetchedJob.getParameterDescription(EXP_JOB_PARAM_1_NAME)); // JobLogTable jobLogTable = fetchedJob.getJobLogTable(); // TODO mlowery why doesn't this work? // assertEquals(EXP_LOG_TABLE_CONN_NAME, jobLogTable.getConnectionName()); // assertEquals(EXP_JOB_LOG_TABLE_INTERVAL, jobLogTable.getLogInterval()); // assertEquals(EXP_LOG_TABLE_SCHEMA_NAME, jobLogTable.getSchemaName()); // assertEquals(EXP_LOG_TABLE_SIZE_LIMIT, jobLogTable.getLogSizeLimit()); // assertEquals(EXP_LOG_TABLE_TABLE_NAME, jobLogTable.getTableName()); // assertEquals(EXP_LOG_TABLE_TIMEOUT_IN_DAYS, jobLogTable.getTimeoutInDays()); // JobEntryLogTable jobEntryLogTable = fetchedJob.getJobEntryLogTable(); // TODO mlowery why doesn't this work? // assertEquals(EXP_LOG_TABLE_CONN_NAME, jobEntryLogTable.getConnectionName()); // assertEquals(EXP_LOG_TABLE_SCHEMA_NAME, jobEntryLogTable.getSchemaName()); // assertEquals(EXP_LOG_TABLE_TABLE_NAME, jobEntryLogTable.getTableName()); // assertEquals(EXP_LOG_TABLE_TIMEOUT_IN_DAYS, jobEntryLogTable.getTimeoutInDays()); // ChannelLogTable channelLogTable = fetchedJob.getChannelLogTable(); // TODO mlowery why doesn't this work? // assertEquals(EXP_LOG_TABLE_CONN_NAME, channelLogTable.getConnectionName()); // assertEquals(EXP_LOG_TABLE_SCHEMA_NAME, channelLogTable.getSchemaName()); // assertEquals(EXP_LOG_TABLE_TABLE_NAME, channelLogTable.getTableName()); // assertEquals(EXP_LOG_TABLE_TIMEOUT_IN_DAYS, channelLogTable.getTimeoutInDays()); assertEquals(EXP_JOB_BATCH_ID_PASSED, fetchedJob.isBatchIdPassed()); assertEquals(EXP_JOB_SHARED_OBJECTS_FILE, fetchedJob.getSharedObjectsFile()); assertEquals(2, fetchedJob.getJobCopies().size()); assertEquals("JobEntryAttributeTester", fetchedJob.getJobEntry(0).getEntry().getPluginId()); assertEquals(EXP_JOB_ENTRY_1_COPY_X_LOC, fetchedJob.getJobEntry(0).getLocation().x); assertEquals(EXP_JOB_ENTRY_1_COPY_Y_LOC, fetchedJob.getJobEntry(0).getLocation().y); assertEquals("JobEntryAttributeTester", fetchedJob.getJobEntry(1).getEntry().getPluginId()); assertEquals(EXP_JOB_ENTRY_2_COPY_X_LOC, fetchedJob.getJobEntry(1).getLocation().x); assertEquals(EXP_JOB_ENTRY_2_COPY_Y_LOC, fetchedJob.getJobEntry(1).getLocation().y); assertEquals(1, fetchedJob.getJobhops().size()); assertEquals(EXP_JOB_ENTRY_1_NAME, fetchedJob.getJobHop(0).getFromEntry().getEntry().getName()); assertEquals("JobEntryAttributeTester", fetchedJob.getJobHop(0).getFromEntry().getEntry().getPluginId()); assertEquals(EXP_JOB_ENTRY_2_NAME, fetchedJob.getJobHop(0).getToEntry().getEntry().getName()); assertEquals("JobEntryAttributeTester", fetchedJob.getJobHop(0).getToEntry().getEntry().getPluginId()); assertEquals(1, fetchedJob.getNotes().size()); assertTrue(fetchedJob.getNote(0).getNote().startsWith(EXP_NOTEPAD_NOTE)); assertEquals(EXP_NOTEPAD_X, fetchedJob.getNote(0).getLocation().x); assertEquals(EXP_NOTEPAD_Y, fetchedJob.getNote(0).getLocation().y); assertEquals(EXP_NOTEPAD_WIDTH, fetchedJob.getNote(0).getWidth()); assertEquals(EXP_NOTEPAD_HEIGHT, fetchedJob.getNote(0).getHeight()); JobMeta jobMetaById = repository.loadJob(jobMeta.getObjectId(), null); assertEquals(fetchedJob, jobMetaById); assertNull(service.getJobLock(jobMeta.getObjectId())); service.lockJob(jobMeta.getObjectId(), EXP_JOB_LOCK_MSG); assertEquals(EXP_JOB_LOCK_MSG, service.getJobLock(jobMeta.getObjectId()).getMessage()); assertEquals(getDate(new Date()), getDate(service.getJobLock(jobMeta.getObjectId()).getLockDate())); assertEquals(EXP_LOGIN_PLUS_TENANT, service.getJobLock(jobMeta.getObjectId()).getLogin()); // TODO mlowery currently PUR lock only stores "login"; why do we need username too? // assertEquals(EXP_USERNAME, repository.getJobLock(jobMeta.getObjectId()).getUsername()); assertEquals(jobMeta.getObjectId(), service.getJobLock(jobMeta.getObjectId()).getObjectId()); service.unlockJob(jobMeta.getObjectId()); assertNull(service.getJobLock(jobMeta.getObjectId())); jobMeta.setDescription(EXP_JOB_DESC_V2); repository.save(jobMeta, VERSION_COMMENT_V2, null); assertEquals(VERSION_COMMENT_V2, jobMeta.getObjectRevision().getComment()); fetchedJob = repository.loadJob(EXP_JOB_NAME, jobsDir, null, null); assertEquals(EXP_JOB_DESC_V2, fetchedJob.getDescription()); fetchedJob = repository.loadJob(EXP_JOB_NAME, jobsDir, null, VERSION_LABEL_V1); assertEquals(EXP_JOB_DESC, fetchedJob.getDescription()); jobMetaById = repository.loadJob(jobMeta.getObjectId(), VERSION_LABEL_V1); assertEquals(fetchedJob, jobMetaById); assertEquals(jobMeta.getObjectId(), repository.getJobId(EXP_JOB_NAME, jobsDir)); assertEquals(1, repository.getJobObjects(jobsDir.getObjectId(), false).size()); assertEquals(1, repository.getJobObjects(jobsDir.getObjectId(), true).size()); assertEquals(jobMeta.getName(), repository.getJobObjects(jobsDir.getObjectId(), false).get(0).getName()); assertEquals(1, repository.getJobNames(jobsDir.getObjectId(), false).length); assertEquals(1, repository.getJobNames(jobsDir.getObjectId(), true).length); assertEquals(jobMeta.getName(), repository.getJobNames(jobsDir.getObjectId(), false)[0]); repository.deleteJob(jobMeta.getObjectId()); assertFalse(repository.exists(EXP_JOB_NAME, jobsDir, RepositoryObjectType.JOB)); assertEquals(0, repository.getJobObjects(jobsDir.getObjectId(), false).size()); assertEquals(1, repository.getJobObjects(jobsDir.getObjectId(), true).size()); assertEquals(jobMeta.getName(), repository.getJobObjects(jobsDir.getObjectId(), true).get(0).getName()); assertEquals(0, repository.getJobNames(jobsDir.getObjectId(), false).length); assertEquals(1, repository.getJobNames(jobsDir.getObjectId(), true).length); assertEquals(jobMeta.getName(), repository.getJobNames(jobsDir.getObjectId(), true)[0]); } @SuppressWarnings("deprecation") private int getDate(Date date) { return date.getDate(); } protected JobMeta createJobMeta(String jobName) throws Exception { RepositoryDirectoryInterface rootDir = loadStartDirectory(); JobMeta jobMeta = new JobMeta(); jobMeta.setName(jobName); jobMeta.setDescription(EXP_JOB_DESC); jobMeta.setExtendedDescription(EXP_JOB_EXTENDED_DESC); jobMeta.setRepositoryDirectory(rootDir.findDirectory(DIR_JOBS)); jobMeta.setJobversion(EXP_JOB_VERSION); jobMeta.setJobstatus(EXP_JOB_STATUS); jobMeta.setCreatedUser(EXP_JOB_CREATED_USER); jobMeta.setCreatedDate(EXP_JOB_CREATED_DATE); jobMeta.setModifiedUser(EXP_JOB_MOD_USER); jobMeta.setModifiedDate(EXP_JOB_MOD_DATE); jobMeta.addParameterDefinition(EXP_JOB_PARAM_1_NAME, EXP_JOB_PARAM_1_DEF, EXP_JOB_PARAM_1_DESC); // TODO mlowery other jobLogTable fields could be set for testing here JobLogTable jobLogTable = JobLogTable.getDefault(jobMeta, jobMeta); jobLogTable.setConnectionName(EXP_JOB_LOG_TABLE_CONN_NAME); jobLogTable.setLogInterval(EXP_JOB_LOG_TABLE_INTERVAL); jobLogTable.setSchemaName(EXP_JOB_LOG_TABLE_SCHEMA_NAME); jobLogTable.setLogSizeLimit(EXP_JOB_LOG_TABLE_SIZE_LIMIT); jobLogTable.setTableName(EXP_JOB_LOG_TABLE_TABLE_NAME); jobLogTable.setTimeoutInDays(EXP_JOB_LOG_TABLE_TIMEOUT_IN_DAYS); jobMeta.setJobLogTable(jobLogTable); // TODO mlowery other jobEntryLogTable fields could be set for testing here JobEntryLogTable jobEntryLogTable = JobEntryLogTable.getDefault(jobMeta, jobMeta); jobEntryLogTable.setConnectionName(EXP_JOB_LOG_TABLE_CONN_NAME); jobEntryLogTable.setSchemaName(EXP_JOB_LOG_TABLE_SCHEMA_NAME); jobEntryLogTable.setTableName(EXP_JOB_LOG_TABLE_TABLE_NAME); jobEntryLogTable.setTimeoutInDays(EXP_JOB_LOG_TABLE_TIMEOUT_IN_DAYS); jobMeta.setJobEntryLogTable(jobEntryLogTable); // TODO mlowery other channelLogTable fields could be set for testing here ChannelLogTable channelLogTable = ChannelLogTable.getDefault(jobMeta, jobMeta); channelLogTable.setConnectionName(EXP_JOB_LOG_TABLE_CONN_NAME); channelLogTable.setSchemaName(EXP_JOB_LOG_TABLE_SCHEMA_NAME); channelLogTable.setTableName(EXP_JOB_LOG_TABLE_TABLE_NAME); channelLogTable.setTimeoutInDays(EXP_JOB_LOG_TABLE_TIMEOUT_IN_DAYS); jobMeta.setChannelLogTable(channelLogTable); jobMeta.setBatchIdPassed(EXP_JOB_BATCH_ID_PASSED); jobMeta.setSharedObjectsFile(EXP_JOB_SHARED_OBJECTS_FILE); DatabaseMeta entryDbMeta = createDatabaseMeta(EXP_DBMETA_NAME_JOB.concat(jobName)); repository.save(entryDbMeta, VERSION_COMMENT_V1, null); deleteStack.push(entryDbMeta); JobEntryCopy jobEntryCopy1 = createJobEntry1Copy(entryDbMeta); jobMeta.addJobEntry(jobEntryCopy1); JobEntryCopy jobEntryCopy2 = createJobEntry2Copy(entryDbMeta); jobMeta.addJobEntry(jobEntryCopy2); jobMeta.addJobHop(createJobHopMeta(jobEntryCopy1, jobEntryCopy2)); jobMeta.addNote(createNotePadMeta(jobName)); return jobMeta; } /** * save(trans) loadTransformation() exists() getTransformationLock() lockTransformation() unlockTransformation() * getTransformationID() getTransformationObjects() getTransformationNames() */ @Ignore @Test public void testTransformations() throws Exception { ILockService service = (ILockService) repository.getService(ILockService.class); RepositoryDirectoryInterface rootDir = initRepo(); String uniqueTransName = EXP_TRANS_NAME.concat(EXP_DBMETA_NAME); TransMeta transMeta = createTransMeta(EXP_DBMETA_NAME); // Create a database association DatabaseMeta dbMeta = createDatabaseMeta(EXP_DBMETA_NAME); repository.save(dbMeta, VERSION_COMMENT_V1, null); TableInputMeta tableInputMeta = new TableInputMeta(); tableInputMeta.setDatabaseMeta(dbMeta); transMeta.addStep(new StepMeta(EXP_TRANS_STEP_1_NAME, tableInputMeta)); RepositoryDirectoryInterface transDir = rootDir.findDirectory(DIR_TRANSFORMATIONS); repository.save(transMeta, VERSION_COMMENT_V1, null); deleteStack.push(transMeta); assertNotNull(transMeta.getObjectId()); ObjectRevision version = transMeta.getObjectRevision(); assertNotNull(version); assertTrue(hasVersionWithComment(transMeta, VERSION_COMMENT_V1)); assertTrue(repository.exists(uniqueTransName, transDir, RepositoryObjectType.TRANSFORMATION)); TransMeta fetchedTrans = repository.loadTransformation(uniqueTransName, transDir, null, false, null); assertEquals(uniqueTransName, fetchedTrans.getName()); assertEquals(EXP_TRANS_DESC, fetchedTrans.getDescription()); assertEquals(EXP_TRANS_EXTENDED_DESC, fetchedTrans.getExtendedDescription()); assertEquals(transDir.getPath(), fetchedTrans.getRepositoryDirectory().getPath()); assertEquals(EXP_TRANS_VERSION, fetchedTrans.getTransversion()); assertEquals(EXP_TRANS_STATUS, fetchedTrans.getTransstatus()); assertEquals(EXP_TRANS_CREATED_USER, fetchedTrans.getCreatedUser()); assertEquals(EXP_TRANS_CREATED_DATE, fetchedTrans.getCreatedDate()); assertEquals(EXP_TRANS_MOD_USER, fetchedTrans.getModifiedUser()); assertEquals(EXP_TRANS_MOD_DATE, fetchedTrans.getModifiedDate()); assertEquals(1, fetchedTrans.listParameters().length); assertEquals(EXP_TRANS_PARAM_1_DEF, fetchedTrans.getParameterDefault(EXP_TRANS_PARAM_1_NAME)); assertEquals(EXP_TRANS_PARAM_1_DESC, fetchedTrans.getParameterDescription(EXP_TRANS_PARAM_1_NAME)); // Test reference to database connection String[] transformations = repository.getTransformationsUsingDatabase(dbMeta.getObjectId()); assertNotNull(transformations); assertEquals(1, transformations.length); assertTrue(transformations[0].contains(fetchedTrans.getName())); // TransLogTable transLogTable = fetchedTrans.getTransLogTable(); // TODO mlowery why doesn't this work? // assertEquals(EXP_TRANS_LOG_TABLE_CONN_NAME, transLogTable.getConnectionName()); // assertEquals(EXP_TRANS_LOG_TABLE_INTERVAL, transLogTable.getLogInterval()); // assertEquals(EXP_TRANS_LOG_TABLE_SCHEMA_NAME, transLogTable.getSchemaName()); // assertEquals(EXP_TRANS_LOG_TABLE_SIZE_LIMIT, transLogTable.getLogSizeLimit()); // assertEquals(EXP_TRANS_LOG_TABLE_TABLE_NAME, transLogTable.getTableName()); // assertEquals(EXP_TRANS_LOG_TABLE_TIMEOUT_IN_DAYS, transLogTable.getTimeoutInDays()); // PerformanceLogTable perfLogTable = fetchedTrans.getPerformanceLogTable(); // TODO mlowery why doesn't this work? // assertEquals(EXP_TRANS_LOG_TABLE_CONN_NAME, perfLogTable.getConnectionName()); // assertEquals(EXP_TRANS_LOG_TABLE_INTERVAL, perfLogTable.getLogInterval()); // assertEquals(EXP_TRANS_LOG_TABLE_SCHEMA_NAME, perfLogTable.getSchemaName()); // assertEquals(EXP_TRANS_LOG_TABLE_TABLE_NAME, perfLogTable.getTableName()); // assertEquals(EXP_TRANS_LOG_TABLE_TIMEOUT_IN_DAYS, perfLogTable.getTimeoutInDays()); // ChannelLogTable channelLogTable = fetchedTrans.getChannelLogTable(); // TODO mlowery why doesn't this work? // assertEquals(EXP_TRANS_LOG_TABLE_CONN_NAME, channelLogTable.getConnectionName()); // assertEquals(EXP_TRANS_LOG_TABLE_SCHEMA_NAME, channelLogTable.getSchemaName()); // assertEquals(EXP_TRANS_LOG_TABLE_TABLE_NAME, channelLogTable.getTableName()); // assertEquals(EXP_TRANS_LOG_TABLE_TIMEOUT_IN_DAYS, channelLogTable.getTimeoutInDays()); // StepLogTable stepLogTable = fetchedTrans.getStepLogTable(); // TODO mlowery why doesn't this work? // assertEquals(EXP_TRANS_LOG_TABLE_CONN_NAME, stepLogTable.getConnectionName()); // assertEquals(EXP_TRANS_LOG_TABLE_SCHEMA_NAME, stepLogTable.getSchemaName()); // assertEquals(EXP_TRANS_LOG_TABLE_TABLE_NAME, stepLogTable.getTableName()); // assertEquals(EXP_TRANS_LOG_TABLE_TIMEOUT_IN_DAYS, stepLogTable.getTimeoutInDays()); assertEquals(EXP_DBMETA_NAME, fetchedTrans.getMaxDateConnection().getName()); assertEquals(EXP_TRANS_MAX_DATE_TABLE, fetchedTrans.getMaxDateTable()); assertEquals(EXP_TRANS_MAX_DATE_FIELD, fetchedTrans.getMaxDateField()); assertEquals(EXP_TRANS_MAX_DATE_OFFSET, fetchedTrans.getMaxDateOffset(), 0); assertEquals(EXP_TRANS_MAX_DATE_DIFF, fetchedTrans.getMaxDateDifference(), 0); assertEquals(EXP_TRANS_SIZE_ROWSET, fetchedTrans.getSizeRowset()); // TODO mlowery why don't next two sleep fields work? // assertEquals(EXP_TRANS_SLEEP_TIME_EMPTY, fetchedTrans.getSleepTimeEmpty()); // assertEquals(EXP_TRANS_SLEEP_TIME_FULL, fetchedTrans.getSleepTimeFull()); assertEquals(EXP_TRANS_USING_UNIQUE_CONN, fetchedTrans.isUsingUniqueConnections()); assertEquals(EXP_TRANS_FEEDBACK_SHOWN, fetchedTrans.isFeedbackShown()); assertEquals(EXP_TRANS_FEEDBACK_SIZE, fetchedTrans.getFeedbackSize()); assertEquals(EXP_TRANS_USING_THREAD_PRIORITY_MGMT, fetchedTrans.isUsingThreadPriorityManagment()); assertEquals(EXP_TRANS_SHARED_OBJECTS_FILE, fetchedTrans.getSharedObjectsFile()); assertEquals(EXP_TRANS_CAPTURE_STEP_PERF_SNAPSHOTS, fetchedTrans.isCapturingStepPerformanceSnapShots()); assertEquals(EXP_TRANS_STEP_PERF_CAP_DELAY, fetchedTrans.getStepPerformanceCapturingDelay()); // TODO mlowery why doesn't this work? // assertEquals(1, fetchedTrans.getDependencies().size()); // assertEquals(EXP_DBMETA_NAME, fetchedTrans.getDependency(0).getDatabase().getName()); // assertEquals(EXP_TRANS_DEP_TABLE_NAME, fetchedTrans.getDependency(0).getTablename()); // assertEquals(EXP_TRANS_DEP_FIELD_NAME, fetchedTrans.getDependency(0).getFieldname()); assertEquals(3, fetchedTrans.getSteps().size()); assertEquals(EXP_TRANS_STEP_1_NAME, fetchedTrans.getStep(0).getName()); assertEquals(EXP_TRANS_STEP_ERROR_META_1_ENABLED, fetchedTrans.getStep(0).getStepErrorMeta().isEnabled()); assertEquals(EXP_TRANS_STEP_ERROR_META_1_NR_ERRORS_VALUE_NAME, fetchedTrans.getStep(0).getStepErrorMeta().getNrErrorsValuename()); assertEquals(EXP_TRANS_STEP_ERROR_META_1_DESC_VALUE_NAME, fetchedTrans.getStep(0).getStepErrorMeta().getErrorDescriptionsValuename()); assertEquals(EXP_TRANS_STEP_ERROR_META_1_FIELDS_VALUE_NAME, fetchedTrans.getStep(0).getStepErrorMeta().getErrorFieldsValuename()); assertEquals(EXP_TRANS_STEP_ERROR_META_1_CODES_VALUE_NAME, fetchedTrans.getStep(0).getStepErrorMeta().getErrorCodesValuename()); assertEquals(EXP_TRANS_STEP_ERROR_META_1_MAX_ERRORS, fetchedTrans.getStep(0).getStepErrorMeta().getMaxErrors()); assertEquals(EXP_TRANS_STEP_ERROR_META_1_MAX_PERCENT_ERRORS, fetchedTrans.getStep(0).getStepErrorMeta().getMaxPercentErrors()); assertEquals(EXP_TRANS_STEP_ERROR_META_1_MIN_PERCENT_ROWS, fetchedTrans.getStep(0).getStepErrorMeta().getMinPercentRows()); assertEquals(EXP_TRANS_STEP_2_NAME, fetchedTrans.getStep(1).getName()); assertEquals(EXP_TRANS_STEP_1_NAME, fetchedTrans.getTransHop(0).getFromStep().getName()); assertEquals(EXP_TRANS_STEP_2_NAME, fetchedTrans.getTransHop(0).getToStep().getName()); assertEquals(1, transMeta.getSlaveStepCopyPartitionDistribution().getOriginalPartitionSchemas().size()); assertTrue(transMeta.getSlaveStepCopyPartitionDistribution().getOriginalPartitionSchemas().get(0).getName() .startsWith(EXP_PART_SCHEMA_NAME)); assertTrue(-1 != transMeta.getSlaveStepCopyPartitionDistribution().getPartition(EXP_SLAVE_NAME, EXP_PART_SCHEMA_NAME, 0)); assertEquals(EXP_TRANS_SLAVE_TRANSFORMATION, transMeta.isSlaveTransformation()); TransMeta transMetaById = repository.loadTransformation(transMeta.getObjectId(), null); assertEquals(fetchedTrans, transMetaById); assertNull(service.getTransformationLock(transMeta.getObjectId())); service.lockTransformation(transMeta.getObjectId(), EXP_TRANS_LOCK_MSG); assertEquals(EXP_TRANS_LOCK_MSG, service.getTransformationLock(transMeta.getObjectId()).getMessage()); assertEquals(getDate(new Date()), getDate(service.getTransformationLock(transMeta.getObjectId()).getLockDate())); assertEquals(EXP_LOGIN_PLUS_TENANT, service.getTransformationLock(transMeta.getObjectId()).getLogin()); // TODO mlowery currently PUR lock only stores "login"; why do we need username too? // assertEquals(EXP_USERNAME, repository.getTransformationLock(transMeta.getObjectId()).getUsername()); assertEquals(transMeta.getObjectId(), service.getTransformationLock(transMeta.getObjectId()).getObjectId()); service.unlockTransformation(transMeta.getObjectId()); assertNull(service.getTransformationLock(transMeta.getObjectId())); transMeta.setDescription(EXP_TRANS_DESC_V2); repository.save(transMeta, VERSION_COMMENT_V2, null); assertTrue(hasVersionWithComment(transMeta, VERSION_COMMENT_V2)); fetchedTrans = repository.loadTransformation(uniqueTransName, transDir, null, false, null); assertEquals(EXP_TRANS_DESC_V2, fetchedTrans.getDescription()); fetchedTrans = repository.loadTransformation(uniqueTransName, transDir, null, false, VERSION_LABEL_V1); assertEquals(EXP_TRANS_DESC, fetchedTrans.getDescription()); transMetaById = repository.loadTransformation(transMeta.getObjectId(), VERSION_LABEL_V1); assertEquals(fetchedTrans, transMetaById); assertEquals(transMeta.getObjectId(), repository.getTransformationID(uniqueTransName, transDir)); assertEquals(1, repository.getTransformationObjects(transDir.getObjectId(), false).size()); assertEquals(1, repository.getTransformationObjects(transDir.getObjectId(), true).size()); assertEquals(transMeta.getName(), repository.getTransformationObjects(transDir.getObjectId(), false).get(0).getName()); assertEquals(1, repository.getTransformationNames(transDir.getObjectId(), false).length); assertEquals(1, repository.getTransformationNames(transDir.getObjectId(), true).length); assertEquals(transMeta.getName(), repository.getTransformationNames(transDir.getObjectId(), false)[0]); repository.deleteTransformation(transMeta.getObjectId()); assertFalse(repository.exists(uniqueTransName, transDir, RepositoryObjectType.TRANSFORMATION)); assertEquals(0, repository.getTransformationObjects(transDir.getObjectId(), false).size()); assertEquals(1, repository.getTransformationObjects(transDir.getObjectId(), true).size()); assertEquals(transMeta.getName(), repository.getTransformationObjects(transDir.getObjectId(), true).get(0).getName()); assertEquals(0, repository.getTransformationNames(transDir.getObjectId(), false).length); assertEquals(1, repository.getTransformationNames(transDir.getObjectId(), true).length); assertEquals(transMeta.getName(), repository.getTransformationNames(transDir.getObjectId(), true)[0]); } protected TransMeta createTransMeta(final String dbName) throws Exception { RepositoryDirectoryInterface rootDir = loadStartDirectory(); TransMeta transMeta = new TransMeta(); transMeta.setName(EXP_TRANS_NAME.concat(dbName)); transMeta.setDescription(EXP_TRANS_DESC); transMeta.setExtendedDescription(EXP_TRANS_EXTENDED_DESC); transMeta.setRepositoryDirectory(rootDir.findDirectory(DIR_TRANSFORMATIONS)); transMeta.setTransversion(EXP_TRANS_VERSION); transMeta.setTransstatus(EXP_TRANS_STATUS); transMeta.setCreatedUser(EXP_TRANS_CREATED_USER); transMeta.setCreatedDate(EXP_TRANS_CREATED_DATE); transMeta.setModifiedUser(EXP_TRANS_MOD_USER); transMeta.setModifiedDate(EXP_TRANS_MOD_DATE); transMeta.addParameterDefinition(EXP_TRANS_PARAM_1_NAME, EXP_TRANS_PARAM_1_DEF, EXP_TRANS_PARAM_1_DESC); // TODO mlowery other transLogTable fields could be set for testing here TransLogTable transLogTable = TransLogTable.getDefault(transMeta, transMeta, new ArrayList<StepMeta>(0)); transLogTable.setConnectionName(EXP_TRANS_LOG_TABLE_CONN_NAME); transLogTable.setLogInterval(EXP_TRANS_LOG_TABLE_INTERVAL); transLogTable.setSchemaName(EXP_TRANS_LOG_TABLE_SCHEMA_NAME); transLogTable.setLogSizeLimit(EXP_TRANS_LOG_TABLE_SIZE_LIMIT); transLogTable.setTableName(EXP_TRANS_LOG_TABLE_TABLE_NAME); transLogTable.setTimeoutInDays(EXP_TRANS_LOG_TABLE_TIMEOUT_IN_DAYS); transMeta.setTransLogTable(transLogTable); // TODO mlowery other perfLogTable fields could be set for testing here PerformanceLogTable perfLogTable = PerformanceLogTable.getDefault(transMeta, transMeta); perfLogTable.setConnectionName(EXP_TRANS_LOG_TABLE_CONN_NAME); perfLogTable.setLogInterval(EXP_TRANS_LOG_TABLE_INTERVAL); perfLogTable.setSchemaName(EXP_TRANS_LOG_TABLE_SCHEMA_NAME); perfLogTable.setTableName(EXP_TRANS_LOG_TABLE_TABLE_NAME); perfLogTable.setTimeoutInDays(EXP_TRANS_LOG_TABLE_TIMEOUT_IN_DAYS); transMeta.setPerformanceLogTable(perfLogTable); // TODO mlowery other channelLogTable fields could be set for testing here ChannelLogTable channelLogTable = ChannelLogTable.getDefault(transMeta, transMeta); channelLogTable.setConnectionName(EXP_TRANS_LOG_TABLE_CONN_NAME); channelLogTable.setSchemaName(EXP_TRANS_LOG_TABLE_SCHEMA_NAME); channelLogTable.setTableName(EXP_TRANS_LOG_TABLE_TABLE_NAME); channelLogTable.setTimeoutInDays(EXP_TRANS_LOG_TABLE_TIMEOUT_IN_DAYS); transMeta.setChannelLogTable(channelLogTable); // TODO mlowery other stepLogTable fields could be set for testing here StepLogTable stepLogTable = StepLogTable.getDefault(transMeta, transMeta); stepLogTable.setConnectionName(EXP_TRANS_LOG_TABLE_CONN_NAME); stepLogTable.setSchemaName(EXP_TRANS_LOG_TABLE_SCHEMA_NAME); stepLogTable.setTableName(EXP_TRANS_LOG_TABLE_TABLE_NAME); stepLogTable.setTimeoutInDays(EXP_TRANS_LOG_TABLE_TIMEOUT_IN_DAYS); transMeta.setStepLogTable(stepLogTable); DatabaseMeta dbMeta = createDatabaseMeta(dbName); // dbMeta must be saved so that it gets an ID repository.save(dbMeta, VERSION_COMMENT_V1, null); deleteStack.push(dbMeta); transMeta.setMaxDateConnection(dbMeta); transMeta.setMaxDateTable(EXP_TRANS_MAX_DATE_TABLE); transMeta.setMaxDateField(EXP_TRANS_MAX_DATE_FIELD); transMeta.setMaxDateOffset(EXP_TRANS_MAX_DATE_OFFSET); transMeta.setMaxDateDifference(EXP_TRANS_MAX_DATE_DIFF); transMeta.setSizeRowset(EXP_TRANS_SIZE_ROWSET); transMeta.setSleepTimeEmpty(EXP_TRANS_SLEEP_TIME_EMPTY); transMeta.setSleepTimeFull(EXP_TRANS_SLEEP_TIME_FULL); transMeta.setUsingUniqueConnections(EXP_TRANS_USING_UNIQUE_CONN); transMeta.setFeedbackShown(EXP_TRANS_FEEDBACK_SHOWN); transMeta.setFeedbackSize(EXP_TRANS_FEEDBACK_SIZE); transMeta.setUsingThreadPriorityManagment(EXP_TRANS_USING_THREAD_PRIORITY_MGMT); transMeta.setSharedObjectsFile(EXP_TRANS_SHARED_OBJECTS_FILE); transMeta.setCapturingStepPerformanceSnapShots(EXP_TRANS_CAPTURE_STEP_PERF_SNAPSHOTS); transMeta.setStepPerformanceCapturingDelay(EXP_TRANS_STEP_PERF_CAP_DELAY); transMeta.addDependency(new TransDependency(dbMeta, EXP_TRANS_DEP_TABLE_NAME, EXP_TRANS_DEP_FIELD_NAME)); DatabaseMeta stepDbMeta = createDatabaseMeta(EXP_DBMETA_NAME_STEP.concat(dbName)); repository.save(stepDbMeta, VERSION_COMMENT_V1, null); deleteStack.push(stepDbMeta); Condition cond = new Condition(); StepMeta step1 = createStepMeta1(transMeta, stepDbMeta, cond); transMeta.addStep(step1); StepMeta step2 = createStepMeta2(stepDbMeta, cond); transMeta.addStep(step2); transMeta.addTransHop(createTransHopMeta(step1, step2)); SlaveServer slaveServer = createSlaveServer(dbName); PartitionSchema partSchema = createPartitionSchema(dbName); // slaveServer, partSchema must be saved so that they get IDs repository.save(slaveServer, VERSION_COMMENT_V1, null); deleteStack.push(slaveServer); repository.save(partSchema, VERSION_COMMENT_V1, null); deleteStack.push(partSchema); SlaveStepCopyPartitionDistribution slaveStepCopyPartitionDistribution = new SlaveStepCopyPartitionDistribution(); slaveStepCopyPartitionDistribution.addPartition(EXP_SLAVE_NAME, EXP_PART_SCHEMA_NAME, 0); slaveStepCopyPartitionDistribution .setOriginalPartitionSchemas(Arrays.asList(new PartitionSchema[] { partSchema })); transMeta.setSlaveStepCopyPartitionDistribution(slaveStepCopyPartitionDistribution); transMeta.setSlaveTransformation(EXP_TRANS_SLAVE_TRANSFORMATION); return transMeta; } protected PartitionSchema createPartitionSchema(String partName) throws Exception { PartitionSchema partSchema = new PartitionSchema(); partSchema.setName(EXP_PART_SCHEMA_NAME.concat(partName)); partSchema.setDescription(EXP_PART_SCHEMA_DESC); partSchema.setPartitionIDs( Arrays.asList(new String[] { EXP_PART_SCHEMA_PARTID_1, EXP_PART_SCHEMA_PARTID_2 })); partSchema.setDynamicallyDefined(EXP_PART_SCHEMA_DYN_DEF); partSchema.setNumberOfPartitionsPerSlave(EXP_PART_SCHEMA_PART_PER_SLAVE_COUNT); return partSchema; } /** * save(partitionSchema) exists() loadPartitionSchema() deletePartitionSchema() getPartitionSchemaID() * getPartitionSchemaIDs() getPartitionSchemaNames() */ @Test public void testPartitionSchemas() throws Exception { // RepositoryDirectoryInterface rootDir = initRepo(); PartitionSchema partSchema = createPartitionSchema(""); repository.save(partSchema, VERSION_COMMENT_V1, null); assertNotNull(partSchema.getObjectId()); ObjectRevision version = partSchema.getObjectRevision(); assertNotNull(version); assertTrue(hasVersionWithComment(partSchema, VERSION_COMMENT_V1)); assertTrue(repository.exists(EXP_PART_SCHEMA_NAME, null, RepositoryObjectType.PARTITION_SCHEMA)); PartitionSchema fetchedPartSchema = repository.loadPartitionSchema(partSchema.getObjectId(), null); assertEquals(EXP_PART_SCHEMA_NAME, fetchedPartSchema.getName()); // TODO mlowery partitionSchema.getXML doesn't output desc either; should it? // assertEquals(EXP_PART_SCHEMA_DESC, fetchedPartSchema.getDescription()); assertEquals(Arrays.asList(new String[] { EXP_PART_SCHEMA_PARTID_1, EXP_PART_SCHEMA_PARTID_2 }), fetchedPartSchema.getPartitionIDs()); assertEquals(EXP_PART_SCHEMA_DYN_DEF, fetchedPartSchema.isDynamicallyDefined()); assertEquals(EXP_PART_SCHEMA_PART_PER_SLAVE_COUNT, fetchedPartSchema.getNumberOfPartitionsPerSlave()); partSchema.setNumberOfPartitionsPerSlave(EXP_PART_SCHEMA_PART_PER_SLAVE_COUNT_V2); repository.save(partSchema, VERSION_COMMENT_V2, null); assertEquals(VERSION_COMMENT_V2, partSchema.getObjectRevision().getComment()); fetchedPartSchema = repository.loadPartitionSchema(partSchema.getObjectId(), null); assertEquals(EXP_PART_SCHEMA_PART_PER_SLAVE_COUNT_V2, fetchedPartSchema.getNumberOfPartitionsPerSlave()); fetchedPartSchema = repository.loadPartitionSchema(partSchema.getObjectId(), VERSION_LABEL_V1); assertEquals(EXP_PART_SCHEMA_PART_PER_SLAVE_COUNT, fetchedPartSchema.getNumberOfPartitionsPerSlave()); assertEquals(partSchema.getObjectId(), repository.getPartitionSchemaID(EXP_PART_SCHEMA_NAME)); assertEquals(1, repository.getPartitionSchemaIDs(false).length); assertEquals(1, repository.getPartitionSchemaIDs(true).length); assertEquals(partSchema.getObjectId(), repository.getPartitionSchemaIDs(false)[0]); assertEquals(1, repository.getPartitionSchemaNames(false).length); assertEquals(1, repository.getPartitionSchemaNames(true).length); assertEquals(EXP_PART_SCHEMA_NAME, repository.getPartitionSchemaNames(false)[0]); repository.deletePartitionSchema(partSchema.getObjectId()); assertFalse(repository.exists(EXP_PART_SCHEMA_NAME, null, RepositoryObjectType.PARTITION_SCHEMA)); assertEquals(0, repository.getPartitionSchemaIDs(false).length); // shared object deletion is permanent by default assertEquals(0, repository.getPartitionSchemaIDs(true).length); assertEquals(0, repository.getPartitionSchemaNames(false).length); // shared object deletion is permanent by default assertEquals(0, repository.getPartitionSchemaNames(true).length); } /** * save(clusterSchema) exists() loadClusterSchema() deleteClusterSchema() getClusterID() getClusterIDs() * getClusterNames() */ @Test public void testClusterSchemas() throws Exception { // RepositoryDirectoryInterface rootDir = initRepo(); ClusterSchema clusterSchema = createClusterSchema(EXP_CLUSTER_SCHEMA_NAME); repository.save(clusterSchema, VERSION_COMMENT_V1, null); assertNotNull(clusterSchema.getObjectId()); ObjectRevision version = clusterSchema.getObjectRevision(); assertNotNull(version); assertTrue(hasVersionWithComment(clusterSchema, VERSION_COMMENT_V1)); assertTrue(repository.exists(EXP_CLUSTER_SCHEMA_NAME, null, RepositoryObjectType.CLUSTER_SCHEMA)); ClusterSchema fetchedClusterSchema = repository.loadClusterSchema(clusterSchema.getObjectId(), repository.getSlaveServers(), null); assertEquals(EXP_CLUSTER_SCHEMA_NAME, fetchedClusterSchema.getName()); // TODO mlowery clusterSchema.getXML doesn't output desc either; should it? // assertEquals(EXP_CLUSTER_SCHEMA_DESC, fetchedClusterSchema.getDescription()); assertEquals(EXP_CLUSTER_SCHEMA_BASE_PORT, fetchedClusterSchema.getBasePort()); assertEquals(EXP_CLUSTER_SCHEMA_SOCKETS_BUFFER_SIZE, fetchedClusterSchema.getSocketsBufferSize()); assertEquals(EXP_CLUSTER_SCHEMA_SOCKETS_FLUSH_INTERVAL, fetchedClusterSchema.getSocketsFlushInterval()); assertEquals(EXP_CLUSTER_SCHEMA_SOCKETS_COMPRESSED, fetchedClusterSchema.isSocketsCompressed()); assertEquals(EXP_CLUSTER_SCHEMA_DYN, fetchedClusterSchema.isDynamic()); assertEquals(1, fetchedClusterSchema.getSlaveServers().size()); assertTrue(fetchedClusterSchema.getSlaveServers().get(0).getName().startsWith(EXP_SLAVE_NAME)); // versioning test clusterSchema.setBasePort(EXP_CLUSTER_SCHEMA_BASE_PORT_V2); repository.save(clusterSchema, VERSION_COMMENT_V2, null); assertEquals(VERSION_COMMENT_V2, clusterSchema.getObjectRevision().getComment()); fetchedClusterSchema = repository.loadClusterSchema(clusterSchema.getObjectId(), repository.getSlaveServers(), null); assertEquals(EXP_CLUSTER_SCHEMA_BASE_PORT_V2, fetchedClusterSchema.getBasePort()); fetchedClusterSchema = repository.loadClusterSchema(clusterSchema.getObjectId(), repository.getSlaveServers(), VERSION_LABEL_V1); assertEquals(EXP_CLUSTER_SCHEMA_BASE_PORT, fetchedClusterSchema.getBasePort()); assertEquals(clusterSchema.getObjectId(), repository.getClusterID(EXP_CLUSTER_SCHEMA_NAME)); assertEquals(1, repository.getClusterIDs(false).length); assertEquals(1, repository.getClusterIDs(true).length); assertEquals(clusterSchema.getObjectId(), repository.getClusterIDs(false)[0]); assertEquals(1, repository.getClusterNames(false).length); assertEquals(1, repository.getClusterNames(true).length); assertEquals(EXP_CLUSTER_SCHEMA_NAME, repository.getClusterNames(false)[0]); repository.deleteClusterSchema(clusterSchema.getObjectId()); assertFalse(repository.exists(EXP_CLUSTER_SCHEMA_NAME, null, RepositoryObjectType.CLUSTER_SCHEMA)); assertEquals(0, repository.getClusterIDs(false).length); // shared object deletion is permanent by default assertEquals(0, repository.getClusterIDs(true).length); assertEquals(0, repository.getClusterNames(false).length); // shared object deletion is permanent by default assertEquals(0, repository.getClusterNames(true).length); } protected ClusterSchema createClusterSchema(String clusterName) throws Exception { ClusterSchema clusterSchema = new ClusterSchema(); clusterSchema.setName(clusterName); clusterSchema.setBasePort(EXP_CLUSTER_SCHEMA_BASE_PORT); clusterSchema.setSocketsBufferSize(EXP_CLUSTER_SCHEMA_SOCKETS_BUFFER_SIZE); clusterSchema.setSocketsFlushInterval(EXP_CLUSTER_SCHEMA_SOCKETS_FLUSH_INTERVAL); clusterSchema.setSocketsCompressed(EXP_CLUSTER_SCHEMA_SOCKETS_COMPRESSED); clusterSchema.setDynamic(EXP_CLUSTER_SCHEMA_DYN); SlaveServer slaveServer = createSlaveServer(clusterName); repository.save(slaveServer, VERSION_COMMENT_V1, null); deleteStack.push(slaveServer); clusterSchema.setSlaveServers(Collections.singletonList(slaveServer)); return clusterSchema; } protected JobEntryInterface createJobEntry1(final DatabaseMeta dbMeta) throws Exception { JobEntryAttributeTesterJobEntry entry1 = new JobEntryAttributeTesterJobEntry(EXP_JOB_ENTRY_1_NAME); entry1.setDatabaseMeta(dbMeta); return entry1; } protected JobEntryInterface createJobEntry2(final DatabaseMeta dbMeta) throws Exception { JobEntryAttributeTesterJobEntry entry2 = new JobEntryAttributeTesterJobEntry(EXP_JOB_ENTRY_2_NAME); entry2.setDatabaseMeta(dbMeta); return entry2; } protected JobEntryCopy createJobEntry1Copy(final DatabaseMeta dbMeta) throws Exception { JobEntryCopy copy = new JobEntryCopy(createJobEntry1(dbMeta)); copy.setLocation(EXP_JOB_ENTRY_1_COPY_X_LOC, EXP_JOB_ENTRY_1_COPY_Y_LOC); return copy; } protected JobEntryCopy createJobEntry2Copy(final DatabaseMeta dbMeta) throws Exception { JobEntryCopy copy = new JobEntryCopy(createJobEntry2(dbMeta)); copy.setLocation(EXP_JOB_ENTRY_2_COPY_X_LOC, EXP_JOB_ENTRY_2_COPY_Y_LOC); return copy; } protected StepMeta createStepMeta1(final TransMeta transMeta, final DatabaseMeta dbMeta, final Condition condition) throws Exception { TransStepAttributeTesterTransStep step1 = new TransStepAttributeTesterTransStep(); step1.setDatabaseMeta(dbMeta); step1.setCondition(condition); StepMeta stepMeta1 = new StepMeta(EXP_TRANS_STEP_1_NAME, step1); StepErrorMeta stepErrorMeta1 = new StepErrorMeta(transMeta, stepMeta1); stepErrorMeta1.setEnabled(EXP_TRANS_STEP_ERROR_META_1_ENABLED); stepErrorMeta1.setNrErrorsValuename(EXP_TRANS_STEP_ERROR_META_1_NR_ERRORS_VALUE_NAME); stepErrorMeta1.setErrorDescriptionsValuename(EXP_TRANS_STEP_ERROR_META_1_DESC_VALUE_NAME); stepErrorMeta1.setErrorFieldsValuename(EXP_TRANS_STEP_ERROR_META_1_FIELDS_VALUE_NAME); stepErrorMeta1.setErrorCodesValuename(EXP_TRANS_STEP_ERROR_META_1_CODES_VALUE_NAME); stepErrorMeta1.setMaxErrors(EXP_TRANS_STEP_ERROR_META_1_MAX_ERRORS); stepErrorMeta1.setMaxPercentErrors(EXP_TRANS_STEP_ERROR_META_1_MAX_PERCENT_ERRORS); stepErrorMeta1.setMinPercentRows(EXP_TRANS_STEP_ERROR_META_1_MIN_PERCENT_ROWS); stepMeta1.setStepErrorMeta(stepErrorMeta1); return stepMeta1; } protected StepMeta createStepMeta2(final DatabaseMeta dbMeta, final Condition condition) throws Exception { TransStepAttributeTesterTransStep step2 = new TransStepAttributeTesterTransStep(); step2.setDatabaseMeta(dbMeta); step2.setCondition(condition); return new StepMeta(EXP_TRANS_STEP_2_NAME, step2); } protected TransHopMeta createTransHopMeta(final StepMeta stepMeta1, final StepMeta stepMeta2) throws Exception { return new TransHopMeta(stepMeta1, stepMeta2); } protected NotePadMeta createNotePadMeta(String note) throws Exception { return new NotePadMeta(EXP_NOTEPAD_NOTE.concat(note), EXP_NOTEPAD_X, EXP_NOTEPAD_Y, EXP_NOTEPAD_WIDTH, EXP_NOTEPAD_HEIGHT); } protected JobHopMeta createJobHopMeta(final JobEntryCopy from, final JobEntryCopy to) throws Exception { return new JobHopMeta(from, to); } protected DatabaseMeta createDatabaseMeta(final String dbName) throws Exception { DatabaseMeta dbMeta = new DatabaseMeta(); dbMeta.setName(dbName); dbMeta.setHostname(EXP_DBMETA_HOSTNAME); dbMeta.setDatabaseType(EXP_DBMETA_TYPE); dbMeta.setAccessType(EXP_DBMETA_ACCESS); dbMeta.setDBName(EXP_DBMETA_DBNAME); dbMeta.setDBPort(EXP_DBMETA_PORT); dbMeta.setUsername(EXP_DBMETA_USERNAME); dbMeta.setPassword(EXP_DBMETA_PASSWORD); dbMeta.setServername(EXP_DBMETA_SERVERNAME); dbMeta.setDataTablespace(EXP_DBMETA_DATA_TABLESPACE); dbMeta.setIndexTablespace(EXP_DBMETA_INDEX_TABLESPACE); // Properties attrs = new Properties(); // exposed mutable state; yikes dbMeta.getAttributes().put(EXP_DBMETA_ATTR1_KEY, EXP_DBMETA_ATTR1_VALUE); dbMeta.getAttributes().put(EXP_DBMETA_ATTR2_KEY, EXP_DBMETA_ATTR2_VALUE); // TODO mlowery more testing on DatabaseMeta options return dbMeta; } /** * save(databaseMeta) loadDatabaseMeta() exists() deleteDatabaseMeta() getDatabaseID() getDatabaseIDs() * getDatabaseNames() readDatabases() */ @Test public void testDatabases() throws Exception { DatabaseMeta dbMeta = createDatabaseMeta(EXP_DBMETA_NAME); repository.save(dbMeta, VERSION_COMMENT_V1, null); assertNotNull(dbMeta.getObjectId()); ObjectRevision v1 = dbMeta.getObjectRevision(); assertNotNull(v1); assertTrue(hasVersionWithComment(dbMeta, VERSION_COMMENT_V1)); // setting repository directory on dbMeta is not supported; use null parent directory assertTrue(repository.exists(EXP_DBMETA_NAME, null, RepositoryObjectType.DATABASE)); DatabaseMeta fetchedDatabase = repository.loadDatabaseMeta(dbMeta.getObjectId(), null); assertEquals(EXP_DBMETA_NAME, fetchedDatabase.getName()); assertEquals(EXP_DBMETA_HOSTNAME, fetchedDatabase.getHostname()); assertEquals(EXP_DBMETA_TYPE, fetchedDatabase.getPluginId()); assertEquals(EXP_DBMETA_ACCESS, fetchedDatabase.getAccessType()); assertEquals(EXP_DBMETA_DBNAME, fetchedDatabase.getDatabaseName()); assertEquals(EXP_DBMETA_PORT, fetchedDatabase.getDatabasePortNumberString()); assertEquals(EXP_DBMETA_USERNAME, fetchedDatabase.getUsername()); assertEquals(EXP_DBMETA_PASSWORD, fetchedDatabase.getPassword()); assertEquals(EXP_DBMETA_SERVERNAME, fetchedDatabase.getServername()); assertEquals(EXP_DBMETA_DATA_TABLESPACE, fetchedDatabase.getDataTablespace()); assertEquals(EXP_DBMETA_INDEX_TABLESPACE, fetchedDatabase.getIndexTablespace()); // 2 for the ones explicitly set and 1 for port (set behind the scenes) assertEquals(2 + 1, fetchedDatabase.getAttributes().size()); assertEquals(EXP_DBMETA_ATTR1_VALUE, fetchedDatabase.getAttributes().getProperty(EXP_DBMETA_ATTR1_KEY)); assertEquals(EXP_DBMETA_ATTR2_VALUE, fetchedDatabase.getAttributes().getProperty(EXP_DBMETA_ATTR2_KEY)); dbMeta.setHostname(EXP_DBMETA_HOSTNAME_V2); repository.save(dbMeta, VERSION_COMMENT_V2, null); assertTrue(hasVersionWithComment(dbMeta, VERSION_COMMENT_V2)); fetchedDatabase = repository.loadDatabaseMeta(dbMeta.getObjectId(), null); assertEquals(EXP_DBMETA_HOSTNAME_V2, fetchedDatabase.getHostname()); fetchedDatabase = repository.loadDatabaseMeta(dbMeta.getObjectId(), v1.getName()); assertEquals(EXP_DBMETA_HOSTNAME, fetchedDatabase.getHostname()); assertEquals(dbMeta.getObjectId(), repository.getDatabaseID(EXP_DBMETA_NAME)); assertEquals(1, repository.getDatabaseIDs(false).length); assertEquals(1, repository.getDatabaseIDs(true).length); assertEquals(dbMeta.getObjectId(), repository.getDatabaseIDs(false)[0]); assertEquals(1, repository.getDatabaseNames(false).length); assertEquals(1, repository.getDatabaseNames(true).length); assertEquals(EXP_DBMETA_NAME, repository.getDatabaseNames(false)[0]); assertEquals(1, repository.readDatabases().size()); repository.deleteDatabaseMeta(EXP_DBMETA_NAME); assertFalse(repository.exists(EXP_DBMETA_NAME, null, RepositoryObjectType.DATABASE)); assertEquals(0, repository.getDatabaseIDs(false).length); // shared object deletion is permanent by default assertEquals(0, repository.getDatabaseIDs(true).length); assertEquals(0, repository.getDatabaseNames(false).length); // shared object deletion is permanent by default assertEquals(0, repository.getDatabaseNames(true).length); assertEquals(0, repository.readDatabases().size()); } protected boolean hasVersionWithComment(final RepositoryElementInterface element, final String comment) throws Exception { IRevisionService service = (IRevisionService) repository.getService(IRevisionService.class); List<ObjectRevision> versions = service.getRevisions(element); for (ObjectRevision version : versions) { if (version.getComment().equals(comment)) { return true; } } return false; } protected boolean hasVersionWithCal(final RepositoryElementInterface element, final Calendar cal) throws Exception { IRevisionService service = (IRevisionService) repository.getService(IRevisionService.class); List<ObjectRevision> versions = service.getRevisions(element); for (ObjectRevision version : versions) { if (version.getCreationDate().equals(cal.getTime())) { return true; } } return false; } /** * save(slave) loadSlaveServer() exists() deleteSlave() getSlaveID() getSlaveIDs() getSlaveNames() getSlaveServers() */ @Test public void testSlaves() throws Exception { SlaveServer slave = createSlaveServer(""); repository.save(slave, VERSION_COMMENT_V1, null); assertNotNull(slave.getObjectId()); ObjectRevision version = slave.getObjectRevision(); assertNotNull(version); assertTrue(hasVersionWithComment(slave, VERSION_COMMENT_V1)); // setting repository directory on slave is not supported; use null parent directory assertTrue(repository.exists(EXP_SLAVE_NAME, null, RepositoryObjectType.SLAVE_SERVER)); SlaveServer fetchedSlave = repository.loadSlaveServer(slave.getObjectId(), null); assertEquals(EXP_SLAVE_NAME, fetchedSlave.getName()); assertEquals(EXP_SLAVE_HOSTNAME, fetchedSlave.getHostname()); assertEquals(EXP_SLAVE_PORT, fetchedSlave.getPort()); assertEquals(EXP_SLAVE_USERNAME, fetchedSlave.getUsername()); assertEquals(EXP_SLAVE_PASSWORD, fetchedSlave.getPassword()); assertEquals(EXP_SLAVE_PROXY_HOSTNAME, fetchedSlave.getProxyHostname()); assertEquals(EXP_SLAVE_PROXY_PORT, fetchedSlave.getProxyPort()); assertEquals(EXP_SLAVE_NON_PROXY_HOSTS, fetchedSlave.getNonProxyHosts()); assertEquals(EXP_SLAVE_MASTER, fetchedSlave.isMaster()); slave.setHostname(EXP_SLAVE_HOSTNAME_V2); repository.save(slave, VERSION_COMMENT_V2, null); assertEquals(VERSION_COMMENT_V2, slave.getObjectRevision().getComment()); fetchedSlave = repository.loadSlaveServer(slave.getObjectId(), null); assertEquals(EXP_SLAVE_HOSTNAME_V2, fetchedSlave.getHostname()); fetchedSlave = repository.loadSlaveServer(slave.getObjectId(), VERSION_LABEL_V1); assertEquals(EXP_SLAVE_HOSTNAME, fetchedSlave.getHostname()); assertEquals(slave.getObjectId(), repository.getSlaveID(EXP_SLAVE_NAME)); assertEquals(1, repository.getSlaveIDs(false).length); assertEquals(1, repository.getSlaveIDs(true).length); assertEquals(slave.getObjectId(), repository.getSlaveIDs(false)[0]); assertEquals(1, repository.getSlaveNames(false).length); assertEquals(1, repository.getSlaveNames(true).length); assertEquals(EXP_SLAVE_NAME, repository.getSlaveNames(false)[0]); assertEquals(1, repository.getSlaveServers().size()); assertEquals(EXP_SLAVE_NAME, repository.getSlaveServers().get(0).getName()); repository.deleteSlave(slave.getObjectId()); assertFalse(repository.exists(EXP_SLAVE_NAME, null, RepositoryObjectType.SLAVE_SERVER)); assertEquals(0, repository.getSlaveIDs(false).length); // shared object deletion is permanent by default assertEquals(0, repository.getSlaveIDs(true).length); assertEquals(0, repository.getSlaveNames(false).length); // shared object deletion is permanent by default assertEquals(0, repository.getSlaveNames(true).length); assertEquals(0, repository.getSlaveServers().size()); } protected SlaveServer createSlaveServer(String slaveName) throws Exception { SlaveServer slaveServer = new SlaveServer(); slaveServer.setName(EXP_SLAVE_NAME.concat(slaveName)); slaveServer.setHostname(EXP_SLAVE_HOSTNAME); slaveServer.setPort(EXP_SLAVE_PORT); slaveServer.setUsername(EXP_SLAVE_USERNAME); slaveServer.setPassword(EXP_SLAVE_PASSWORD); slaveServer.setProxyHostname(EXP_SLAVE_PROXY_HOSTNAME); slaveServer.setProxyPort(EXP_SLAVE_PROXY_PORT); slaveServer.setNonProxyHosts(EXP_SLAVE_NON_PROXY_HOSTS); slaveServer.setMaster(EXP_SLAVE_MASTER); return slaveServer; } @Ignore @Test public void testRenameAndUndelete() throws Exception { RepositoryDirectoryInterface rootDir = initRepo(); JobMeta jobMeta = createJobMeta(EXP_JOB_NAME); RepositoryDirectoryInterface jobsDir = rootDir.findDirectory(DIR_JOBS); repository.save(jobMeta, VERSION_COMMENT_V1, null); deleteStack.push(jobMeta); repository.deleteJob(jobMeta.getObjectId()); assertFalse(repository.exists(EXP_JOB_NAME, jobsDir, RepositoryObjectType.JOB)); RepositoryObject robj = new RepositoryObject(jobMeta.getObjectId(), jobMeta.getName(), jobMeta.getRepositoryDirectory(), null, null, jobMeta.getRepositoryElementType(), null, false); repository.undeleteObject(robj); assertTrue(repository.exists(EXP_JOB_NAME, jobsDir, RepositoryObjectType.JOB)); repository.renameJob(jobMeta.getObjectId(), jobsDir, EXP_JOB_NAME_NEW); assertFalse(repository.exists(EXP_JOB_NAME, jobsDir, RepositoryObjectType.JOB)); assertTrue(repository.exists(EXP_JOB_NAME_NEW, jobsDir, RepositoryObjectType.JOB)); TransMeta transMeta = createTransMeta(EXP_DBMETA_NAME); RepositoryDirectoryInterface transDir = rootDir.findDirectory(DIR_TRANSFORMATIONS); repository.save(transMeta, VERSION_COMMENT_V1, null); deleteStack.push(transMeta); repository.renameTransformation(transMeta.getObjectId(), transDir, EXP_TRANS_NAME_NEW); assertFalse(repository.exists(EXP_TRANS_NAME.concat(EXP_DBMETA_NAME), transDir, RepositoryObjectType.TRANSFORMATION)); assertTrue(repository.exists(EXP_TRANS_NAME_NEW, transDir, RepositoryObjectType.TRANSFORMATION)); DatabaseMeta dbMeta = createDatabaseMeta(EXP_DBMETA2_NAME); repository.save(dbMeta, VERSION_COMMENT_V1, null); deleteStack.push(dbMeta); dbMeta.setName(EXP_DBMETA_NAME_NEW); repository.save(dbMeta, VERSION_COMMENT_V2, null); assertFalse(repository.exists(EXP_DBMETA2_NAME, null, RepositoryObjectType.DATABASE)); assertTrue(repository.exists(EXP_DBMETA_NAME_NEW, null, RepositoryObjectType.DATABASE)); } @Test public void testVersions() throws Exception { IRevisionService service = (IRevisionService) repository.getService(IRevisionService.class); DatabaseMeta dbMeta = createDatabaseMeta(EXP_DBMETA_NAME); repository.save(dbMeta, VERSION_COMMENT_V1, null); deleteStack.push(dbMeta); List<ObjectRevision> revs = service.getRevisions(dbMeta); assertTrue(revs.size() >= 1); dbMeta.setHostname(EXP_DBMETA_HOSTNAME_V2); repository.save(dbMeta, VERSION_COMMENT_V2, null); revs = service.getRevisions(dbMeta); assertTrue(revs.size() >= 2); // RepositoryVersionRegistry vReg = repository.getVersionRegistry(); // assertEquals(0, vReg.getVersions().size()); // vReg.addVersion(new SimpleObjectVersion(EXP_OBJECT_VERSION_LABEL, null, null, null)); // assertEquals(2, versions.size()); // assertEquals("1.0", versions.get(0).getLabel()); // assertEquals("1.1", versions.get(1).getLabel()); // TODO mlowery finish me } @Test @Ignore public void testGetSecurityProvider() throws Exception { fail("Not yet implemented"); } @Test @Ignore public void testGetVersionRegistry() throws Exception { fail("Not yet implemented"); } @Test @Ignore public void testInsertJobEntryDatabase() throws Exception { fail("Not yet implemented"); } @Test @Ignore public void testInsertLogEntry() throws Exception { fail("Not yet implemented"); } @Test @Ignore public void testInsertStepDatabase() throws Exception { fail("Not yet implemented"); } @Test @Ignore public void testLoadConditionFromStepAttribute() throws Exception { fail("Not yet implemented"); } @Test @Ignore public void testLoadDatabaseMetaFromJobEntryAttribute() throws Exception { fail("Not yet implemented"); } @Test @Ignore public void testLoadDatabaseMetaFromStepAttribute() throws Exception { fail("Not yet implemented"); } @Test @Ignore public void testReadJobMetaSharedObjects() throws Exception { fail("Not yet implemented"); } @Test @Ignore public void testReadTransSharedObjects() throws Exception { fail("Not yet implemented"); } @Test @Ignore public void testSaveConditionStepAttribute() throws Exception { fail("Not yet implemented"); } @Test @Ignore public void testGetAcl() throws Exception { RepositoryDirectoryInterface rootDir = initRepo(); JobMeta jobMeta = createJobMeta(EXP_JOB_NAME); RepositoryDirectoryInterface jobsDir = rootDir.findDirectory(DIR_JOBS); repository.save(jobMeta, VERSION_COMMENT_V1, null); deleteStack.push(jobMeta); assertNotNull(jobMeta.getObjectId()); ObjectRevision version = jobMeta.getObjectRevision(); assertNotNull(version); assertTrue(hasVersionWithComment(jobMeta, VERSION_COMMENT_V1)); assertTrue(repository.exists(EXP_JOB_NAME, jobsDir, RepositoryObjectType.JOB)); ObjectAcl acl = ((IAclService) repository).getAcl(jobMeta.getObjectId(), false); assertNotNull(acl); } @Test @Ignore public void testSetAcl() throws Exception { RepositoryDirectoryInterface rootDir = initRepo(); JobMeta jobMeta = createJobMeta(EXP_JOB_NAME); RepositoryDirectoryInterface jobsDir = rootDir.findDirectory(DIR_JOBS); repository.save(jobMeta, VERSION_COMMENT_V1, null); deleteStack.push(jobMeta); assertNotNull(jobMeta.getObjectId()); ObjectRevision version = jobMeta.getObjectRevision(); assertNotNull(version); assertTrue(hasVersionWithComment(jobMeta, VERSION_COMMENT_V1)); assertTrue(repository.exists(EXP_JOB_NAME, jobsDir, RepositoryObjectType.JOB)); ObjectAcl acl = ((IAclService) repository).getAcl(jobMeta.getObjectId(), false); assertNotNull(acl); acl.setEntriesInheriting(false); ObjectAce ace = new RepositoryObjectAce(new RepositoryObjectRecipient("suzy", Type.USER), EnumSet.of(RepositoryFilePermission.READ)); List<ObjectAce> aceList = new ArrayList<ObjectAce>(); aceList.add(ace); acl.setAces(aceList); ((IAclService) repository).setAcl(jobMeta.getObjectId(), acl); ObjectAcl acl1 = ((IAclService) repository).getAcl(jobMeta.getObjectId(), false); assertEquals(Boolean.FALSE, acl1.isEntriesInheriting()); assertEquals(1, acl1.getAces().size()); ObjectAce ace1 = acl1.getAces().get(0); assertEquals(ace1.getRecipient().getName(), "suzy"); assertTrue(ace1.getPermissions().contains(RepositoryFilePermission.READ)); } @Test @Ignore public void testSaveDatabaseMetaJobEntryAttribute() throws Exception { fail("Not yet implemented"); } @Test @Ignore public void testSaveDatabaseMetaStepAttribute() throws Exception { fail("Not yet implemented"); } public static interface EntryAndStepConstants { String ATTR_BOOL = "KDF"; boolean VALUE_BOOL = true; String ATTR_BOOL_MULTI = "DFS"; boolean VALUE_BOOL_MULTI_0 = true; boolean VALUE_BOOL_MULTI_1 = false; String ATTR_BOOL_NOEXIST = "IXS"; boolean VALUE_BOOL_NOEXIST_DEF = true; String ATTR_INT = "TAS"; int VALUE_INT = 4; String ATTR_INT_MULTI = "EZA"; int VALUE_INT_MULTI_0 = 13; int VALUE_INT_MULTI_1 = 42; String ATTR_STRING = "YAZ"; String VALUE_STRING = "sdfsdfsdfswe2222"; String ATTR_STRING_MULTI = "LKS"; String VALUE_STRING_MULTI_0 = "LKS"; String VALUE_STRING_MULTI_1 = "LKS"; String ATTR_DB = "dbMeta1"; String ATTR_COND = "cond1"; } /** * Does assertions on all repository.getJobEntryAttribute* and repository.saveJobEntryAttribute* methods. */ @JobEntry(id = "JobEntryAttributeTester", image = "") public static class JobEntryAttributeTesterJobEntry extends JobEntryBase implements Cloneable, JobEntryInterface, EntryAndStepConstants { private DatabaseMeta databaseMeta; public JobEntryAttributeTesterJobEntry() { this(""); } public JobEntryAttributeTesterJobEntry(final String name) { super(name, ""); } @Override public void loadRep(final Repository rep, final IMetaStore metaStore, final ObjectId idJobentry, final List<DatabaseMeta> databases, final List<SlaveServer> slaveServers) throws KettleException { assertEquals(2, rep.countNrJobEntryAttributes(idJobentry, ATTR_BOOL_MULTI)); assertEquals(VALUE_BOOL, rep.getJobEntryAttributeBoolean(idJobentry, ATTR_BOOL)); assertEquals(VALUE_BOOL_MULTI_0, rep.getJobEntryAttributeBoolean(idJobentry, 0, ATTR_BOOL_MULTI)); assertEquals(VALUE_BOOL_MULTI_1, rep.getJobEntryAttributeBoolean(idJobentry, 1, ATTR_BOOL_MULTI)); assertEquals(VALUE_BOOL_NOEXIST_DEF, rep.getJobEntryAttributeBoolean(idJobentry, ATTR_BOOL_NOEXIST, VALUE_BOOL_NOEXIST_DEF)); assertEquals(VALUE_INT, rep.getJobEntryAttributeInteger(idJobentry, ATTR_INT)); assertEquals(VALUE_INT_MULTI_0, rep.getJobEntryAttributeInteger(idJobentry, 0, ATTR_INT_MULTI)); assertEquals(VALUE_INT_MULTI_1, rep.getJobEntryAttributeInteger(idJobentry, 1, ATTR_INT_MULTI)); assertEquals(VALUE_STRING, rep.getJobEntryAttributeString(idJobentry, ATTR_STRING)); assertEquals(VALUE_STRING_MULTI_0, rep.getJobEntryAttributeString(idJobentry, 0, ATTR_STRING_MULTI)); assertEquals(VALUE_STRING_MULTI_1, rep.getJobEntryAttributeString(idJobentry, 1, ATTR_STRING_MULTI)); assertNotNull(rep.loadDatabaseMetaFromJobEntryAttribute(idJobentry, null, ATTR_DB, databases)); } @Override public void saveRep(final Repository rep, final IMetaStore metaStore, final ObjectId idJob) throws KettleException { rep.saveJobEntryAttribute(idJob, getObjectId(), ATTR_BOOL, VALUE_BOOL); rep.saveJobEntryAttribute(idJob, getObjectId(), 0, ATTR_BOOL_MULTI, VALUE_BOOL_MULTI_0); rep.saveJobEntryAttribute(idJob, getObjectId(), 1, ATTR_BOOL_MULTI, VALUE_BOOL_MULTI_1); rep.saveJobEntryAttribute(idJob, getObjectId(), ATTR_INT, VALUE_INT); rep.saveJobEntryAttribute(idJob, getObjectId(), 0, ATTR_INT_MULTI, VALUE_INT_MULTI_0); rep.saveJobEntryAttribute(idJob, getObjectId(), 1, ATTR_INT_MULTI, VALUE_INT_MULTI_1); rep.saveJobEntryAttribute(idJob, getObjectId(), ATTR_STRING, VALUE_STRING); rep.saveJobEntryAttribute(idJob, getObjectId(), 0, ATTR_STRING_MULTI, VALUE_STRING_MULTI_0); rep.saveJobEntryAttribute(idJob, getObjectId(), 1, ATTR_STRING_MULTI, VALUE_STRING_MULTI_1); rep.saveDatabaseMetaJobEntryAttribute(idJob, getObjectId(), null, ATTR_DB, databaseMeta); rep.insertJobEntryDatabase(idJob, getObjectId(), databaseMeta.getObjectId()); } public Result execute(final Result prevResult, final int nr) throws KettleException { throw new UnsupportedOperationException(); } public void loadXML(final Node entrynode, final List<DatabaseMeta> databases, final List<SlaveServer> slaveServers, final Repository rep, final IMetaStore metaStore) throws KettleXMLException { throw new UnsupportedOperationException(); } public void setDatabaseMeta(DatabaseMeta databaseMeta) { this.databaseMeta = databaseMeta; } } /** * Does assertions on all repository.getStepAttribute* and repository.saveStepAttribute* methods. */ @Step(id = "StepAttributeTester", name = "StepAttributeTester", image = "") public static class TransStepAttributeTesterTransStep extends BaseStepMeta implements StepMetaInterface, EntryAndStepConstants { private DatabaseMeta databaseMeta; private Condition condition; public void check(List<CheckResultInterface> remarks, TransMeta transMeta, StepMeta stepMeta, RowMetaInterface prev, String[] input, String[] output, RowMetaInterface info, VariableSpace space, Repository repository, IMetaStore metaStore) { } public StepInterface getStep(StepMeta stepMeta, StepDataInterface stepDataInterface, int copyNr, TransMeta transMeta, Trans trans) { return null; } public StepDataInterface getStepData() { return null; } public void loadXML(Node stepnode, List<DatabaseMeta> databases, final IMetaStore metaStore) throws KettleXMLException { } public void readRep(Repository rep, final IMetaStore metaStore, ObjectId idStep, List<DatabaseMeta> databases) throws KettleException { assertEquals(2, rep.countNrStepAttributes(idStep, ATTR_BOOL_MULTI)); assertEquals(VALUE_BOOL, rep.getStepAttributeBoolean(idStep, ATTR_BOOL)); assertEquals(VALUE_BOOL_MULTI_0, rep.getStepAttributeBoolean(idStep, 0, ATTR_BOOL_MULTI)); assertEquals(VALUE_BOOL_MULTI_1, rep.getStepAttributeBoolean(idStep, 1, ATTR_BOOL_MULTI)); assertEquals(VALUE_BOOL_NOEXIST_DEF, rep.getStepAttributeBoolean(idStep, 0, ATTR_BOOL_NOEXIST, VALUE_BOOL_NOEXIST_DEF)); assertEquals(VALUE_INT, rep.getStepAttributeInteger(idStep, ATTR_INT)); assertEquals(VALUE_INT_MULTI_0, rep.getStepAttributeInteger(idStep, 0, ATTR_INT_MULTI)); assertEquals(VALUE_INT_MULTI_1, rep.getStepAttributeInteger(idStep, 1, ATTR_INT_MULTI)); assertEquals(VALUE_STRING, rep.getStepAttributeString(idStep, ATTR_STRING)); assertEquals(VALUE_STRING_MULTI_0, rep.getStepAttributeString(idStep, 0, ATTR_STRING_MULTI)); assertEquals(VALUE_STRING_MULTI_1, rep.getStepAttributeString(idStep, 1, ATTR_STRING_MULTI)); assertNotNull(rep.loadDatabaseMetaFromStepAttribute(idStep, ATTR_DB, databases)); assertNotNull(rep.loadConditionFromStepAttribute(idStep, ATTR_COND)); } public void saveRep(Repository rep, final IMetaStore metaStore, ObjectId idTransformation, ObjectId idStep) throws KettleException { rep.saveStepAttribute(idTransformation, idStep, ATTR_BOOL, VALUE_BOOL); rep.saveStepAttribute(idTransformation, idStep, 0, ATTR_BOOL_MULTI, VALUE_BOOL_MULTI_0); rep.saveStepAttribute(idTransformation, idStep, 1, ATTR_BOOL_MULTI, VALUE_BOOL_MULTI_1); rep.saveStepAttribute(idTransformation, idStep, ATTR_INT, VALUE_INT); rep.saveStepAttribute(idTransformation, idStep, 0, ATTR_INT_MULTI, VALUE_INT_MULTI_0); rep.saveStepAttribute(idTransformation, idStep, 1, ATTR_INT_MULTI, VALUE_INT_MULTI_1); rep.saveStepAttribute(idTransformation, idStep, ATTR_STRING, VALUE_STRING); rep.saveStepAttribute(idTransformation, idStep, 0, ATTR_STRING_MULTI, VALUE_STRING_MULTI_0); rep.saveStepAttribute(idTransformation, idStep, 1, ATTR_STRING_MULTI, VALUE_STRING_MULTI_1); rep.saveDatabaseMetaStepAttribute(idTransformation, idStep, ATTR_DB, databaseMeta); rep.insertStepDatabase(idTransformation, idStep, databaseMeta.getObjectId()); rep.saveConditionStepAttribute(idTransformation, idStep, ATTR_COND, condition); } public void setDefault() { } public void setDatabaseMeta(final DatabaseMeta databaseMeta) { this.databaseMeta = databaseMeta; } public void setCondition(final Condition condition) { this.condition = condition; } } }