/*! * 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.pur; import org.junit.Test; import org.pentaho.di.base.AbstractMeta; import org.pentaho.di.core.exception.KettleException; import org.pentaho.di.job.JobMeta; import org.pentaho.di.repository.RepositoryDirectoryInterface; import org.pentaho.di.trans.TransMeta; import org.pentaho.platform.api.repository2.unified.VersionSummary; import java.util.Arrays; import java.util.List; import static org.hamcrest.CoreMatchers.hasItem; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; public class PurRepository_MoveAndRename_IT extends PurRepositoryTestBase { private final JobAssistant jobAssistant = new JobAssistant(); private final TransAssistant transAssistant = new TransAssistant(); public PurRepository_MoveAndRename_IT( Boolean lazyRepo ) { super( lazyRepo ); } @Test public void renameJob_Successfully() throws Exception { rename_Successfully( jobAssistant ); } @Test public void renameTrans_Successfully() throws Exception { rename_Successfully( transAssistant ); } private void rename_Successfully( Assistant assistant ) throws Exception { final String initial = "rename_Successfully"; final String renamed = initial + "_renamed"; AbstractMeta meta = assistant.createNew(); RepositoryDirectoryInterface directory = getPublicDir(); assistant.save( meta, initial, directory ); assistant.rename( meta, renamed ); } @Test public void renameJob_CreatesNewRevision() throws Exception { rename_CreatesNewRevision( jobAssistant ); } @Test public void renameTrans_CreatesNewRevision() throws Exception { rename_CreatesNewRevision( transAssistant ); } private void rename_CreatesNewRevision( Assistant assistant ) throws Exception { final String initial = "rename_CreatesNewRevision"; final String renamed = initial + "_renamed"; AbstractMeta meta = assistant.createNew(); assistant.save( meta, initial, getPublicDir() ); List<VersionSummary> historyBefore = unifiedRepository.getVersionSummaries( meta.getObjectId().getId() ); long before = System.currentTimeMillis(); assistant.rename( meta, renamed ); long after = System.currentTimeMillis(); List<VersionSummary> historyAfter = unifiedRepository.getVersionSummaries( meta.getObjectId().getId() ); assertEquals( historyBefore.size() + 1, historyAfter.size() ); long newRevisionTs = historyAfter.get( historyAfter.size() - 1 ).getDate().getTime(); assertTrue( String.format( "%d <= %d <= %d", before, newRevisionTs, after ), ( before <= newRevisionTs ) && ( newRevisionTs <= after ) ); } @Test( expected = KettleException.class ) public void renameJob_FailsIfANameConflictOccurs() throws Exception { rename_FailsIfANameConflictOccurs( jobAssistant ); } @Test( expected = KettleException.class ) public void renameTrans_FailsIfANameConflictOccurs() throws Exception { rename_FailsIfANameConflictOccurs( transAssistant ); } private void rename_FailsIfANameConflictOccurs( Assistant assistant ) throws Exception { final String name = "rename_FailsIfANameConflictOccurs"; AbstractMeta meta = assistant.createNew(); assistant.save( meta, name, getPublicDir() ); assistant.rename( meta, name ); } @Test public void moveJob_Successfully() throws Exception { move_Successfully( jobAssistant ); } @Test public void moveTrans_Successfully() throws Exception { move_Successfully( transAssistant ); } private void move_Successfully( Assistant assistant ) throws Exception { final String filename = "move_Successfully"; AbstractMeta meta = assistant.createNew(); assistant.save( meta, filename, getPublicDir() ); RepositoryDirectoryInterface destFolder = getDirInsidePublic( filename ); assertNotNull( destFolder ); assistant.move( meta, destFolder ); } @Test public void moveJob_DoesNotCreateRevision() throws Exception { move_DoesNotCreateRevision( jobAssistant ); } @Test public void moveTrans_DoesNotCreateRevision() throws Exception { move_DoesNotCreateRevision( transAssistant ); } private void move_DoesNotCreateRevision( Assistant assistant ) throws Exception { final String fileName = "move_DoesNotCreateRevision"; AbstractMeta meta = assistant.createNew(); assistant.save( meta, fileName, getPublicDir() ); List<VersionSummary> historyBefore = unifiedRepository.getVersionSummaries( meta.getObjectId().getId() ); purRepository.renameTransformation( meta.getObjectId(), getDirInsidePublic( fileName ), null ); List<VersionSummary> historyAfter = unifiedRepository.getVersionSummaries( meta.getObjectId().getId() ); assertEquals( historyBefore.size(), historyAfter.size() ); } @Test( expected = KettleException.class ) public void moveJob_FailsIfANameConflictOccurs() throws Exception { move_FailsIfANameConflictOccurs( jobAssistant ); } @Test( expected = KettleException.class ) public void moveTrans_FailsIfANameConflictOccurs() throws Exception { move_FailsIfANameConflictOccurs( transAssistant ); } private void move_FailsIfANameConflictOccurs( Assistant assistant ) throws Exception { final String fileName = "move_FailsIfANameConflictOccurs"; AbstractMeta meta = assistant.createNew(); AbstractMeta anotherMeta = assistant.createNew(); RepositoryDirectoryInterface directory = getPublicDir(); assistant.save( meta, fileName, directory ); RepositoryDirectoryInterface destFolder = getDirInsidePublic( fileName ); assistant.save( anotherMeta, fileName, destFolder ); assistant.move( meta, destFolder ); } @Test public void moveAndRenameJob_Successfully() throws Exception { moveAndRename_Successfully( jobAssistant ); } @Test public void moveAndRenameTrans_Successfully() throws Exception { moveAndRename_Successfully( transAssistant ); } private void moveAndRename_Successfully( Assistant assistant ) throws Exception { final String fileName = "moveAndRename_Successfully"; final String renamed = fileName + "_renamed"; AbstractMeta meta = assistant.createNew(); assistant.save( meta, fileName, getPublicDir() ); RepositoryDirectoryInterface destFolder = getDirInsidePublic( fileName ); assertNotNull( destFolder ); assistant.rename( meta, destFolder, renamed ); } @Test( expected = KettleException.class ) public void moveAndRenameTrans_FailsIfANameConflictOccurs() throws Exception { moveAndRename_FailsIfANameConflictOccurs( transAssistant ); } @Test( expected = KettleException.class ) public void moveAndRenameJob_FailsIfANameConflictOccurs() throws Exception { moveAndRename_FailsIfANameConflictOccurs( jobAssistant ); } private void moveAndRename_FailsIfANameConflictOccurs( Assistant assistant ) throws Exception { final String fileName = "moveAndRename_FailsIfANameConflictOccurs"; final String renamed = fileName + "_renamed"; AbstractMeta meta = assistant.createNew(); AbstractMeta anotherMeta = assistant.createNew(); RepositoryDirectoryInterface directory = getPublicDir(); assistant.save( meta, fileName, directory ); RepositoryDirectoryInterface destFolder = getDirInsidePublic( fileName ); assistant.save( anotherMeta, renamed, destFolder ); assistant.rename( meta, destFolder, renamed ); } private RepositoryDirectoryInterface getPublicDir() throws Exception { return purRepository.findDirectory( "public" ); } private RepositoryDirectoryInterface getDirInsidePublic( String dirName ) throws Exception { RepositoryDirectoryInterface child = getPublicDir().findChild( dirName ); return ( child == null ) ? purRepository.createRepositoryDirectory( getPublicDir(), dirName ) : child; } private abstract class Assistant { public abstract AbstractMeta createNew(); abstract String getType(); public void save( AbstractMeta meta, String name, RepositoryDirectoryInterface directory ) throws Exception { assertNotNull( directory ); meta.setName( name ); meta.setRepositoryDirectory( directory ); purRepository.save( meta, null, null ); assertExistsIn( directory, name, getType() + " was not saved" ); } void assertExistsIn( RepositoryDirectoryInterface dir, String name, String message ) throws Exception { List<String> existing = getNames( dir ); assertThat( message, existing, hasItem( name ) ); } abstract List<String> getNames( RepositoryDirectoryInterface dir ) throws Exception; public void rename( AbstractMeta meta, String newName ) throws Exception { rename( meta, meta.getRepositoryDirectory(), newName ); } public void move( AbstractMeta meta, RepositoryDirectoryInterface destFolder ) throws Exception { rename( meta, destFolder, null ); } public void rename( AbstractMeta meta, RepositoryDirectoryInterface destFolder, String newName ) throws Exception { doRename( meta, destFolder, newName ); String checkedName = ( newName == null ) ? meta.getName() : newName; assertExistsIn( destFolder, checkedName, getType() + " was not renamed" ); } abstract void doRename( AbstractMeta meta, RepositoryDirectoryInterface destFolder, String newName ) throws Exception; } private class JobAssistant extends Assistant { @Override public JobMeta createNew() { return new JobMeta(); } @Override String getType() { return "Job"; } @Override void doRename( AbstractMeta meta, RepositoryDirectoryInterface destFolder, String newName ) throws Exception { purRepository.renameJob( meta.getObjectId(), destFolder, newName ); } @Override List<String> getNames( RepositoryDirectoryInterface dir ) throws Exception { return Arrays.asList( purRepository.getJobNames( dir.getObjectId(), false ) ); } } private class TransAssistant extends Assistant { @Override public TransMeta createNew() { return new TransMeta(); } @Override public String getType() { return "Trans"; } @Override void doRename( AbstractMeta meta, RepositoryDirectoryInterface destFolder, String newName ) throws Exception { purRepository.renameTransformation( meta.getObjectId(), destFolder, newName ); } @Override List<String> getNames( RepositoryDirectoryInterface dir ) throws Exception { return Arrays.asList( purRepository.getTransformationNames( dir.getObjectId(), false ) ); } } }