/*
* This program is free software; you can redistribute it and/or modify it under the
* terms of the GNU General Public License, version 2 as published by the Free Software
* Foundation.
*
* You should have received a copy of the GNU General Public License along with this
* program; if not, you can obtain a copy at http://www.gnu.org/licenses/gpl-2.0.html
* or from the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*
* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU General Public License for more details.
*
*
* Copyright 2006 - 2013 Pentaho Corporation. All rights reserved.
*/
package org.pentaho.platform.repository2.unified;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOUtils;
import org.apache.jackrabbit.api.JackrabbitWorkspace;
import org.apache.jackrabbit.api.security.authorization.PrivilegeManager;
import org.junit.*;
import org.junit.runner.RunWith;
import org.pentaho.platform.api.engine.IAuthorizationPolicy;
import org.pentaho.platform.api.engine.IPentahoSession;
import org.pentaho.platform.api.engine.security.userroledao.IPentahoRole;
import org.pentaho.platform.api.engine.security.userroledao.IPentahoUser;
import org.pentaho.platform.api.engine.security.userroledao.IUserRoleDao;
import org.pentaho.platform.api.locale.IPentahoLocale;
import org.pentaho.platform.api.mt.ITenant;
import org.pentaho.platform.api.mt.ITenantManager;
import org.pentaho.platform.api.mt.ITenantedPrincipleNameResolver;
import org.pentaho.platform.api.repository2.unified.*;
import org.pentaho.platform.api.repository2.unified.RepositoryFileAcl.Builder;
import org.pentaho.platform.api.repository2.unified.RepositoryFileSid.Type;
import org.pentaho.platform.api.repository2.unified.data.node.DataNode;
import org.pentaho.platform.api.repository2.unified.data.node.DataNode.DataPropertyType;
import org.pentaho.platform.api.repository2.unified.data.node.DataNodeRef;
import org.pentaho.platform.api.repository2.unified.data.node.DataProperty;
import org.pentaho.platform.api.repository2.unified.data.node.NodeRepositoryFileData;
import org.pentaho.platform.api.repository2.unified.data.sample.SampleRepositoryFileData;
import org.pentaho.platform.api.repository2.unified.data.simple.SimpleRepositoryFileData;
import org.pentaho.platform.core.mt.Tenant;
import org.pentaho.platform.engine.core.system.PentahoSessionHolder;
import org.pentaho.platform.engine.core.system.StandaloneSession;
import org.pentaho.platform.repository.RepositoryFilenameUtils;
import org.pentaho.platform.repository2.ClientRepositoryPaths;
import org.pentaho.platform.repository2.locale.PentahoLocale;
import org.pentaho.platform.repository2.unified.jcr.*;
import org.pentaho.platform.repository2.unified.jcr.JcrRepositoryDumpToFile.Mode;
import org.pentaho.platform.repository2.unified.jcr.jackrabbit.security.TestPrincipalProvider;
import org.pentaho.platform.repository2.unified.jcr.sejcr.CredentialsStrategy;
import org.pentaho.platform.security.policy.rolebased.IRoleAuthorizationPolicyRoleBindingDao;
import org.pentaho.platform.security.policy.rolebased.RoleBindingStruct;
import org.pentaho.platform.security.policy.rolebased.actions.*;
import org.pentaho.platform.security.userroledao.DefaultTenantedPrincipleNameResolver;
import org.pentaho.test.platform.engine.core.MicroPlatform;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.extensions.jcr.JcrCallback;
import org.springframework.extensions.jcr.JcrTemplate;
import org.springframework.extensions.jcr.SessionFactory;
import org.springframework.security.AccessDeniedException;
import org.springframework.security.Authentication;
import org.springframework.security.GrantedAuthority;
import org.springframework.security.GrantedAuthorityImpl;
import org.springframework.security.context.SecurityContextHolder;
import org.springframework.security.providers.UsernamePasswordAuthenticationToken;
import org.springframework.security.userdetails.User;
import org.springframework.security.userdetails.UserDetails;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.support.TransactionCallbackWithoutResult;
import org.springframework.transaction.support.TransactionTemplate;
import javax.jcr.Repository;
import javax.jcr.RepositoryException;
import javax.jcr.Session;
import javax.jcr.Workspace;
import javax.jcr.security.AccessControlException;
import javax.jcr.security.Privilege;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.IOException;
import java.io.Serializable;
import java.text.SimpleDateFormat;
import java.util.*;
import static org.junit.Assert.*;
/**
* Integration test. Tests {@link org.pentaho.platform.repository2.unified.DefaultUnifiedRepository} and {@link org.pentaho.platform.api.engine.IAuthorizationPolicy} fully configured
* behind Spring Security's method security and Spring's transaction interceptor.
*
* <p>
* Note the RunWith annotation that uses a special runner that knows how to setup a Spring application context. The
* application context config files are listed in the ContextConfiguration annotation. By implementing
* {@link org.springframework.context.ApplicationContextAware}, this unit test can access various beans defined in the application context,
* including the bean under test.
* </p>
*
* @author mlowery
*/
@Ignore
@RunWith( SpringJUnit4ClassRunner.class )
@ContextConfiguration( locations = { "classpath:/repository.spring.xml",
"classpath:/repository-test-override.spring.xml" } )
@SuppressWarnings( "nls" )
public class DefaultUnifiedRepositorySpecialCharacterTest implements ApplicationContextAware {
// ~ Static fields/initializers
// ======================================================================================
private static final String NAMESPACE_REPOSITORY = "org.pentaho.repository";
private static final String NAMESPACE_SECURITY = "org.pentaho.security";
private static final String NAMESPACE_SCHEDULER = "org.pentaho.scheduler";
private static final String NAMESPACE_PENTAHO = "org.pentaho";
private static final String NAMESPACE_DOESNOTEXIST = "doesnotexist";
private static final String RUNTIME_ROLE_ACME_ADMIN = "acme_Admin";
private static final String RUNTIME_ROLE_ACME_AUTHENTICATED = "acme_Authenticated";
private final String USERNAME_SUZY = "suzy";
private final String USERNAME_TIFFANY = "tiffany";
private final String USERNAME_PAT = "pat";
private final String USERNAME_ADMIN = "admin";
private final String USERNAME_GEORGE = "george";
private final String TENANT_ID_ACME = "acme";
private final String TENANT_ID_DUFF = "duff";
// ~ Instance fields
// =================================================================================================
private ITenantManager tenantManager;
private IUnifiedRepository repo;
private String repositoryAdminUsername;
private IBackingRepositoryLifecycleManager repositoryLifecyleManager;
private IBackingRepositoryLifecycleManager defaultBackingRepositoryLifecycleManager;
/**
* Used for state verification and test cleanup.
*/
private JcrTemplate testJcrTemplate;
private JcrTemplate jcrTemplate;
private IRoleAuthorizationPolicyRoleBindingDao roleBindingDao;
private IRoleAuthorizationPolicyRoleBindingDao roleBindingDaoTarget;
private IRepositoryFileDao repositoryFileDao;
private IAuthorizationPolicy authorizationPolicy;
private MicroPlatform mp;
private ITenantedPrincipleNameResolver userNameUtils = new DefaultTenantedPrincipleNameResolver();
private ITenantedPrincipleNameResolver roleNameUtils = new DefaultTenantedPrincipleNameResolver(
DefaultTenantedPrincipleNameResolver.ALTERNATE_DELIMETER );
private String superAdminRoleName;
private String tenantAdminRoleName;
private String tenantAuthenticatedRoleName;
private String sysAdminUserName;
private ITenant systemTenant;
private IPathConversionHelper pathConversionHelper;
IUserRoleDao userRoleDao;
IUserRoleDao testUserRoleDao;
IRepositoryFileAclDao repositoryFileAclDao;
private static TransactionTemplate jcrTransactionTemplate;
private TransactionTemplate txnTemplate;
// ~ Constructors
// ====================================================================================================
public DefaultUnifiedRepositorySpecialCharacterTest() throws Exception {
super();
}
// ~ Methods
// =========================================================================================================
@BeforeClass
public static void setUpClass() throws Exception {
// folder cannot be deleted at teardown shutdown hooks have not yet necessarily completed
// parent folder must match jcrRepository.homeDir bean property in repository-test-override.spring.xml
FileUtils.deleteDirectory( new File( "/tmp/jackrabbit-test-TRUNK" ) );
PentahoSessionHolder.setStrategyName( PentahoSessionHolder.MODE_GLOBAL );
}
@AfterClass
public static void tearDownClass() throws Exception {
PentahoSessionHolder.setStrategyName( PentahoSessionHolder.MODE_INHERITABLETHREADLOCAL );
}
@Before
public void setUp() throws Exception {
loginAsRepositoryAdmin();
SimpleJcrTestUtils.deleteItem( testJcrTemplate, ServerRepositoryPaths.getPentahoRootFolderPath() );
mp = new MicroPlatform();
// used by DefaultPentahoJackrabbitAccessControlHelper
mp.defineInstance( "tenantedUserNameUtils", userNameUtils );
mp.defineInstance( "tenantedRoleNameUtils", roleNameUtils );
mp.defineInstance("ILockHelper", new DefaultLockHelper(userNameUtils));
mp.defineInstance( IAuthorizationPolicy.class, authorizationPolicy );
mp.defineInstance( ITenantManager.class, tenantManager );
mp.defineInstance( "roleAuthorizationPolicyRoleBindingDaoTarget", roleBindingDaoTarget );
mp.defineInstance( "repositoryAdminUsername", repositoryAdminUsername );
mp.defineInstance("RepositoryFileProxyFactory", new RepositoryFileProxyFactory(this.jcrTemplate, this.repositoryFileDao));
mp.defineInstance("ITenantedPrincipleNameResolver", new DefaultTenantedPrincipleNameResolver());
// Start the micro-platform
mp.start();
loginAsRepositoryAdmin();
setAclManagement();
systemTenant =
tenantManager.createTenant( null, ServerRepositoryPaths.getPentahoRootFolderName(), tenantAdminRoleName,
tenantAuthenticatedRoleName, "Anonymous" );
userRoleDao.createUser( systemTenant, sysAdminUserName, "password", "", new String[] { tenantAdminRoleName } );
logout();
}
private void setAclManagement() {
testJcrTemplate.execute( new JcrCallback() {
@Override
public Object doInJcr( Session session ) throws IOException, RepositoryException {
PentahoJcrConstants pentahoJcrConstants = new PentahoJcrConstants( session );
Workspace workspace = session.getWorkspace();
PrivilegeManager privilegeManager = ( (JackrabbitWorkspace) workspace ).getPrivilegeManager();
try {
privilegeManager.getPrivilege( pentahoJcrConstants.getPHO_ACLMANAGEMENT_PRIVILEGE() );
} catch ( AccessControlException ace ) {
privilegeManager.registerPrivilege( pentahoJcrConstants.getPHO_ACLMANAGEMENT_PRIVILEGE(), false,
new String[0] );
}
session.save();
return null;
}
} );
}
private void cleanupUserAndRoles( final ITenant tenant ) {
loginAsRepositoryAdmin();
for ( IPentahoRole role : testUserRoleDao.getRoles( tenant ) ) {
testUserRoleDao.deleteRole( role );
}
for ( IPentahoUser user : testUserRoleDao.getUsers( tenant ) ) {
testUserRoleDao.deleteUser( user );
}
}
@After
public void tearDown() throws Exception {
// null out fields to get back memory
authorizationPolicy = null;
login( sysAdminUserName, systemTenant, new String[] { tenantAdminRoleName, tenantAuthenticatedRoleName } );
ITenant tenant =
tenantManager.getTenant( "/" + ServerRepositoryPaths.getPentahoRootFolderName() + "/" + TENANT_ID_ACME );
if ( tenant != null ) {
cleanupUserAndRoles( tenant );
}
login( sysAdminUserName, systemTenant, new String[] { tenantAdminRoleName, tenantAuthenticatedRoleName } );
tenant = tenantManager.getTenant( "/" + ServerRepositoryPaths.getPentahoRootFolderName() + "/" + TENANT_ID_DUFF );
if ( tenant != null ) {
cleanupUserAndRoles( tenant );
}
cleanupUserAndRoles( systemTenant );
SimpleJcrTestUtils.deleteItem( testJcrTemplate, ServerRepositoryPaths.getPentahoRootFolderPath() );
logout();
repositoryAdminUsername = null;
tenantAdminRoleName = null;
tenantAuthenticatedRoleName = null;
roleBindingDao = null;
authorizationPolicy = null;
testJcrTemplate = null;
tenantManager = null;
repo = null;
repositoryLifecyleManager = null;
defaultBackingRepositoryLifecycleManager = null;
roleBindingDaoTarget = null;
repositoryFileDao = null;
authorizationPolicy = null;
mp = null;
superAdminRoleName = null;
tenantAdminRoleName = null;
tenantAuthenticatedRoleName = null;
sysAdminUserName = null;
systemTenant = null;
pathConversionHelper = null;
userRoleDao = null;
testUserRoleDao = null;
repositoryFileAclDao = null;
jcrTransactionTemplate = null;
txnTemplate = null;
}
@Test
public void testOnStartup() throws Exception {
loginAsSysTenantAdmin();
// make sure pentaho root folder exists
final String rootFolderPath = ServerRepositoryPaths.getPentahoRootFolderPath();
assertNotNull( SimpleJcrTestUtils.getItem( testJcrTemplate, rootFolderPath ) );
}
@Test
public void testGetFileWithLoadedMaps() throws Exception {
login( sysAdminUserName, systemTenant, new String[] { tenantAdminRoleName, tenantAuthenticatedRoleName } );
ITenant tenantAcme =
tenantManager.createTenant( systemTenant, TENANT_ID_ACME, tenantAdminRoleName, tenantAuthenticatedRoleName,
"Anonymous" );
userRoleDao.createUser( tenantAcme, USERNAME_SUZY, "password", "", new String[] { tenantAdminRoleName } );
logout();
login( USERNAME_SUZY, tenantAcme, new String[] { tenantAdminRoleName, tenantAuthenticatedRoleName } );
final String fileName = "helloworld.[~!@#$%^&*(){}|.,]-=_+|;'?<>~`.sample";
RepositoryFile newFile =
createSampleFile( ClientRepositoryPaths.getUserHomeFolderPath( USERNAME_SUZY ), fileName, "blah", false, 123 );
assertEquals( fileName, newFile.getTitle() );
RepositoryFile.Builder builder = new RepositoryFile.Builder( newFile );
final String EN_US_VALUE = "Hello World Sample";
builder.title( Locale.getDefault().toString(), EN_US_VALUE );
final String ROOT_LOCALE_VALUE = "Hello World";
builder.title( RepositoryFile.DEFAULT_LOCALE, ROOT_LOCALE_VALUE );
final SampleRepositoryFileData modContent = new SampleRepositoryFileData( "blah", false, 123 );
repo.updateFile( builder.build(), modContent, null );
RepositoryFile updatedFileWithMaps =
repo.getFile( ClientRepositoryPaths.getUserHomeFolderPath( USERNAME_SUZY ) + RepositoryFile.SEPARATOR
+ "helloworld.[~!@#$%^&*(){}|.,]-=_+|;'?<>~`.sample", true );
assertEquals( EN_US_VALUE, updatedFileWithMaps.getLocalePropertiesMap().get( Locale.getDefault().toString() )
.getProperty( RepositoryFile.FILE_TITLE ) );
assertEquals( ROOT_LOCALE_VALUE, updatedFileWithMaps.getLocalePropertiesMap().get( RepositoryFile.DEFAULT_LOCALE )
.getProperty( RepositoryFile.FILE_TITLE ) );
logout();
}
@Test
public void testLocales() throws Exception {
login( sysAdminUserName, systemTenant, new String[] { tenantAdminRoleName, tenantAuthenticatedRoleName } );
ITenant tenantAcme =
tenantManager.createTenant( systemTenant, TENANT_ID_ACME, tenantAdminRoleName, tenantAuthenticatedRoleName,
"Anonymous" );
userRoleDao.createUser( tenantAcme, USERNAME_SUZY, "password", "", new String[] { tenantAdminRoleName } );
logout();
login( USERNAME_SUZY, tenantAcme, new String[] { tenantAdminRoleName, tenantAuthenticatedRoleName } );
// Create file
final String fileName = "locale.[~!@#$%^&*(){}|.,]-=_+|;'?<>~`.sample";
RepositoryFile file =
createSampleFile( ClientRepositoryPaths.getUserHomeFolderPath( USERNAME_SUZY ), fileName, "test", false, 123 );
// Test filename title matches created file name
assertEquals( fileName, file.getTitle() );
final IPentahoLocale SPANISH = new PentahoLocale( new Locale( "es" ) );
final IPentahoLocale US = new PentahoLocale( Locale.US );
final String EN_US_TITLE = "Locale Sample";
final String EN_US_DESCRIPTION = "This is a test for retrieving localized words";
final String SP_TITLE = "Muestra de Localizacion";
final String SP_DESCRIPTION = "Esta es una prueba para buscar palabras localizadas";
RepositoryFile.Builder builder = new RepositoryFile.Builder( file );
// Set English locale values
builder.title( US.toString(), EN_US_TITLE );
builder.description( US.toString(), EN_US_DESCRIPTION );
// Set Spanish locale values
builder.title( SPANISH.toString(), SP_TITLE );
builder.description( SPANISH.toString(), SP_DESCRIPTION );
// Update file data
final SampleRepositoryFileData modContent = new SampleRepositoryFileData( "blah", false, 123 );
repo.updateFile( builder.build(), modContent, null );
// Retrieve file - gets full map
RepositoryFile updatedFile = repo.getFile( file.getPath(), true );
/*
* Retrieve single result with locale
*/
// SPANISH
updatedFile = repo.getFile( file.getPath(), SPANISH );
assertEquals( SP_TITLE, updatedFile.getTitle() );
assertEquals( SP_DESCRIPTION, updatedFile.getDescription() );
// US ENGLISH
updatedFile = repo.getFile( file.getPath(), US );
assertEquals( EN_US_TITLE, updatedFile.getTitle() );
assertEquals( EN_US_DESCRIPTION, updatedFile.getDescription() );
// ROOT Locale
updatedFile = repo.getFile( file.getPath(), null );
assertEquals( EN_US_TITLE, updatedFile.getTitle() );
assertEquals( EN_US_DESCRIPTION, updatedFile.getDescription() );
logout();
}
@Test
public void testLocalePropertiesMap() throws Exception {
login( sysAdminUserName, systemTenant, new String[] { tenantAdminRoleName, tenantAuthenticatedRoleName } );
ITenant tenantAcme =
tenantManager.createTenant( systemTenant, TENANT_ID_ACME, tenantAdminRoleName, tenantAuthenticatedRoleName,
"Anonymous" );
userRoleDao.createUser( tenantAcme, USERNAME_SUZY, "password", "", new String[] { tenantAdminRoleName } );
logout();
login( USERNAME_SUZY, tenantAcme, new String[] { tenantAdminRoleName, tenantAuthenticatedRoleName } );
// Create file
final String fileName = "locale.[~!@#$%^&*(){}|.,]-=_+|;'?<>~`.sample";
RepositoryFile file =
createSampleFile( ClientRepositoryPaths.getUserHomeFolderPath( USERNAME_SUZY ), fileName, "test", false, 123 );
// Test filename title matches created file name
assertEquals( fileName, file.getTitle() );
final String DEFAULT_LOCALE = "default";
final IPentahoLocale SPANISH = new PentahoLocale( new Locale( "es" ) );
final IPentahoLocale US = new PentahoLocale( Locale.US );
final String TITLE = "title";
final String DESCRIPTION = "description";
final String EN_US_TITLE = "Locale Sample";
final String EN_US_DESCRIPTION = "This is a test for retrieving localized words";
final String SP_TITLE = "Muestra de Localizacion";
final String SP_DESCRIPTION = "Esta es una prueba para buscar palabras localizadas";
RepositoryFile.Builder builder = new RepositoryFile.Builder( file );
Map<String, Properties> localeMap = new HashMap<String, Properties>();
// Set English locale values
final Properties enProperties = new Properties();
enProperties.setProperty( TITLE, EN_US_TITLE );
enProperties.setProperty( DESCRIPTION, EN_US_DESCRIPTION );
localeMap.put( US.toString(), enProperties );
// Set Spanish locale values
final Properties esProperties = new Properties();
esProperties.setProperty( TITLE, SP_TITLE );
esProperties.setProperty( DESCRIPTION, SP_DESCRIPTION );
localeMap.put( SPANISH.toString(), esProperties );
builder.localePropertiesMap( localeMap );
// Update file data
final SampleRepositoryFileData modContent = new SampleRepositoryFileData( "blah", false, 123 );
repo.updateFile( builder.build(), modContent, null );
// Retrieve file - gets full map
final RepositoryFile updatedFile = repo.getFile( file.getPath(), true );
// Assert messages are the same
Properties ep = updatedFile.getLocalePropertiesMap().get( US.toString() );
assertEquals( EN_US_TITLE, ep.getProperty( TITLE ) );
assertEquals( EN_US_DESCRIPTION, ep.getProperty( DESCRIPTION ) );
Properties sp = updatedFile.getLocalePropertiesMap().get( SPANISH.toString() );
assertEquals( SP_TITLE, sp.getProperty( TITLE ) );
assertEquals( SP_DESCRIPTION, sp.getProperty( DESCRIPTION ) );
// Assert empty rootLocale
Properties rootLocale = updatedFile.getLocalePropertiesMap().get( DEFAULT_LOCALE );
assertNotNull( rootLocale );
final String NEW_TITLE = "new title";
final String NEW_DESCRIPTION = "new description";
enProperties.setProperty( TITLE, NEW_TITLE ); // overwrite title
enProperties.setProperty( DESCRIPTION, NEW_DESCRIPTION ); // overwrite title
txnTemplate.execute( new TransactionCallbackWithoutResult() {
public void doInTransactionWithoutResult( final TransactionStatus status ) {
// assert available locales
List<Locale> locales = repositoryFileDao.getAvailableLocalesForFile( updatedFile );
assertEquals( 3, locales.size() ); // includes rootLocale
// assert correct locale properties
Properties properties = repositoryFileDao.getLocalePropertiesForFile( updatedFile, "es" );
assertEquals( SP_TITLE, properties.getProperty( TITLE ) );
assertEquals( SP_DESCRIPTION, properties.getProperty( DESCRIPTION ) );
repositoryFileDao.setLocalePropertiesForFile( updatedFile, Locale.US.getLanguage(), enProperties );
}
} );
// Assert updated properties
RepositoryFile updatedRepoFile = repo.getFile( file.getPath(), true );
Properties updated_en = updatedRepoFile.getLocalePropertiesMap().get( US.toString() );
assertEquals( NEW_TITLE, updated_en.getProperty( TITLE ) );
assertEquals( NEW_DESCRIPTION, updated_en.getProperty( DESCRIPTION ) );
// test successful delete locale properties
final RepositoryFile repoFile1 = updatedRepoFile.clone();
txnTemplate.execute( new TransactionCallbackWithoutResult() {
public void doInTransactionWithoutResult( final TransactionStatus status ) {
repositoryFileDao.deleteLocalePropertiesForFile( repoFile1, "es" );
}
} );
// assert deleted locale
updatedRepoFile = repo.getFile( file.getPath(), true );
List<Locale> locales = repositoryFileDao.getAvailableLocalesForFile( updatedRepoFile );
assertEquals( 2, locales.size() );
// test successful delete locale properties
final RepositoryFile repoFile2 = updatedRepoFile.clone();
txnTemplate.execute( new TransactionCallbackWithoutResult() {
public void doInTransactionWithoutResult( final TransactionStatus status ) {
repositoryFileDao.deleteLocalePropertiesForFile( repoFile2, "xx" );
}
} );
// locale properties do not exist, no change in available locales
updatedRepoFile = repo.getFile( file.getPath(), true );
locales = repositoryFileDao.getAvailableLocalesForFile( updatedRepoFile );
assertEquals( 2, locales.size() );
logout();
}
/**
* While they may be filtered from the version history, we still must be able to fetch acl-only changes.
*/
@Test
public void testGetAclOnlyVersion() throws Exception {
login( sysAdminUserName, systemTenant, new String[] { tenantAdminRoleName, tenantAuthenticatedRoleName } );
ITenant tenantAcme =
tenantManager.createTenant( systemTenant, TENANT_ID_ACME, tenantAdminRoleName, tenantAuthenticatedRoleName,
"Anonymous" );
userRoleDao.createUser( tenantAcme, USERNAME_ADMIN, "password", "", new String[] { tenantAdminRoleName } );
userRoleDao.createUser( tenantAcme, USERNAME_SUZY, "password", "", null );
login( USERNAME_SUZY, tenantAcme, new String[] { tenantAuthenticatedRoleName } );
login( USERNAME_ADMIN, tenantAcme, new String[] { tenantAdminRoleName, tenantAuthenticatedRoleName } );
defaultBackingRepositoryLifecycleManager.newTenant();
final String fileName = "helloworld.[~!@#$%^&*(){}|.,]-=_+|;'?<>~`.sample";
RepositoryFile newFile =
createSampleFile( ClientRepositoryPaths.getUserHomeFolderPath( USERNAME_SUZY ), fileName, "blah", false, 123,
true );
assertEquals( 1, repo.getVersionSummaries( newFile.getId() ).size() );
RepositoryFileAcl acl = repo.getAcl( newFile.getId() );
// no change; just want to create a new version
RepositoryFileAcl updatedAcl = new Builder( acl ).build();
updatedAcl = repo.updateAcl( updatedAcl );
assertEquals( 2, repo.getVersionSummaries( newFile.getId() ).size() );
assertNotNull( repo.getVersionSummary( newFile.getId(), "1.1" ) );
}
@Test
public void testCreateFolder() throws Exception {
login( sysAdminUserName, systemTenant, new String[] { tenantAdminRoleName, tenantAuthenticatedRoleName } );
ITenant tenantAcme =
tenantManager.createTenant( systemTenant, TENANT_ID_ACME, tenantAdminRoleName, tenantAuthenticatedRoleName,
"Anonymous" );
userRoleDao.createUser( tenantAcme, USERNAME_ADMIN, "password", "", new String[] { tenantAdminRoleName } );
login( USERNAME_ADMIN, tenantAcme, new String[] { tenantAdminRoleName, tenantAuthenticatedRoleName } );
userRoleDao.createUser( tenantAcme, USERNAME_SUZY, "password", "", null );
login( USERNAME_SUZY, tenantAcme, new String[] { tenantAuthenticatedRoleName } );
RepositoryFile parentFolder = repo.getFile( ClientRepositoryPaths.getUserHomeFolderPath( USERNAME_SUZY ) );
RepositoryFile newFolder = new RepositoryFile.Builder( "[~!@#$%^&*(){}|.,]-=_+|;'?<:>~" ).folder( true ).hidden( true ).build();
Date beginTime = Calendar.getInstance().getTime();
// Sleep for 1 second for time comparison
Thread.sleep( 1000 );
newFolder = repo.createFolder( parentFolder.getId(), newFolder, null );
Thread.sleep( 1000 );
Date endTime = Calendar.getInstance().getTime();
assertTrue( beginTime.before( newFolder.getCreatedDate() ) );
assertTrue( endTime.after( newFolder.getCreatedDate() ) );
assertNotNull( newFolder );
assertNotNull( newFolder.getId() );
assertTrue( newFolder.isHidden() );
assertNotNull( SimpleJcrTestUtils.getItem( testJcrTemplate, ServerRepositoryPaths.getUserHomeFolderPath(
tenantAcme, USERNAME_SUZY )
+ "/[~!@#$%^&*(){}|.,]-=_+|;'?<:>~" ) );
}
@Test( expected = UnifiedRepositoryException.class )
public void testCreateFileAtRootIllegal() throws Exception {
login( sysAdminUserName, systemTenant, new String[] { tenantAdminRoleName, tenantAuthenticatedRoleName } );
ITenant tenantAcme =
tenantManager.createTenant( systemTenant, TENANT_ID_ACME, tenantAdminRoleName, tenantAuthenticatedRoleName,
"Anonymous" );
userRoleDao.createUser( tenantAcme, USERNAME_ADMIN, "password", "", new String[] { tenantAdminRoleName } );
login( USERNAME_ADMIN, tenantAcme, new String[] { tenantAdminRoleName, tenantAuthenticatedRoleName } );
userRoleDao.createUser( tenantAcme, USERNAME_SUZY, "password", "", null );
login( USERNAME_SUZY, tenantAcme, new String[] { tenantAuthenticatedRoleName } );
final String dataString = "Hello World!";
final String encoding = "UTF-8";
byte[] data = dataString.getBytes( encoding );
ByteArrayInputStream dataStream = new ByteArrayInputStream( data );
final String fileName = "helloworld.[~!@#$%^&*(){}|.,]-=_+|;'?<>~`.xaction";
final SimpleRepositoryFileData content = new SimpleRepositoryFileData( dataStream, encoding, "text/plain" );
repo.createFile( null, new RepositoryFile.Builder( fileName ).build(), content, null );
}
@Test
public void testCreateSimpleFile() throws Exception {
login( sysAdminUserName, systemTenant, new String[] { tenantAdminRoleName, tenantAuthenticatedRoleName } );
ITenant tenantAcme =
tenantManager.createTenant( systemTenant, TENANT_ID_ACME, tenantAdminRoleName, tenantAuthenticatedRoleName,
"Anonymous" );
userRoleDao.createUser( tenantAcme, USERNAME_ADMIN, "password", "", new String[] { tenantAdminRoleName } );
login( USERNAME_ADMIN, tenantAcme, new String[] { tenantAdminRoleName, tenantAuthenticatedRoleName } );
userRoleDao.createUser( tenantAcme, USERNAME_SUZY, "password", "", null );
login( USERNAME_SUZY, tenantAcme, new String[] { tenantAuthenticatedRoleName } );
RepositoryFile parentFolder = repo.getFile( ClientRepositoryPaths.getUserHomeFolderPath( USERNAME_SUZY ) );
final String expectedDataString = "Hello World!";
final String expectedEncoding = "UTF-8";
byte[] data = expectedDataString.getBytes( expectedEncoding );
ByteArrayInputStream dataStream = new ByteArrayInputStream( data );
final String expectedMimeType = "text/plain";
final String expectedName = "helloworld.[~!@#$%^&*(){}|.,]-=_+|;'?<>~`.xaction";
final String expectedAbsolutePath =
ClientRepositoryPaths.getUserHomeFolderPath( USERNAME_SUZY ) + "/helloworld.[~!@#$%^&*(){}|.,]-=_+|;'?<>~`.xaction";
final SimpleRepositoryFileData content =
new SimpleRepositoryFileData( dataStream, expectedEncoding, expectedMimeType );
Date beginTime = Calendar.getInstance().getTime();
Thread.sleep( 1000 ); // when the test runs too fast, begin and lastModifiedDate are the same; manual pause
Calendar cal = Calendar.getInstance( Locale.US );
SimpleDateFormat df = new SimpleDateFormat( "EEE, d MMM yyyy HH:mm:ss Z", Locale.US );
cal.setTime( df.parse( "Wed, 4 Jul 2000 12:08:56 -0700" ) );
RepositoryFile newFile =
repo.createFile( parentFolder.getId(), new RepositoryFile.Builder( expectedName ).hidden( true ).versioned(
true ).createdDate( cal.getTime() ).build(), content, null );
assertEquals( cal.getTime(), repo.getVersionSummaries( newFile.getId() ).get( 0 ).getDate() );
Date endTime = Calendar.getInstance().getTime();
assertTrue( beginTime.before( newFile.getLastModifiedDate() ) );
assertTrue( endTime.after( newFile.getLastModifiedDate() ) );
assertNotNull( newFile.getId() );
RepositoryFile foundFile = repo.getFile( expectedAbsolutePath );
assertNotNull( foundFile );
assertEquals( expectedName, foundFile.getName() );
assertEquals( expectedAbsolutePath, foundFile.getPath() );
assertNotNull( foundFile.getCreatedDate() );
assertNotNull( foundFile.getLastModifiedDate() );
assertTrue( foundFile.isHidden() );
assertTrue( foundFile.getFileSize() > 0 );
SimpleRepositoryFileData contentFromRepo = repo.getDataForRead( foundFile.getId(), SimpleRepositoryFileData.class );
assertEquals( expectedEncoding, contentFromRepo.getEncoding() );
assertEquals( expectedMimeType, contentFromRepo.getMimeType() );
assertEquals( expectedDataString, IOUtils.toString( contentFromRepo.getStream(), expectedEncoding ) );
}
@Test
public void testCreateSampleFile() throws Exception {
login( sysAdminUserName, systemTenant, new String[] { tenantAdminRoleName, tenantAuthenticatedRoleName } );
ITenant tenantAcme =
tenantManager.createTenant( systemTenant, TENANT_ID_ACME, tenantAdminRoleName, tenantAuthenticatedRoleName,
"Anonymous" );
userRoleDao.createUser( tenantAcme, USERNAME_ADMIN, "password", "", new String[] { tenantAdminRoleName } );
login( USERNAME_ADMIN, tenantAcme, new String[] { tenantAdminRoleName, tenantAuthenticatedRoleName } );
userRoleDao.createUser( tenantAcme, USERNAME_SUZY, "password", "", null );
login( USERNAME_SUZY, tenantAcme, new String[] { tenantAuthenticatedRoleName } );
final String expectedName = "helloworld.[~!@#$%^&*(){}|.,]-=_+|;'?<>~`.sample";
final String sampleString = "Ciao World!";
final boolean sampleBoolean = true;
final int sampleInteger = 99;
final String parentFolderPath = ClientRepositoryPaths.getUserHomeFolderPath( USERNAME_SUZY );
final String expectedAbsolutePath = parentFolderPath + RepositoryFile.SEPARATOR + expectedName;
RepositoryFile newFile =
createSampleFile( parentFolderPath, expectedName, sampleString, sampleBoolean, sampleInteger );
assertNotNull( newFile.getId() );
RepositoryFile foundFile = repo.getFile( expectedAbsolutePath );
assertNotNull( foundFile );
assertEquals( expectedName, foundFile.getName() );
assertEquals( expectedAbsolutePath, foundFile.getPath() );
assertNotNull( foundFile.getCreatedDate() );
assertNotNull( foundFile.getLastModifiedDate() );
SampleRepositoryFileData data = repo.getDataForRead( foundFile.getId(), SampleRepositoryFileData.class );
assertEquals( sampleString, data.getSampleString() );
assertEquals( sampleBoolean, data.getSampleBoolean() );
assertEquals( sampleInteger, data.getSampleInteger() );
}
@Test
public void testGetReferrers() throws Exception {
login( sysAdminUserName, systemTenant, new String[] { tenantAdminRoleName, tenantAuthenticatedRoleName } );
ITenant tenantAcme =
tenantManager.createTenant( systemTenant, TENANT_ID_ACME, tenantAdminRoleName, tenantAuthenticatedRoleName,
"Anonymous" );
userRoleDao.createUser( tenantAcme, USERNAME_ADMIN, "password", "", new String[] { tenantAdminRoleName } );
login( USERNAME_ADMIN, tenantAcme, new String[] { tenantAdminRoleName, tenantAuthenticatedRoleName } );
userRoleDao.createUser( tenantAcme, USERNAME_SUZY, "password", "", null );
login( USERNAME_SUZY, tenantAcme, new String[] { tenantAuthenticatedRoleName } );
final String refereeFileName = "referee.[~!@#$%^&*(){}|.,]-=_+|;'?<>~`.sample";
final String referrerFileName = "referrer.[~!@#$%^&*(){}|.,]-=_+|;'?<>~`.sample";
final String parentFolderPath = ClientRepositoryPaths.getUserHomeFolderPath( USERNAME_SUZY );
RepositoryFile parentFolder = repo.getFile( parentFolderPath );
RepositoryFile refereeFile = createSampleFile( parentFolderPath, refereeFileName, "dfdd", true, 83 );
DataNode node = new DataNode( "kdjd" );
node.setProperty( "ddf", "ljsdfkjsdkf" );
DataNode newChild1 = node.addNode( "herfkmdx" );
newChild1.setProperty( "urei2", new DataNodeRef( refereeFile.getId() ) );
NodeRepositoryFileData data = new NodeRepositoryFileData( node );
repo.createFile( parentFolder.getId(), new RepositoryFile.Builder( referrerFileName ).build(), data, null );
List<RepositoryFile> referrers = repo.getReferrers( refereeFile.getId() );
assertNotNull( referrers );
assertEquals( 1, referrers.size() );
assertEquals( referrers.get( 0 ).getName(), referrerFileName );
}
@Test
public void testCreateNodeFile() throws Exception {
login( sysAdminUserName, systemTenant, new String[] { tenantAdminRoleName, tenantAuthenticatedRoleName } );
ITenant tenantAcme =
tenantManager.createTenant( systemTenant, TENANT_ID_ACME, tenantAdminRoleName, tenantAuthenticatedRoleName,
"Anonymous" );
userRoleDao.createUser( tenantAcme, USERNAME_ADMIN, "password", "", new String[] { tenantAdminRoleName } );
login( USERNAME_ADMIN, tenantAcme, new String[] { tenantAdminRoleName, tenantAuthenticatedRoleName } );
userRoleDao.createUser( tenantAcme, USERNAME_SUZY, "password", "", null );
login( USERNAME_SUZY, tenantAcme, new String[] { tenantAuthenticatedRoleName } );
final String expectedName = "helloworld.[~!@#$%^&*(){}|.,]-=_+|;'?<>~`.doesnotmatter";
final String parentFolderPath = ClientRepositoryPaths.getUserHomeFolderPath( USERNAME_SUZY );
RepositoryFile parentFolder = repo.getFile( parentFolderPath );
final String expectedPath = parentFolderPath + RepositoryFile.SEPARATOR + expectedName;
final String serverPath =
ServerRepositoryPaths.getTenantRootFolderPath() + parentFolderPath + RepositoryFile.SEPARATOR
+ "helloworld2.[~!@#$%^&*(){}|.,]-=_+|;'?<>~`.sample";
RepositoryFile sampleFile = createSampleFile( parentFolderPath, "helloworld2.[~!@#$%^&*(){}|.,]-=_+|;'?<>~`.sample", "dfdd", true, 83 );
final Date EXP_DATE = new Date();
DataNode node = new DataNode( "kdjd" );
node.setProperty( "ddf", "ljsdfkjsdkf" );
DataNode newChild1 = node.addNode( "herfkmdx" );
newChild1.setProperty( "sdfs", true );
newChild1.setProperty( "ks3", EXP_DATE );
newChild1.setProperty( "ids32", 7.32D );
newChild1.setProperty( "erere3", 9856684583L );
newChild1.setProperty( "tttss4", "843skdfj33ksaljdfj" );
newChild1.setProperty( "urei2", new DataNodeRef( sampleFile.getId() ) );
DataNode newChild2 = node.addNode( RepositoryFilenameUtils.escape( "pppq/qqs2", repo.getReservedChars() ) );
newChild2.setProperty( RepositoryFilenameUtils.escape( "ttt:ss4", repo.getReservedChars() ), "843skdfj33ksaljdfj" );
NodeRepositoryFileData data = new NodeRepositoryFileData( node );
RepositoryFile newFile =
repo.createFile( parentFolder.getId(), new RepositoryFile.Builder( expectedName ).build(), data, null );
assertNotNull( newFile.getId() );
RepositoryFile foundFile = repo.getFile( expectedPath );
assertNotNull( foundFile );
assertEquals( expectedName, foundFile.getName() );
DataNode foundNode = repo.getDataForRead( foundFile.getId(), NodeRepositoryFileData.class ).getNode();
assertEquals( node.getName(), foundNode.getName() );
assertNotNull( foundNode.getId() );
assertEquals( node.getProperty( "ddf" ), foundNode.getProperty( "ddf" ) );
int actualPropCount = 0;
for ( DataProperty prop : foundNode.getProperties() ) {
actualPropCount++;
}
assertEquals( 1, actualPropCount );
assertTrue( foundNode.hasNode( "herfkmdx" ) );
DataNode foundChild1 = foundNode.getNode( "herfkmdx" );
assertNotNull( foundChild1.getId() );
assertEquals( newChild1.getName(), foundChild1.getName() );
assertEquals( newChild1.getProperty( "sdfs" ), foundChild1.getProperty( "sdfs" ) );
assertEquals( newChild1.getProperty( "ks3" ), foundChild1.getProperty( "ks3" ) );
assertEquals( newChild1.getProperty( "ids32" ), foundChild1.getProperty( "ids32" ) );
assertEquals( newChild1.getProperty( "erere3" ), foundChild1.getProperty( "erere3" ) );
assertEquals( newChild1.getProperty( "tttss4" ), foundChild1.getProperty( "tttss4" ) );
assertEquals( newChild1.getProperty( "urei2" ), foundChild1.getProperty( "urei2" ) );
try {
repo.deleteFile( sampleFile.getId(), true, null );
fail();
} catch ( UnifiedRepositoryException e ) {
// should fail due to referential integrity (newFile payload has reference to sampleFile)
}
actualPropCount = 0;
for ( DataProperty prop : newChild1.getProperties() ) {
actualPropCount++;
}
assertEquals( 6, actualPropCount );
assertTrue( foundNode.hasNode( RepositoryFilenameUtils.escape( "pppq/qqs2", repo.getReservedChars() ) ) );
DataNode foundChild2 = foundNode.getNode( RepositoryFilenameUtils.escape( "pppq/qqs2", repo.getReservedChars() ) );
assertNotNull( foundChild2.getId() );
assertEquals( newChild2.getName(), foundChild2.getName() );
assertEquals( newChild2.getProperty( RepositoryFilenameUtils.escape( "ttt:ss4", repo.getReservedChars() ) ),
foundChild2.getProperty( RepositoryFilenameUtils.escape( "ttt:ss4", repo.getReservedChars() ) ) );
actualPropCount = 0;
for ( DataProperty prop : foundChild2.getProperties() ) {
actualPropCount++;
}
assertEquals( 1, actualPropCount );
// ordering
int i = 0;
for ( DataNode currentNode : foundNode.getNodes() ) {
if ( i++ == 0 ) {
assertEquals( newChild1.getName(), currentNode.getName() );
} else {
assertEquals( newChild2.getName(), currentNode.getName() );
}
}
}
@Test
public void testUpdateFile() throws Exception {
login( sysAdminUserName, systemTenant, new String[] { tenantAdminRoleName, tenantAuthenticatedRoleName } );
ITenant tenantAcme =
tenantManager.createTenant( systemTenant, TENANT_ID_ACME, tenantAdminRoleName, tenantAuthenticatedRoleName,
"Anonymous" );
userRoleDao.createUser( tenantAcme, USERNAME_ADMIN, "password", "", new String[] { tenantAdminRoleName } );
login( USERNAME_ADMIN, tenantAcme, new String[] { tenantAdminRoleName, tenantAuthenticatedRoleName } );
userRoleDao.createUser( tenantAcme, USERNAME_SUZY, "password", "", null );
login( USERNAME_SUZY, tenantAcme, new String[] { tenantAuthenticatedRoleName } );
final String parentFolderPath = ClientRepositoryPaths.getUserHomeFolderPath( USERNAME_SUZY );
final String fileName = "helloworld.[~!@#$%^&*(){}|.,]-=_+|;'?<>~`.sample";
RepositoryFile newFile = createSampleFile( parentFolderPath, fileName, "Hello World!", false, 222 );
final String modSampleString = "Ciao World!";
final boolean modSampleBoolean = true;
final int modSampleInteger = 99;
final SampleRepositoryFileData modContent =
new SampleRepositoryFileData( modSampleString, modSampleBoolean, modSampleInteger );
repo.updateFile( newFile, modContent, null );
SampleRepositoryFileData modData =
repo.getDataForRead( repo.getFile(
ClientRepositoryPaths.getUserHomeFolderPath( USERNAME_SUZY ) + RepositoryFile.SEPARATOR + fileName )
.getId(), SampleRepositoryFileData.class );
assertEquals( modSampleString, modData.getSampleString() );
assertEquals( modSampleBoolean, modData.getSampleBoolean() );
assertEquals( modSampleInteger, modData.getSampleInteger() );
}
@Test
public void testWriteToPublic() throws Exception {
login( sysAdminUserName, systemTenant, new String[] { tenantAdminRoleName, tenantAuthenticatedRoleName } );
ITenant tenantAcme =
tenantManager.createTenant( systemTenant, TENANT_ID_ACME, tenantAdminRoleName, tenantAuthenticatedRoleName,
"Anonymous" );
userRoleDao.createUser( tenantAcme, USERNAME_ADMIN, "password", "", new String[] { tenantAdminRoleName } );
login( USERNAME_ADMIN, tenantAcme, new String[] { tenantAdminRoleName, tenantAuthenticatedRoleName } );
final String parentFolderPath = ClientRepositoryPaths.getPublicFolderPath();
assertNotNull( createSampleFile( parentFolderPath, "helloworld.[~!@#$%^&*(){}|.,]-=_+|;'?<:>~.sample", "Hello World!", false, 500 ) );
}
@Test
public void testLockFile() throws Exception {
login( sysAdminUserName, systemTenant, new String[] { tenantAdminRoleName, tenantAuthenticatedRoleName } );
ITenant tenantAcme =
tenantManager.createTenant( systemTenant, TENANT_ID_ACME, tenantAdminRoleName, tenantAuthenticatedRoleName,
"Anonymous" );
userRoleDao.createUser( tenantAcme, USERNAME_ADMIN, "password", "", new String[] { tenantAdminRoleName } );
login( USERNAME_ADMIN, tenantAcme, new String[] { tenantAdminRoleName, tenantAuthenticatedRoleName } );
userRoleDao.createUser( tenantAcme, USERNAME_SUZY, "password", "", null );
userRoleDao.createUser( tenantAcme, USERNAME_TIFFANY, "password", "", null );
login( USERNAME_SUZY, tenantAcme, new String[] { tenantAuthenticatedRoleName } );
final String parentFolderPath =
ClientRepositoryPaths.getUserHomeFolderPath( PentahoSessionHolder.getSession().getName() );
RepositoryFile parentFolder = repo.getFile( parentFolderPath );
final String dataString = "Hello World!";
final String encoding = "UTF-8";
byte[] data = dataString.getBytes( encoding );
ByteArrayInputStream dataStream = new ByteArrayInputStream( data );
final String mimeType = "text/plain";
final String fileName = "helloworld.[~!@#$%^&*(){}|.,]-=_+|;'?<:>~.xaction";
final SimpleRepositoryFileData content = new SimpleRepositoryFileData( dataStream, encoding, mimeType );
RepositoryFile newFile =
repo.createFile( parentFolder.getId(), new RepositoryFile.Builder( fileName ).versioned( true ).build(),
content, null );
final String clientPath = parentFolderPath + RepositoryFile.SEPARATOR + fileName;
final String serverPath = ServerRepositoryPaths.getTenantRootFolderPath() + clientPath;
assertFalse( newFile.isLocked() );
assertNull( newFile.getLockDate() );
assertNull( newFile.getLockMessage() );
assertNull( newFile.getLockOwner() );
final String lockMessage = "test by :Mat";
repo.lockFile( newFile.getId(), lockMessage );
// verify no new versions were created on locking
assertEquals( 1, repo.getVersionSummaries( newFile.getId() ).size() );
assertTrue( SimpleJcrTestUtils.isLocked( testJcrTemplate, serverPath ) );
String ownerInfo = SimpleJcrTestUtils.getString( testJcrTemplate, serverPath + "/jcr:lockOwner" );
assertEquals( "test by %3AMat", ownerInfo.split( ":" )[2] );
assertNotNull( new Date( Long.parseLong( ownerInfo.split( ":" )[1] ) ) );
// test update while locked
repo.updateFile( repo.getFileById( newFile.getId() ), content, "update by Mat" );
assertEquals( 2, repo.getVersionSummaries( newFile.getId() ).size() );
login( USERNAME_ADMIN, tenantAcme, new String[] { tenantAdminRoleName, tenantAuthenticatedRoleName } );
RepositoryFile lockedFile = repo.getFile( clientPath );
assertTrue( lockedFile.isLocked() );
assertNotNull( lockedFile.getLockDate() );
assertEquals( lockMessage, lockedFile.getLockMessage() );
assertEquals( userNameUtils.getPrincipleId( tenantAcme, USERNAME_SUZY ), lockedFile.getLockOwner() );
login( USERNAME_SUZY, tenantAcme, new String[] { tenantAuthenticatedRoleName } );
assertTrue( repo.canUnlockFile( newFile.getId() ) );
repo.unlockFile( newFile.getId() );
assertEquals( 2, repo.getVersionSummaries( newFile.getId() ).size() );
assertFalse( SimpleJcrTestUtils.isLocked( testJcrTemplate, serverPath ) );
RepositoryFile unlockedFile = repo.getFile( clientPath );
assertFalse( unlockedFile.isLocked() );
assertNull( unlockedFile.getLockDate() );
assertNull( unlockedFile.getLockMessage() );
assertNull( unlockedFile.getLockOwner() );
// make sure lock token node has been removed
assertNull( SimpleJcrTestUtils.getItem( testJcrTemplate, ServerRepositoryPaths.getUserHomeFolderPath( tenantAcme,
USERNAME_SUZY )
+ "/.lockTokens/" + newFile.getId() ) );
// lock it again by suzy
repo.lockFile( newFile.getId(), lockMessage );
assertEquals( 2, repo.getVersionSummaries( newFile.getId() ).size() );
// login as tenant admin; make sure we can unlock
login( USERNAME_ADMIN, tenantAcme, new String[] { tenantAdminRoleName, tenantAuthenticatedRoleName } );
assertTrue( repo.canUnlockFile( newFile.getId() ) );
repo.unlockFile( newFile.getId() );
assertEquals( 2, repo.getVersionSummaries( newFile.getId() ).size() );
RepositoryFile unlockedFile2 = repo.getFile( clientPath );
assertFalse( unlockedFile2.isLocked() );
login( USERNAME_SUZY, tenantAcme, new String[] { tenantAuthenticatedRoleName } );
// lock it again by suzy
repo.lockFile( newFile.getId(), lockMessage );
assertEquals( 2, repo.getVersionSummaries( newFile.getId() ).size() );
}
@Test
public void testUndeleteFile() throws Exception {
Date testBegin = new Date();
Thread.sleep( 1000 );
login( sysAdminUserName, systemTenant, new String[] { tenantAdminRoleName, tenantAuthenticatedRoleName } );
ITenant tenantAcme =
tenantManager.createTenant( systemTenant, TENANT_ID_ACME, tenantAdminRoleName, tenantAuthenticatedRoleName,
"Anonymous" );
userRoleDao.createUser( tenantAcme, USERNAME_ADMIN, "password", "", new String[] { tenantAdminRoleName } );
login( USERNAME_ADMIN, tenantAcme, new String[] { tenantAdminRoleName, tenantAuthenticatedRoleName } );
userRoleDao.createUser( tenantAcme, USERNAME_SUZY, "password", "", null );
userRoleDao.createUser( tenantAcme, USERNAME_TIFFANY, "password", "", null );
login( USERNAME_SUZY, tenantAcme, new String[] { tenantAuthenticatedRoleName } );
String parentFolderPath = ClientRepositoryPaths.getUserHomeFolderPath(
PentahoSessionHolder.getSession().getName() );
RepositoryFile parentFolder = repo.getFile( parentFolderPath );
final String fileName = "helloworld.[~!@#$%^&*(){}|.,]-=_+|;'?<:>~.sample";
RepositoryFile newFile = createSampleFile( parentFolderPath, fileName, "dfdfd", true, 3, true );
List<RepositoryFile> deletedFiles = repo.getDeletedFiles();
assertEquals( 0, deletedFiles.size() );
repo.deleteFile( newFile.getId(), null );
deletedFiles = repo.getDeletedFiles();
assertEquals( 1, deletedFiles.size() );
deletedFiles = repo.getDeletedFiles( parentFolder.getPath() );
assertEquals( 1, deletedFiles.size() );
assertTrue( testBegin.before( deletedFiles.get( 0 ).getDeletedDate() ) );
assertEquals( parentFolder.getPath(), deletedFiles.get( 0 ).getOriginalParentFolderPath() );
assertEquals( newFile.getId(), deletedFiles.get( 0 ).getId() );
deletedFiles = repo.getDeletedFiles( parentFolder.getPath(), "*.sample" );
assertEquals( 1, deletedFiles.size() );
assertTrue( testBegin.before( deletedFiles.get( 0 ).getDeletedDate() ) );
assertEquals( parentFolder.getPath(), deletedFiles.get( 0 ).getOriginalParentFolderPath() );
deletedFiles = repo.getDeletedFiles( parentFolder.getPath(), "*.doesnotexist" );
assertEquals( 0, deletedFiles.size() );
deletedFiles = repo.getDeletedFiles();
assertEquals( 1, deletedFiles.size() );
assertEquals( parentFolder.getPath(), deletedFiles.get( 0 ).getOriginalParentFolderPath() );
assertTrue( testBegin.before( deletedFiles.get( 0 ).getDeletedDate() ) );
assertEquals( newFile, deletedFiles.get( 0 ) );
login( USERNAME_TIFFANY, tenantAcme, new String[] { tenantAuthenticatedRoleName } );
// tiffany shouldn't see suzy's deleted file
assertEquals( 0, repo.getDeletedFiles().size() );
login( USERNAME_SUZY, tenantAcme, new String[] { tenantAuthenticatedRoleName } );
repo.undeleteFile( newFile.getId(), null );
assertEquals( 0, repo.getDeletedFiles( parentFolder.getPath() ).size() );
assertEquals( 0, repo.getDeletedFiles().size() );
newFile = repo.getFileById( newFile.getId() );
// next two fields only populated when going through the delete-related API calls
assertNull( newFile.getDeletedDate() );
assertNull( newFile.getOriginalParentFolderPath() );
repo.deleteFile( newFile.getId(), null );
repo.deleteFile( newFile.getId(), true, null ); // permanent delete
try {
repo.undeleteFile( newFile.getId(), null );
fail();
} catch ( UnifiedRepositoryException e ) {
//ignore
}
// test preservation of original path even if that path no longer exists
RepositoryFile publicFolder =
repo.getFile( ClientRepositoryPaths.getUserHomeFolderPath( PentahoSessionHolder.getSession().getName() ) );
RepositoryFile test1Folder =
repo.createFolder( publicFolder.getId(), new RepositoryFile.Builder( "test1" ).folder( true ).build(), null );
newFile = createSampleFile( test1Folder.getPath(), fileName, "dfdfd", true, 3 );
repo.deleteFile( newFile.getId(), null );
assertNull( repo.getFile( "/home/suzy/test1/helloworld.[~!@#$%^&*(){}|.,]-=_+|;'?<:>~.sample" ) );
// rename original parent folder
repo.moveFile( test1Folder.getId(), ClientRepositoryPaths.getUserHomeFolderPath( PentahoSessionHolder.getSession()
.getName() )
+ RepositoryFile.SEPARATOR + "test2", null );
assertNull( repo.getFile( test1Folder.getPath() ) );
repo.undeleteFile( newFile.getId(), null );
assertNotNull( repo.getFile( "/home/suzy/test1/helloworld.[~!@#$%^&*(){}|.,]-=_+|;'?<:>~.sample" ) );
assertNull( repo.getFile( "/home/suzy/test2/helloworld.[~!@#$%^&*(){}|.,]-=_+|;'?<:>~.sample" ) ); // repo should create any missing folders
// on undelete
assertEquals( "/home/suzy/test1/helloworld.[~!@#$%^&*(){}|.,]-=_+|;'?<:>~.sample", repo.getFileById( newFile.getId() ).getPath() );
// test versioned parent folder
RepositoryFile test5Folder =
repo.createFolder( publicFolder.getId(), new RepositoryFile.Builder( "test5" ).folder( true ).versioned( true )
.build(), null );
int versionCountBefore = repo.getVersionSummaries( test5Folder.getId() ).size();
RepositoryFile newFile5 = createSampleFile( test5Folder.getPath(), fileName, "dfdfd", true, 3 );
repo.deleteFile( newFile5.getId(), null );
assertTrue( repo.getVersionSummaries( test5Folder.getId() ).size() > versionCountBefore );
versionCountBefore = repo.getVersionSummaries( test5Folder.getId() ).size();
repo.undeleteFile( newFile5.getId(), null );
assertTrue( repo.getVersionSummaries( test5Folder.getId() ).size() > versionCountBefore );
// test permanent delete without undelete
RepositoryFile newFile6 =
createSampleFile( ClientRepositoryPaths.getUserHomeFolderPath( PentahoSessionHolder.getSession().getName() ),
fileName, "dfdfd", true, 3 );
repo.deleteFile( newFile6.getId(), true, null );
// test undelete where path to restored file already exists
RepositoryFile newFile7 =
createSampleFile( ClientRepositoryPaths.getUserHomeFolderPath( PentahoSessionHolder.getSession().getName() ),
fileName, "dfdfd", true, 3 );
repo.deleteFile( newFile7.getId(), null );
createSampleFile( ClientRepositoryPaths.getUserHomeFolderPath( PentahoSessionHolder.getSession().getName() ),
fileName, "dfdfd", true, 3 );
try {
repo.undeleteFile( newFile7.getId(), null );
fail();
} catch ( UnifiedRepositoryException e ) {
e.printStackTrace();
}
}
/**
* Tests that files in legacy trash structure are still found.
*/
@Test
public void testUndeleteFileLegacy() throws Exception {
login( sysAdminUserName, systemTenant, new String[] { tenantAdminRoleName, tenantAuthenticatedRoleName } );
ITenant tenantAcme =
tenantManager.createTenant( systemTenant, TENANT_ID_ACME, tenantAdminRoleName, tenantAuthenticatedRoleName,
"Anonymous" );
userRoleDao.createUser( tenantAcme, USERNAME_ADMIN, "password", "", new String[] { tenantAdminRoleName } );
login( USERNAME_ADMIN, tenantAcme, new String[] { tenantAdminRoleName, tenantAuthenticatedRoleName } );
userRoleDao.createUser( tenantAcme, USERNAME_SUZY, "password", "", null );
login( USERNAME_SUZY, tenantAcme, new String[] { tenantAuthenticatedRoleName } );
final String fileName = "helloworld.[~!@#$%^&*(){}|.,]-=_+|;'?<:>~.sample";
RepositoryFile publicFolder =
repo.getFile( ClientRepositoryPaths.getUserHomeFolderPath( PentahoSessionHolder.getSession().getName() ) );
RepositoryFile test3Folder =
repo.createFolder( publicFolder.getId(), new RepositoryFile.Builder( "test3" ).folder( true ).build(), null );
// simulate file(s) in legacy trash structure
final String suzyHomePath = "/pentaho/acme/home/suzy";
SimpleJcrTestUtils.addNode( testJcrTemplate, suzyHomePath, ".trash", "pho_nt:pentahoInternalFolder" );
final String suzyTrashPath = suzyHomePath + "/.trash";
SimpleJcrTestUtils.addNode( testJcrTemplate, suzyTrashPath, "pho:" + test3Folder.getId(),
"pho_nt:pentahoInternalFolder" );
final String suzyTrashFolderIdPath = suzyTrashPath + "/pho:" + test3Folder.getId();
assertNotNull( SimpleJcrTestUtils.getItem( testJcrTemplate, suzyTrashFolderIdPath ) );
RepositoryFile newFile3 = createSampleFile( test3Folder.getPath(), fileName, "dfdfd", true, 3, true );
SimpleJcrTestUtils.addNode( testJcrTemplate, suzyTrashFolderIdPath, "pho:" + newFile3.getId(),
"pho_nt:pentahoInternalFolder" );
final String suzyTrashFileIdPath = suzyTrashFolderIdPath + "/pho:" + newFile3.getId();
assertNotNull( SimpleJcrTestUtils.getItem( testJcrTemplate, suzyTrashFileIdPath ) );
String absTrashPath = suzyTrashFileIdPath + "/helloworld.[~!@#$%^&*(){}|.,]-=_+|;'?<:>~.sample";
SimpleJcrTestUtils.move( testJcrTemplate, "/pentaho/acme/home/suzy/test3/helloworld.[~!@#$%^&*(){}|.,]-=_+|;'?<:>~.sample", absTrashPath );
assertNotNull( SimpleJcrTestUtils.getItem( testJcrTemplate, absTrashPath ) );
Date expectedDate = new Date();
SimpleJcrTestUtils.setDate( testJcrTemplate, suzyTrashFileIdPath + "/pho:deletedDate", expectedDate );
List<RepositoryFile> deletedFiles = repo.getDeletedFiles( test3Folder.getPath() );
assertEquals( 1, deletedFiles.size() );
assertEquals( expectedDate, deletedFiles.get( 0 ).getDeletedDate() );
assertEquals( test3Folder.getPath(), deletedFiles.get( 0 ).getOriginalParentFolderPath() );
deletedFiles = repo.getDeletedFiles( test3Folder.getPath(), "*.sample" );
assertEquals( 1, deletedFiles.size() );
assertEquals( expectedDate, deletedFiles.get( 0 ).getDeletedDate() );
assertEquals( test3Folder.getPath(), deletedFiles.get( 0 ).getOriginalParentFolderPath() );
deletedFiles = repo.getDeletedFiles( test3Folder.getPath(), "*.doesnotexist" );
assertEquals( 0, deletedFiles.size() );
deletedFiles = repo.getDeletedFiles();
assertEquals( 1, deletedFiles.size() );
assertEquals( expectedDate, deletedFiles.get( 0 ).getDeletedDate() );
assertEquals( test3Folder.getPath(), deletedFiles.get( 0 ).getOriginalParentFolderPath() );
repo.undeleteFile( newFile3.getId(), null );
assertNull( SimpleJcrTestUtils.getItem( testJcrTemplate, suzyTrashFileIdPath ) );
assertNotNull( repo.getFile( newFile3.getPath() ) );
repo.deleteFile( newFile3.getId(), true, null );
try {
repo.getFileById( newFile3.getId() );
fail();
} catch ( UnifiedRepositoryException e ) {
//ignore
}
}
@Test
public void testDeleteLockedFile() throws Exception {
login( sysAdminUserName, systemTenant, new String[] { tenantAdminRoleName, tenantAuthenticatedRoleName } );
ITenant tenantAcme =
tenantManager.createTenant( systemTenant, TENANT_ID_ACME, tenantAdminRoleName, tenantAuthenticatedRoleName,
"Anonymous" );
userRoleDao.createUser( tenantAcme, USERNAME_ADMIN, "password", "", new String[] { tenantAdminRoleName } );
login( USERNAME_ADMIN, tenantAcme, new String[] { tenantAdminRoleName, tenantAuthenticatedRoleName } );
userRoleDao.createUser( tenantAcme, USERNAME_SUZY, "password", "", null );
login( USERNAME_SUZY, tenantAcme, new String[] { tenantAuthenticatedRoleName } );
final String parentFolderPath =
ClientRepositoryPaths.getUserHomeFolderPath( PentahoSessionHolder.getSession().getName() );
RepositoryFile parentFolder = repo.getFile( parentFolderPath );
final String dataString = "Hello World!";
final String encoding = "UTF-8";
byte[] data = dataString.getBytes( encoding );
ByteArrayInputStream dataStream = new ByteArrayInputStream( data );
final String mimeType = "text/plain";
final String fileName = "helloworld.[~!@#$%^&*(){}|.,]-=_+|;'?<:>~.xaction";
final SimpleRepositoryFileData content = new SimpleRepositoryFileData( dataStream, encoding, mimeType );
RepositoryFile newFile =
repo.createFile( parentFolder.getId(), new RepositoryFile.Builder( fileName ).build(), content, null );
final String filePath = parentFolderPath + RepositoryFile.SEPARATOR + fileName;
assertFalse( repo.getFile( filePath ).isLocked() );
final String lockMessage = "test by Mat";
repo.lockFile( newFile.getId(), lockMessage );
repo.deleteFile( newFile.getId(), null );
// lock only removed when file is permanently deleted
assertNotNull( SimpleJcrTestUtils.getItem( testJcrTemplate, ServerRepositoryPaths.getUserHomeFolderPath(
tenantAcme, USERNAME_SUZY )
+ "/.lockTokens/" + newFile.getId() ) );
repo.undeleteFile( newFile.getId(), null );
repo.deleteFile( newFile.getId(), null );
repo.deleteFile( newFile.getId(), true, null );
// make sure lock token node has been removed
assertNull( SimpleJcrTestUtils.getItem( testJcrTemplate, ServerRepositoryPaths.getUserHomeFolderPath( tenantAcme,
USERNAME_SUZY )
+ "/.lockTokens/" + newFile.getId() ) );
}
@Test
public void testDeleteFileAtVersion() throws Exception {
// Startup and login to repository
login( sysAdminUserName, systemTenant, new String[] { tenantAdminRoleName, tenantAuthenticatedRoleName } );
ITenant tenantAcme =
tenantManager.createTenant( systemTenant, TENANT_ID_ACME, tenantAdminRoleName, tenantAuthenticatedRoleName,
"Anonymous" );
userRoleDao.createUser( tenantAcme, USERNAME_ADMIN, "password", "", new String[] { tenantAdminRoleName } );
login( USERNAME_ADMIN, tenantAcme, new String[] { tenantAdminRoleName, tenantAuthenticatedRoleName } );
userRoleDao.createUser( tenantAcme, USERNAME_SUZY, "password", "", null );
login( USERNAME_SUZY, tenantAcme, new String[] { tenantAuthenticatedRoleName } );
// Create a simple file
RepositoryFile parentFolder = repo.getFile( ClientRepositoryPaths.getUserHomeFolderPath( USERNAME_SUZY ) );
final String expectedDataString = "Hello World!";
final String expectedModDataString = "Ciao World!";
final String expectedEncoding = "UTF-8";
byte[] data = expectedDataString.getBytes( expectedEncoding );
byte[] modData = expectedModDataString.getBytes( expectedEncoding );
ByteArrayInputStream dataStream = new ByteArrayInputStream( data );
ByteArrayInputStream modDataStream = new ByteArrayInputStream( modData );
final String expectedMimeType = "text/plain";
final String expectedName = "helloworld.[~!@#$%^&*(){}|.,]-=_+|;'?<:>~.xaction";
final String expectedAbsolutePath =
ClientRepositoryPaths.getUserHomeFolderPath( USERNAME_SUZY ) + "/helloworld.[~!@#$%^&*(){}|.,]-=_+|;'?<:>~.xaction";
final SimpleRepositoryFileData content =
new SimpleRepositoryFileData( dataStream, expectedEncoding, expectedMimeType );
RepositoryFile newFile =
repo.createFile( parentFolder.getId(), new RepositoryFile.Builder( expectedName ).versioned( true ).build(),
content, null );
// Make sure the file was created
RepositoryFile foundFile = repo.getFile( expectedAbsolutePath );
assertNotNull( foundFile );
// Modify file
final SimpleRepositoryFileData modContent =
new SimpleRepositoryFileData( modDataStream, expectedEncoding, expectedMimeType );
repo.updateFile( foundFile, modContent, null );
// Verify versions
List<VersionSummary> origVerList = repo.getVersionSummaries( foundFile.getId() );
assertEquals( 2, origVerList.size() );
SimpleRepositoryFileData result =
repo.getDataAtVersionForRead( foundFile.getId(), origVerList.get( 0 ).getId(), SimpleRepositoryFileData.class );
SimpleRepositoryFileData modResult =
repo.getDataAtVersionForRead( foundFile.getId(), origVerList.get( 1 ).getId(), SimpleRepositoryFileData.class );
assertEquals( expectedDataString, IOUtils.toString( result.getStream(), expectedEncoding ) );
assertEquals( expectedModDataString, IOUtils.toString( modResult.getStream(), expectedEncoding ) );
// Remove first version
repo.deleteFileAtVersion( foundFile.getId(), origVerList.get( 0 ).getId() );
// Verify version removal
List<VersionSummary> newVerList = repo.getVersionSummaries( foundFile.getId() );
assertEquals( 1, newVerList.size() );
SimpleRepositoryFileData newModResult =
repo.getDataAtVersionForRead( foundFile.getId(), newVerList.get( 0 ).getId(), SimpleRepositoryFileData.class );
assertEquals( expectedModDataString, IOUtils.toString( newModResult.getStream(), expectedEncoding ) );
}
@Test
public void testRestoreFileAtVersion() throws Exception {
// Startup and login to repository
login( sysAdminUserName, systemTenant, new String[] { tenantAdminRoleName, tenantAuthenticatedRoleName } );
ITenant tenantAcme =
tenantManager.createTenant( systemTenant, TENANT_ID_ACME, tenantAdminRoleName, tenantAuthenticatedRoleName,
"Anonymous" );
userRoleDao.createUser( tenantAcme, USERNAME_ADMIN, "password", "", new String[] { tenantAdminRoleName } );
login( USERNAME_ADMIN, tenantAcme, new String[] { tenantAdminRoleName, tenantAuthenticatedRoleName } );
userRoleDao.createUser( tenantAcme, USERNAME_SUZY, "password", "", null );
login( USERNAME_SUZY, tenantAcme, new String[] { tenantAuthenticatedRoleName } );
// Create a simple file
RepositoryFile parentFolder = repo.getFile( ClientRepositoryPaths.getUserHomeFolderPath( USERNAME_SUZY ) );
final String expectedDataString = "Hello World!";
final String expectedModDataString = "Ciao World!";
final String expectedEncoding = "UTF-8";
byte[] data = expectedDataString.getBytes( expectedEncoding );
byte[] modData = expectedModDataString.getBytes( expectedEncoding );
ByteArrayInputStream dataStream = new ByteArrayInputStream( data );
ByteArrayInputStream modDataStream = new ByteArrayInputStream( modData );
final String expectedMimeType = "text/plain";
final String expectedName = "helloworld.[~!@#$%^&*(){}|.,]-=_+|;'?<:>~.xaction";
final String expectedAbsolutePath =
ClientRepositoryPaths.getUserHomeFolderPath( USERNAME_SUZY ) + "/helloworld.[~!@#$%^&*(){}|.,]-=_+|;'?<:>~.xaction";
final SimpleRepositoryFileData content =
new SimpleRepositoryFileData( dataStream, expectedEncoding, expectedMimeType );
RepositoryFile newFile =
repo.createFile( parentFolder.getId(), new RepositoryFile.Builder( expectedName ).versioned( true ).build(),
content, null );
// Make sure the file was created
RepositoryFile foundFile = repo.getFile( expectedAbsolutePath );
assertNotNull( foundFile );
// Modify file
final SimpleRepositoryFileData modContent =
new SimpleRepositoryFileData( modDataStream, expectedEncoding, expectedMimeType );
repo.updateFile( foundFile, modContent, null );
// Verify versions
List<VersionSummary> origVerList = repo.getVersionSummaries( foundFile.getId() );
assertEquals( 2, origVerList.size() );
SimpleRepositoryFileData result =
repo.getDataAtVersionForRead( foundFile.getId(), origVerList.get( 0 ).getId(), SimpleRepositoryFileData.class );
SimpleRepositoryFileData modResult =
repo.getDataAtVersionForRead( foundFile.getId(), origVerList.get( 1 ).getId(), SimpleRepositoryFileData.class );
assertEquals( expectedDataString, IOUtils.toString( result.getStream(), expectedEncoding ) );
assertEquals( expectedModDataString, IOUtils.toString( modResult.getStream(), expectedEncoding ) );
// Restore first version
repo.restoreFileAtVersion( foundFile.getId(), origVerList.get( 0 ).getId(), "restore version" );
// Verify version restoration
List<VersionSummary> newVerList = repo.getVersionSummaries( foundFile.getId() );
assertEquals( 3, newVerList.size() );
SimpleRepositoryFileData newOrigResult = repo.getDataForRead( foundFile.getId(), SimpleRepositoryFileData.class );
assertEquals( expectedDataString, IOUtils.toString( newOrigResult.getStream(), expectedEncoding ) );
}
@Test
public void testGetVersionSummaries() throws Exception {
login( sysAdminUserName, systemTenant, new String[] { tenantAdminRoleName, tenantAuthenticatedRoleName } );
ITenant tenantAcme =
tenantManager.createTenant( systemTenant, TENANT_ID_ACME, tenantAdminRoleName, tenantAuthenticatedRoleName,
"Anonymous" );
userRoleDao.createUser( tenantAcme, USERNAME_ADMIN, "password", "", new String[] { tenantAdminRoleName } );
login( USERNAME_ADMIN, tenantAcme, new String[] { tenantAdminRoleName, tenantAuthenticatedRoleName } );
userRoleDao.createUser( tenantAcme, USERNAME_SUZY, "password", "", null );
login( USERNAME_SUZY, tenantAcme, new String[] { tenantAuthenticatedRoleName } );
final String parentFolderPath =
ClientRepositoryPaths.getUserHomeFolderPath( PentahoSessionHolder.getSession().getName() );
RepositoryFile parentFolder = repo.getFile( parentFolderPath );
final String dataString = "Hello World!";
final String encoding = "UTF-8";
byte[] data = dataString.getBytes( encoding );
ByteArrayInputStream dataStream = new ByteArrayInputStream( data );
final String mimeType = "text/plain";
final String fileName = "helloworld.[~!@#$%^&*(){}|.,]-=_+|;'?<:>~.xaction";
final SimpleRepositoryFileData content = new SimpleRepositoryFileData( dataStream, encoding, mimeType );
RepositoryFile newFile =
repo.createFile( parentFolder.getId(), new RepositoryFile.Builder( fileName ).versioned( true ).build(),
content, "created helloworld.[~!@#$%^&*(){}|.,]-=_+|;'?<:>~.xaction" );
repo.updateFile( newFile, content, "update 1" );
newFile = repo.getFileById( newFile.getId() );
repo.updateFile( newFile, content, "update 2" );
newFile = repo.getFileById( newFile.getId() );
RepositoryFile updatedFile = repo.updateFile( newFile, content, "update 3" );
List<VersionSummary> versionSummaries = repo.getVersionSummaries( updatedFile.getId() );
assertNotNull( versionSummaries );
assertTrue( versionSummaries.size() >= 3 );
assertEquals( "update 3", versionSummaries.get( versionSummaries.size() - 1 ).getMessage() );
assertEquals( USERNAME_SUZY, versionSummaries.get( 0 ).getAuthor() );
System.out.println( versionSummaries );
System.out.println( versionSummaries.size() );
}
@Test
public void testGetVersionSummary() throws Exception {
login( sysAdminUserName, systemTenant, new String[] { tenantAdminRoleName, tenantAuthenticatedRoleName } );
ITenant tenantAcme =
tenantManager.createTenant( systemTenant, TENANT_ID_ACME, tenantAdminRoleName, tenantAuthenticatedRoleName,
"Anonymous" );
userRoleDao.createUser( tenantAcme, USERNAME_ADMIN, "password", "", new String[] { tenantAdminRoleName } );
login( USERNAME_ADMIN, tenantAcme, new String[] { tenantAdminRoleName, tenantAuthenticatedRoleName } );
userRoleDao.createUser( tenantAcme, USERNAME_SUZY, "password", "", null );
login( USERNAME_SUZY, tenantAcme, new String[] { tenantAuthenticatedRoleName } );
final String parentFolderPath = ClientRepositoryPaths.getUserHomeFolderPath( USERNAME_SUZY );
final String fileName = "helloworld.[~!@#$%^&*(){}|.,]-=_+|;'?<:>~.sample";
final String origSampleString = "Hello World!";
final boolean origSampleBoolean = false;
final int origSampleInteger = 1024;
RepositoryFile newFile =
createSampleFile( parentFolderPath, fileName, origSampleString, origSampleBoolean, origSampleInteger, true );
SampleRepositoryFileData newContent = repo.getDataForRead( newFile.getId(), SampleRepositoryFileData.class );
VersionSummary v1 = repo.getVersionSummary( newFile.getId(), newFile.getVersionId() );
assertNotNull( v1 );
assertEquals( USERNAME_SUZY, v1.getAuthor() );
assertEquals( new Date().getDate(), v1.getDate().getDate() );
repo.updateFile( newFile, newContent, null );
// gets last version summary
VersionSummary v2 = repo.getVersionSummary( newFile.getId(), null );
assertNotNull( v2 );
assertEquals( USERNAME_SUZY, v2.getAuthor() );
assertEquals( new Date().getDate(), v2.getDate().getDate() );
assertFalse( v1.equals( v2 ) );
List<VersionSummary> sums = repo.getVersionSummaries( newFile.getId() );
// unfortunate impl issue that the 3rd version is the one that the user sees as the original file version
assertEquals( sums.get( 0 ), v1 );
assertEquals( sums.get( 1 ), v2 );
}
@Test
public void testGetFileByVersionSummary() throws Exception {
login( sysAdminUserName, systemTenant, new String[] { tenantAdminRoleName, tenantAuthenticatedRoleName } );
ITenant tenantAcme =
tenantManager.createTenant( systemTenant, TENANT_ID_ACME, tenantAdminRoleName, tenantAuthenticatedRoleName,
"Anonymous" );
userRoleDao.createUser( tenantAcme, USERNAME_ADMIN, "password", "", new String[] { tenantAdminRoleName } );
login( USERNAME_ADMIN, tenantAcme, new String[] { tenantAdminRoleName, tenantAuthenticatedRoleName } );
userRoleDao.createUser( tenantAcme, USERNAME_SUZY, "password", "", null );
login( USERNAME_SUZY, tenantAcme, new String[] { tenantAuthenticatedRoleName } );
final String parentFolderPath = ClientRepositoryPaths.getUserHomeFolderPath( USERNAME_SUZY );
final String fileName = "helloworld.[~!@#$%^&*(){}|.,]-=_+|;'?<:>~.sample";
final String origSampleString = "Hello World!";
final boolean origSampleBoolean = false;
final int origSampleInteger = 1024;
RepositoryFile newFile =
createSampleFile( parentFolderPath, fileName, origSampleString, origSampleBoolean, origSampleInteger, true );
final Serializable fileId = newFile.getId();
final String absolutePath = newFile.getPath();
final String modSampleString = "Ciao World!";
final boolean modSampleBoolean = true;
final int modSampleInteger = 2048;
final SampleRepositoryFileData modData =
new SampleRepositoryFileData( modSampleString, modSampleBoolean, modSampleInteger );
RepositoryFile.Builder builder = new RepositoryFile.Builder( newFile );
final String desc = "Hello World description";
builder.description( RepositoryFile.DEFAULT_LOCALE, desc );
repo.updateFile( builder.build(), modData, null );
List<VersionSummary> versionSummaries = repo.getVersionSummaries( newFile.getId() );
RepositoryFile v1 = repo.getFileAtVersion( newFile.getId(), versionSummaries.get( 0 ).getId() );
RepositoryFile v2 = repo.getFileAtVersion( newFile.getId(), versionSummaries.get( 1 ).getId() );
assertEquals( fileName, v1.getName() );
assertEquals( fileName, v2.getName() );
assertEquals( fileId, v1.getId() );
assertEquals( fileId, v2.getId() );
assertEquals( "1.0", v1.getVersionId() );
assertEquals( "1.1", v2.getVersionId() );
assertEquals( absolutePath, v1.getPath() );
assertEquals( absolutePath, v2.getPath() );
assertNull( v1.getDescription() );
assertEquals( desc, v2.getDescription() );
System.out.println( "or: " + newFile );
System.out.println( "v1: " + v1 );
System.out.println( "v2: " + v2 );
SampleRepositoryFileData c1 =
repo.getDataAtVersionForRead( v1.getId(), v1.getVersionId(), SampleRepositoryFileData.class );
SampleRepositoryFileData c2 =
repo.getDataAtVersionForRead( v2.getId(), v2.getVersionId(), SampleRepositoryFileData.class );
assertEquals( origSampleString, c1.getSampleString() );
assertEquals( origSampleBoolean, c1.getSampleBoolean() );
assertEquals( origSampleInteger, c1.getSampleInteger() );
assertEquals( modSampleString, c2.getSampleString() );
assertEquals( modSampleBoolean, c2.getSampleBoolean() );
assertEquals( modSampleInteger, c2.getSampleInteger() );
}
@Test
@Ignore
// Failing due to pho:aclManagement not present.
public
void testOwnership() throws Exception {
login( sysAdminUserName, systemTenant, new String[] { tenantAdminRoleName, tenantAuthenticatedRoleName } );
ITenant tenantAcme =
tenantManager.createTenant( systemTenant, TENANT_ID_ACME, tenantAdminRoleName, tenantAuthenticatedRoleName,
"Anonymous" );
userRoleDao.createUser( tenantAcme, USERNAME_ADMIN, "password", "", new String[] { tenantAdminRoleName } );
login( USERNAME_ADMIN, tenantAcme, new String[] { tenantAdminRoleName, tenantAuthenticatedRoleName } );
userRoleDao.createUser( tenantAcme, USERNAME_SUZY, "password", "", null );
userRoleDao.createUser( tenantAcme, USERNAME_TIFFANY, "password", "", null );
login( USERNAME_SUZY, tenantAcme, new String[] { tenantAuthenticatedRoleName } );
RepositoryFile parentFolder =
repo.getFile( ClientRepositoryPaths.getUserHomeFolderPath( PentahoSessionHolder.getSession().getName() ) );
RepositoryFile newFolder = new RepositoryFile.Builder( "[~!@#$%^&*(){}|.,]-=_+|;'?<:>~test" ).folder( true ).versioned( true ).build();
final String testFolderPath =
ClientRepositoryPaths.getUserHomeFolderPath( PentahoSessionHolder.getSession().getName() )
+ RepositoryFile.SEPARATOR + "[~!@#$%^&*(){}|.,]-=_+|;'?<:>~test";
newFolder = repo.createFolder( parentFolder.getId(), newFolder, null );
assertEquals( new RepositoryFileSid( USERNAME_SUZY ), repo.getAcl( newFolder.getId() ).getOwner() );
// set acl removing suzy's rights to this folder
login( USERNAME_ADMIN, tenantAcme, new String[] { tenantAdminRoleName, tenantAuthenticatedRoleName } );
RepositoryFileAcl testFolderAcl = repo.getAcl( newFolder.getId() );
RepositoryFileAcl newAcl =
new Builder( testFolderAcl ).entriesInheriting( false ).clearAces().build();
repo.updateAcl( newAcl );
// but suzy is still the owner--she should be able to "acl" herself back into the folder
login( USERNAME_SUZY, tenantAcme, new String[] { tenantAuthenticatedRoleName } );
assertNotNull( repo.getFile( testFolderPath ) );
// as suzy, change owner to role to which she belongs
testFolderAcl = repo.getAcl( newFolder.getId() );
newAcl =
new Builder( testFolderAcl ).owner(
new RepositoryFileSid( roleNameUtils.getPrincipleId( tenantAcme, "Authenticated" ),
Type.ROLE ) ).build();
repo.updateAcl( newAcl );
assertNotNull( repo.getFile( testFolderPath ) );
login( USERNAME_TIFFANY, tenantAcme, new String[] { tenantAuthenticatedRoleName } );
assertNotNull( repo.getFile( testFolderPath ) );
}
@Test
public void testGetAcl() throws Exception {
login( sysAdminUserName, systemTenant, new String[] { tenantAdminRoleName, tenantAuthenticatedRoleName } );
ITenant tenantAcme =
tenantManager.createTenant( systemTenant, TENANT_ID_ACME, tenantAdminRoleName, tenantAuthenticatedRoleName,
"Anonymous" );
userRoleDao.createUser( tenantAcme, USERNAME_ADMIN, "password", "", new String[] { tenantAdminRoleName } );
login( USERNAME_ADMIN, tenantAcme, new String[] { tenantAdminRoleName, tenantAuthenticatedRoleName } );
userRoleDao.createUser( tenantAcme, USERNAME_SUZY, "password", "", null );
userRoleDao.createUser( tenantAcme, USERNAME_TIFFANY, "password", "", null );
defaultBackingRepositoryLifecycleManager.newTenant();
login( USERNAME_SUZY, tenantAcme, new String[] { tenantAuthenticatedRoleName } );
RepositoryFile parentFolder =
repo.getFile( ClientRepositoryPaths.getUserHomeFolderPath( PentahoSessionHolder.getSession().getName() ) );
RepositoryFile newFolder = new RepositoryFile.Builder( "[~!@#$%^&*(){}|.,]-=_+|;'?<:>~test" ).folder( true ).versioned( true ).build();
newFolder = repo.createFolder( parentFolder.getId(), newFolder, null );
RepositoryFileAcl acl = repo.getAcl( newFolder.getId() );
assertEquals( true, acl.isEntriesInheriting() );
assertEquals( new RepositoryFileSid( USERNAME_SUZY ), acl.getOwner() );
assertEquals( newFolder.getId(), acl.getId() );
assertTrue( acl.getAces().isEmpty() );
RepositoryFileAcl newAcl =
new Builder( acl ).ace( userNameUtils.getPrincipleId( tenantAcme, USERNAME_TIFFANY ),
Type.USER, RepositoryFilePermission.READ ).entriesInheriting( true ).build();
RepositoryFileAcl fetchedAcl = repo.updateAcl( newAcl );
// since isEntriesInheriting is true, ace addition should not have taken
assertTrue( fetchedAcl.getAces().isEmpty() );
newAcl =
new Builder( acl ).ace( userNameUtils.getPrincipleId( tenantAcme, USERNAME_TIFFANY ),
Type.USER, RepositoryFilePermission.READ ).build(); // calling ace sets
// entriesInheriting to false
fetchedAcl = repo.updateAcl( newAcl );
// since isEntriesInheriting is false, ace addition should have taken
assertFalse( fetchedAcl.getAces().isEmpty() );
}
@Test
public void testCreateFolderWithAcl() throws Exception {
login( sysAdminUserName, systemTenant, new String[] { tenantAdminRoleName, tenantAuthenticatedRoleName } );
ITenant tenantAcme =
tenantManager.createTenant( systemTenant, TENANT_ID_ACME, tenantAdminRoleName, tenantAuthenticatedRoleName,
"Anonymous" );
userRoleDao.createUser( tenantAcme, USERNAME_ADMIN, "password", "", new String[] { tenantAdminRoleName } );
login( USERNAME_ADMIN, tenantAcme, new String[] { tenantAdminRoleName, tenantAuthenticatedRoleName } );
userRoleDao.createUser( tenantAcme, USERNAME_SUZY, "password", "", null );
login( USERNAME_SUZY, tenantAcme, new String[] { tenantAuthenticatedRoleName } );
RepositoryFile parentFolder =
repo.getFile( ClientRepositoryPaths.getUserHomeFolderPath( PentahoSessionHolder.getSession().getName() ) );
RepositoryFile newFolder = new RepositoryFile.Builder( "[~!@#$%^&*(){}|.,]-=_+|;'?<:>~test" ).folder( true ).versioned( true ).build();
RepositoryFileSid tiffanySid = new RepositoryFileSid(
userNameUtils.getPrincipleId( tenantAcme, USERNAME_TIFFANY ) );
RepositoryFileSid suzySid = new RepositoryFileSid( userNameUtils.getPrincipleId( tenantAcme, USERNAME_SUZY ) );
// tiffany owns it but suzy is creating it
Builder aclBuilder = new Builder( tiffanySid );
// need this to be able to fetch acl as suzy
aclBuilder.ace( suzySid, RepositoryFilePermission.READ );
newFolder = repo.createFolder( parentFolder.getId(), newFolder, aclBuilder.build(), null );
RepositoryFileAcl fetchedAcl = repo.getAcl( newFolder.getId() );
assertEquals( new RepositoryFileSid( USERNAME_TIFFANY ), fetchedAcl.getOwner() );
assertLocalAceExists( newFolder, new RepositoryFileSid( USERNAME_SUZY ),
EnumSet.of( RepositoryFilePermission.READ ) );
}
@Test
public void testWriteOnFileToMove() throws Exception {
login( sysAdminUserName, systemTenant, new String[] { tenantAdminRoleName, tenantAuthenticatedRoleName } );
ITenant tenantAcme =
tenantManager.createTenant( systemTenant, TENANT_ID_ACME, tenantAdminRoleName, tenantAuthenticatedRoleName,
"Anonymous" );
userRoleDao.createUser( tenantAcme, USERNAME_ADMIN, "password", "", new String[] { tenantAdminRoleName } );
login( USERNAME_ADMIN, tenantAcme, new String[] { tenantAdminRoleName, tenantAuthenticatedRoleName } );
userRoleDao.createUser( tenantAcme, USERNAME_SUZY, "password", "", null );
defaultBackingRepositoryLifecycleManager.newTenant();
login( USERNAME_SUZY, tenantAcme, new String[] { tenantAuthenticatedRoleName } );
RepositoryFile parentFolder =
repo.getFile( ClientRepositoryPaths.getUserHomeFolderPath( PentahoSessionHolder.getSession().getName() ) );
RepositoryFile srcFolder = new RepositoryFile.Builder( "[~!@#$%^&*(){}|.,]-=_+|;'?<:>~src" ).folder( true ).build();
RepositoryFile destFolder = new RepositoryFile.Builder( "[~!@#$%^&*(){}|.,]-=_+|;'?<:>~dest" ).folder( true ).build();
srcFolder = repo.createFolder( parentFolder.getId(), srcFolder, null );
destFolder = repo.createFolder( parentFolder.getId(), destFolder, null );
RepositoryFile newFile = createSampleFile( srcFolder.getPath(), "helloworld.[~!@#$%^&*(){}|.,]-=_+|;'?<:>~.sample", "ddfdf", false, 83 );
RepositoryFileAcl acl =
new Builder( newFile.getId(), userNameUtils.getPrincipleId( tenantAcme, USERNAME_TIFFANY ),
Type.USER ).entriesInheriting( false ).ace(
userNameUtils.getPrincipleId( tenantAcme, USERNAME_SUZY ), Type.USER,
RepositoryFilePermission.READ ).build();
repo.updateAcl( acl );
// at this point, suzy has write access to src and dest folders but only read access to actual file that will
// be
// moved; this should fail
try {
repo.moveFile( newFile.getId(), destFolder.getPath(), null );
fail();
} catch ( UnifiedRepositoryAccessDeniedException e ) {
//ignore
}
}
/**
* Tests deleting a file when no delete permission is given to the role
*/
@Test
public void testDeleteWhenNoDeletePermissionOnFile() throws Exception {
login( sysAdminUserName, systemTenant, new String[] { tenantAdminRoleName, tenantAuthenticatedRoleName } );
ITenant tenantAcme =
tenantManager.createTenant( systemTenant, TENANT_ID_ACME, tenantAdminRoleName, tenantAuthenticatedRoleName,
"Anonymous" );
userRoleDao.createUser( tenantAcme, USERNAME_ADMIN, "password", "", new String[] { tenantAdminRoleName } );
login( USERNAME_ADMIN, tenantAcme, new String[] { tenantAdminRoleName, tenantAuthenticatedRoleName } );
defaultBackingRepositoryLifecycleManager.newTenant();
RepositoryFile publicFolderFile =
createSampleFile( repo.getFile(
ClientRepositoryPaths.getUserHomeFolderPath( PentahoSessionHolder.getSession().getName() ) ).getPath(),
"helloworld.[~!@#$%^&*(){}|.,]-=_+|;'?<:>~.sample", "ddfdf", false, 83 );
RepositoryFileAcl publicFolderFileAcl =
new Builder( publicFolderFile.getId(), userNameUtils.getPrincipleId( tenantAcme,
USERNAME_ADMIN ), Type.USER ).entriesInheriting( false ).ace(
new RepositoryFileSid( roleNameUtils.getPrincipleId( tenantAcme, tenantAuthenticatedRoleName ),
Type.ROLE ), RepositoryFilePermission.READ, RepositoryFilePermission.WRITE ).build();
repo.updateAcl( publicFolderFileAcl );
userRoleDao.createUser( tenantAcme, USERNAME_SUZY, "password", "", new String[] { tenantAuthenticatedRoleName } );
login( USERNAME_SUZY, tenantAcme, new String[] { tenantAuthenticatedRoleName } );
try {
repo.deleteFile( publicFolderFile.getId(), null );
fail();
} catch ( UnifiedRepositoryException e ) {
assertNotNull( e );
}
login( USERNAME_ADMIN, tenantAcme, new String[] { tenantAdminRoleName, tenantAuthenticatedRoleName } );
try {
repo.deleteFile( publicFolderFile.getId(), null );
assertTrue( true );
} catch ( UnifiedRepositoryException e ) {
fail();
}
}
/**
* Tests deleting a file when no delete permission is given to the role
*/
@Test
public void testWriteWhenNoWritePermissionOnFile() throws Exception {
login( sysAdminUserName, systemTenant, new String[] { tenantAdminRoleName, tenantAuthenticatedRoleName } );
ITenant tenantAcme =
tenantManager.createTenant( systemTenant, TENANT_ID_ACME, tenantAdminRoleName, tenantAuthenticatedRoleName,
"Anonymous" );
userRoleDao.createUser( tenantAcme, USERNAME_ADMIN, "password", "", new String[] { tenantAdminRoleName } );
login( USERNAME_ADMIN, tenantAcme, new String[] { tenantAdminRoleName, tenantAuthenticatedRoleName } );
defaultBackingRepositoryLifecycleManager.newTenant();
RepositoryFile publicFolderFile =
createSampleFile( repo.getFile(
ClientRepositoryPaths.getUserHomeFolderPath( PentahoSessionHolder.getSession().getName() ) ).getPath(),
"helloworld.[~!@#$%^&*(){}|.,]-=_+|;'?<:>~.sample", "ddfdf", false, 83 );
RepositoryFileAcl publicFolderFileAcl =
new Builder( publicFolderFile.getId(), userNameUtils.getPrincipleId( tenantAcme,
USERNAME_ADMIN ), Type.USER ).entriesInheriting( false ).ace(
new RepositoryFileSid( roleNameUtils.getPrincipleId( tenantAcme, tenantAuthenticatedRoleName ),
Type.ROLE ), RepositoryFilePermission.READ ).build();
repo.updateAcl( publicFolderFileAcl );
userRoleDao.createUser( tenantAcme, USERNAME_SUZY, "password", "", new String[] { tenantAuthenticatedRoleName } );
login( USERNAME_SUZY, tenantAcme, new String[] { tenantAuthenticatedRoleName } );
final String modSampleString = "Ciao World!";
final boolean modSampleBoolean = true;
final int modSampleInteger = 99;
final SampleRepositoryFileData modContent =
new SampleRepositoryFileData( modSampleString, modSampleBoolean, modSampleInteger );
try {
repo.updateFile( publicFolderFile, modContent, null );
fail();
} catch ( UnifiedRepositoryException e ) {
assertNotNull( e );
}
login( USERNAME_ADMIN, tenantAcme, new String[] { tenantAdminRoleName, tenantAuthenticatedRoleName } );
try {
repo.updateFile( publicFolderFile, modContent, null );
assertTrue( true );
} catch ( UnifiedRepositoryException e ) {
fail();
}
}
/**
* Tests Updating the ACL when no GRANT_PERMISSION is assigned
*
*/
@Test
public void testUpdatingPermissionWhenNoGrantPermissionOnFile() throws Exception {
login( sysAdminUserName, systemTenant, new String[] { tenantAdminRoleName, tenantAuthenticatedRoleName } );
ITenant tenantAcme =
tenantManager.createTenant( systemTenant, TENANT_ID_ACME, tenantAdminRoleName, tenantAuthenticatedRoleName,
"Anonymous" );
userRoleDao.createUser( tenantAcme, USERNAME_ADMIN, "password", "", new String[] { tenantAdminRoleName } );
login( USERNAME_ADMIN, tenantAcme, new String[] { tenantAdminRoleName, tenantAuthenticatedRoleName } );
userRoleDao.createUser( tenantAcme, USERNAME_SUZY, "password", "", new String[] { tenantAuthenticatedRoleName } );
userRoleDao.createUser( tenantAcme, USERNAME_TIFFANY, "password", ""
, new String[] { tenantAuthenticatedRoleName } );
defaultBackingRepositoryLifecycleManager.newTenant();
RepositoryFile parentFolder =
repo.getFile( ClientRepositoryPaths.getUserHomeFolderPath( PentahoSessionHolder.getSession().getName() ) );
RepositoryFile newFolder = new RepositoryFile.Builder( "[~!@#$%^&*(){}|.,]-=_+|;'?<:>~test" ).folder( true ).versioned( true ).build();
newFolder = repo.createFolder( parentFolder.getId(), newFolder, null );
RepositoryFileAcl acls = repo.getAcl( newFolder.getId() );
Builder newAclBuilder = new Builder( acls );
newAclBuilder.entriesInheriting( false ).ace( userNameUtils.getPrincipleId( tenantAcme, USERNAME_TIFFANY ),
Type.USER, RepositoryFilePermission.READ );
repo.updateAcl( newAclBuilder.build() );
login( USERNAME_TIFFANY, tenantAcme, new String[] { tenantAuthenticatedRoleName } );
RepositoryFileAcl newAcl = repo.getAcl( newFolder.getId() );
Builder anotherNewAclBuilder = new Builder( newAcl );
anotherNewAclBuilder.ace( new RepositoryFileSid( userNameUtils.getPrincipleId( tenantAcme,
tenantAuthenticatedRoleName ), Type.ROLE ), RepositoryFilePermission.READ,
RepositoryFilePermission.WRITE, RepositoryFilePermission.DELETE );
try {
repo.updateAcl( anotherNewAclBuilder.build() );
fail();
} catch ( UnifiedRepositoryException e ) {
assertNotNull( e );
}
}
@Test
public void testMoveFile() throws Exception {
login( sysAdminUserName, systemTenant, new String[] { tenantAdminRoleName, tenantAuthenticatedRoleName } );
ITenant tenantAcme =
tenantManager.createTenant( systemTenant, TENANT_ID_ACME, tenantAdminRoleName, tenantAuthenticatedRoleName,
"Anonymous" );
userRoleDao.createUser( tenantAcme, USERNAME_ADMIN, "password", "", new String[] { tenantAdminRoleName } );
login( USERNAME_ADMIN, tenantAcme, new String[] { tenantAdminRoleName, tenantAuthenticatedRoleName } );
userRoleDao.createUser( tenantAcme, USERNAME_SUZY, "password", "", null );
login( USERNAME_SUZY, tenantAcme, new String[] { tenantAuthenticatedRoleName } );
RepositoryFile parentFolder =
repo.getFile( ClientRepositoryPaths.getUserHomeFolderPath( PentahoSessionHolder.getSession().getName() ) );
RepositoryFile moveTest1Folder = new RepositoryFile.Builder( "[~!@#$%^&*(){}|.,]-=_+|;'?<:>~moveTest1" ).folder( true ).versioned( true ).build();
moveTest1Folder = repo.createFolder( parentFolder.getId(), moveTest1Folder, null );
RepositoryFile moveTest2Folder = new RepositoryFile.Builder( "[~!@#$%^&*(){}|.,]-=_+|;'?<:>~moveTest2" ).folder( true ).versioned( true ).build();
moveTest2Folder = repo.createFolder( parentFolder.getId(), moveTest2Folder, null );
RepositoryFile testFolder = new RepositoryFile.Builder( "[~!@#$%^&*(){}|.,]-=_+|;'?<:>~test" ).folder( true ).build();
testFolder = repo.createFolder( moveTest1Folder.getId(), testFolder, null );
// move folder into new folder
repo.moveFile( testFolder.getId(), moveTest2Folder.getPath(), null );
assertNull( repo.getFile( ClientRepositoryPaths.getUserHomeFolderPath( PentahoSessionHolder.getSession().getName() )
+ RepositoryFile.SEPARATOR + "[~!@#$%^&*(){}|.,]-=_+|;'?<:>~moveTest1" + RepositoryFile.SEPARATOR + "[~!@#$%^&*(){}|.,]-=_+|;'?<:>~test" ) );
assertNotNull( repo.getFile( ClientRepositoryPaths.getUserHomeFolderPath( PentahoSessionHolder.getSession()
.getName() )
+ RepositoryFile.SEPARATOR + "[~!@#$%^&*(){}|.,]-=_+|;'?<:>~moveTest2" + RepositoryFile.SEPARATOR + "[~!@#$%^&*(){}|.,]-=_+|;'?<:>~test" ) );
// rename within same folder
repo.moveFile( testFolder.getId(), moveTest2Folder.getPath() + RepositoryFile.SEPARATOR + "[~!@#$%^&*(){}|.,]-=_+|;'?<:>~newTest", null );
assertNull( repo.getFile( ClientRepositoryPaths.getUserHomeFolderPath( PentahoSessionHolder.getSession().getName() )
+ RepositoryFile.SEPARATOR + "[~!@#$%^&*(){}|.,]-=_+|;'?<:>~moveTest2" + RepositoryFile.SEPARATOR + "[~!@#$%^&*(){}|.,]-=_+|;'?<:>~test" ) );
assertNotNull( repo.getFile( ClientRepositoryPaths.getUserHomeFolderPath( PentahoSessionHolder.getSession()
.getName() )
+ RepositoryFile.SEPARATOR + "[~!@#$%^&*(){}|.,]-=_+|;'?<:>~moveTest2" + RepositoryFile.SEPARATOR + "[~!@#$%^&*(){}|.,]-=_+|;'?<:>~newTest" ) );
RepositoryFile newFile = createSampleFile( moveTest2Folder.getPath(), "helloworld.[~!@#$%^&*(){}|.,]-=_+|;'?<:>~.sample", "ddfdf", false, 83 );
try {
repo.moveFile( testFolder.getId(), moveTest2Folder.getPath() + RepositoryFile.SEPARATOR + "doesnotexist"
+ RepositoryFile.SEPARATOR + "newTest2", null );
fail();
} catch ( UnifiedRepositoryException e ) {
// moving a folder to a path with a non-existent parent folder is illegal
}
try {
repo.moveFile( testFolder.getId(), newFile.getPath(), null );
fail();
} catch ( UnifiedRepositoryException e ) {
// moving a folder to a file is illegal
}
}
@Test
public void testCopyRecursive() throws Exception {
login( sysAdminUserName, systemTenant, new String[] { tenantAdminRoleName, tenantAuthenticatedRoleName } );
ITenant tenantAcme =
tenantManager.createTenant( systemTenant, TENANT_ID_ACME, tenantAdminRoleName, tenantAuthenticatedRoleName,
"Anonymous" );
userRoleDao.createUser( tenantAcme, USERNAME_ADMIN, "password", "", new String[] { tenantAdminRoleName } );
login( USERNAME_ADMIN, tenantAcme, new String[] { tenantAdminRoleName, tenantAuthenticatedRoleName } );
userRoleDao.createUser( tenantAcme, USERNAME_SUZY, "password", "", null );
login( USERNAME_SUZY, tenantAcme, new String[] { tenantAuthenticatedRoleName } );
RepositoryFile parentFolder =
repo.getFile( ClientRepositoryPaths.getUserHomeFolderPath( PentahoSessionHolder.getSession().getName() ) );
RepositoryFile testFolder1 =
repo.createFolder( parentFolder.getId(), new RepositoryFile.Builder( "[~!@#$%^&*(){}|.,]-=_+|;'?<:>~testfolder1" ).folder( true ).build(),
null );
RepositoryFile testFile1 = createSimpleFile( testFolder1.getId(), "[~!@#$%^&*(){}|.,]-=_+|;'?<:>~testfile1" );
RepositoryFile testFolder2 =
repo.createFolder( parentFolder.getId(), new RepositoryFile.Builder( "[~!@#$%^&*(){}|.,]-=_+|;'?<:>~testfolder2" ).folder( true ).build(),
null );
RepositoryFile testFile2 = createSimpleFile( testFolder2.getId(), "[~!@#$%^&*(){}|.,]-=_+|;'?<:>~testfile2" );
repo.copyFile( testFolder1.getId(), testFolder2.getPath(), null );
assertNotNull( repo.getFile( testFolder2.getPath() + RepositoryFile.SEPARATOR + "[~!@#$%^&*(){}|.,]-=_+|;'?<:>~testfile2" ) );
assertNotNull( repo.getFile( testFolder2.getPath() + RepositoryFile.SEPARATOR + "[~!@#$%^&*(){}|.,]-=_+|;'?<:>~testfolder1" ) );
assertNotNull( repo.getFile( testFolder2.getPath() + RepositoryFile.SEPARATOR + "[~!@#$%^&*(){}|.,]-=_+|;'?<:>~testfolder1"
+ RepositoryFile.SEPARATOR + "[~!@#$%^&*(){}|.,]-=_+|;'?<:>~testfile1" ) );
}
@Test
public void testAdminCreate() throws Exception {
login( sysAdminUserName, systemTenant, new String[] { tenantAdminRoleName, tenantAuthenticatedRoleName } );
ITenant tenantAcme =
tenantManager.createTenant( systemTenant, TENANT_ID_ACME, tenantAdminRoleName, tenantAuthenticatedRoleName,
"Anonymous" );
userRoleDao.createUser( tenantAcme, USERNAME_ADMIN, "password", "", new String[] { tenantAdminRoleName } );
login( USERNAME_ADMIN, tenantAcme, new String[] { tenantAdminRoleName, tenantAuthenticatedRoleName } );
userRoleDao.createUser( tenantAcme, USERNAME_SUZY, "password", "", null );
login( USERNAME_SUZY, tenantAcme, new String[] { tenantAuthenticatedRoleName } );
login( USERNAME_ADMIN, tenantAcme, new String[] { tenantAdminRoleName, tenantAuthenticatedRoleName } );
final String expectedName = "helloworld.[~!@#$%^&*(){}|.,]-=_+|;'?<:>~.sample";
final String sampleString = "Ciao World!";
final boolean sampleBoolean = true;
final int sampleInteger = 99;
final String parentFolderPath = ClientRepositoryPaths.getUserHomeFolderPath( USERNAME_SUZY );
RepositoryFile newFile =
createSampleFile( parentFolderPath, expectedName, sampleString, sampleBoolean, sampleInteger );
RepositoryFileAcl acls = repo.getAcl( newFile.getId() );
Builder newAclBuilder = new Builder( acls );
newAclBuilder.entriesInheriting( false ).ace( userNameUtils.getPrincipleId( tenantAcme, USERNAME_SUZY ),
Type.USER, RepositoryFilePermission.ALL );
repo.updateAcl( newAclBuilder.build() );
// newFile = repo.getFile(newFile.getPath());
JcrRepositoryDumpToFile dumpToFile =
new JcrRepositoryDumpToFile( testJcrTemplate, jcrTransactionTemplate, repositoryAdminUsername,
"dumpTestAdminCreate", Mode.CUSTOM );
login( USERNAME_SUZY, tenantAcme, new String[] { tenantAuthenticatedRoleName } );
try {
repo.deleteFile( newFile.getId(), null );
} finally {
dumpToFile.execute();
}
}
@Test
public void testGetTree() throws Exception {
login( sysAdminUserName, systemTenant, new String[] { tenantAdminRoleName, tenantAuthenticatedRoleName } );
ITenant tenantAcme =
tenantManager.createTenant( systemTenant, TENANT_ID_ACME, tenantAdminRoleName, tenantAuthenticatedRoleName,
"Anonymous" );
userRoleDao.createUser( tenantAcme, USERNAME_ADMIN, "password", "", new String[] { tenantAdminRoleName } );
login( USERNAME_ADMIN, tenantAcme, new String[] { tenantAdminRoleName, tenantAuthenticatedRoleName } );
userRoleDao.createUser( tenantAcme, USERNAME_SUZY, "password", "", null );
login( USERNAME_SUZY, tenantAcme, new String[] { tenantAuthenticatedRoleName } );
RepositoryFileTree root = repo.getTree( ClientRepositoryPaths.getRootFolderPath(), 0, null, true );
assertNotNull( root.getFile() );
assertNull( root.getChildren() );
root = repo.getTree( ClientRepositoryPaths.getRootFolderPath(), 1, null, true );
assertNotNull( root.getFile() );
assertNotNull( root.getChildren() );
assertFalse( root.getChildren().isEmpty() );
assertNull( root.getChildren().get( 0 ).getChildren() );
root = repo.getTree( ClientRepositoryPaths.getHomeFolderPath(), -1, null, true );
assertNotNull( root.getFile() );
assertNotNull( root.getChildren() );
assertFalse( root.getChildren().isEmpty() );
assertTrue( root.getChildren().get( 0 ).getChildren().isEmpty() );
root = repo.getTree( ClientRepositoryPaths.getHomeFolderPath(), -1, "*uz*", true );
assertEquals( 1, root.getChildren().size() );
}
@Test
public void testGetTreeWithFileTypeFilter() throws Exception {
RepositoryFileTree root = null;
login( sysAdminUserName, systemTenant, new String[] { tenantAdminRoleName, tenantAuthenticatedRoleName } );
ITenant tenantAcme =
tenantManager.createTenant( systemTenant, TENANT_ID_ACME, tenantAdminRoleName, tenantAuthenticatedRoleName,
"Anonymous" );
userRoleDao.createUser( tenantAcme, USERNAME_ADMIN, "password", "", new String[] { tenantAdminRoleName } );
login( USERNAME_ADMIN, tenantAcme, new String[] { tenantAdminRoleName, tenantAuthenticatedRoleName } );
userRoleDao.createUser( tenantAcme, USERNAME_SUZY, "password", "", null );
login( USERNAME_SUZY, tenantAcme, new String[] { tenantAuthenticatedRoleName } );
RepositoryFile publicFolder =
repo.getFile( ClientRepositoryPaths.getUserHomeFolderPath( PentahoSessionHolder.getSession().getName() ) );
final String dataString = "Hello World!";
final String encoding = "UTF-8";
byte[] data = dataString.getBytes( encoding );
ByteArrayInputStream dataStream = new ByteArrayInputStream( data );
final String mimeType = "text/plain";
final SimpleRepositoryFileData content = new SimpleRepositoryFileData( dataStream, encoding, mimeType );
RepositoryFile newFile1 =
repo.createFile( publicFolder.getId(), new RepositoryFile.Builder( "helloworld.[~!@#$%^&*(){}|.,]-=_+|;'?<:>~.xaction" ).versioned( true )
.hidden( false ).build(), content, null );
RepositoryFile newFile2 =
repo.createFolder( publicFolder.getId(), new RepositoryFile.Builder( "[~!@#$%^&*(){}|.,]-=_+|;'?<:>~testFolder" ).versioned( false ).hidden(
false ).folder( true ).build(), null, null );
root = repo.getTree( publicFolder.getPath(), 1, "*|FILES", true );
assertFalse( root.getChildren().isEmpty() );
assertEquals( 1, root.getChildren().size() );
assertEquals( "helloworld.[~!@#$%^&*(){}|.,]-=_+|;'?<:>~.xaction", root.getChildren().get( 0 ).getFile().getName() );
root = repo.getTree( publicFolder.getPath(), 1, "*", true );
assertFalse( root.getChildren().isEmpty() );
assertEquals( 2, root.getChildren().size() );
root = repo.getTree( publicFolder.getPath(), 1, "*|FILES_FOLDERS", true );
assertFalse( root.getChildren().isEmpty() );
assertEquals( 2, root.getChildren().size() );
root = repo.getTree( publicFolder.getPath(), 1, "*|FOLDERS", true );
assertFalse( root.getChildren().isEmpty() );
assertEquals( 1, root.getChildren().size() );
assertEquals( "[~!@#$%^&*(){}|.,]-=_+|;'?<:>~testFolder", root.getChildren().get( 0 ).getFile().getName() );
}
@Test
public void testGetTreeWithShowHidden() throws Exception {
RepositoryFileTree root = null;
login( sysAdminUserName, systemTenant, new String[] { tenantAdminRoleName, tenantAuthenticatedRoleName } );
ITenant tenantAcme =
tenantManager.createTenant( systemTenant, TENANT_ID_ACME, tenantAdminRoleName, tenantAuthenticatedRoleName,
"Anonymous" );
userRoleDao.createUser( tenantAcme, USERNAME_ADMIN, "password", "", new String[] { tenantAdminRoleName } );
login( USERNAME_ADMIN, tenantAcme, new String[] { tenantAdminRoleName, tenantAuthenticatedRoleName } );
userRoleDao.createUser( tenantAcme, USERNAME_SUZY, "password", "", null );
login( USERNAME_SUZY, tenantAcme, new String[] { tenantAuthenticatedRoleName } );
RepositoryFile publicFolder =
repo.getFile( ClientRepositoryPaths.getUserHomeFolderPath( PentahoSessionHolder.getSession().getName() ) );
final String dataString = "Hello World!";
final String encoding = "UTF-8";
byte[] data = dataString.getBytes( encoding );
ByteArrayInputStream dataStream = new ByteArrayInputStream( data );
final String mimeType = "text/plain";
final SimpleRepositoryFileData content = new SimpleRepositoryFileData( dataStream, encoding, mimeType );
RepositoryFile newFile1 =
repo.createFile( publicFolder.getId(), new RepositoryFile.Builder( "helloworld.[~!@#$%^&*(){}|.,]-=_+|;'?<:>~.xaction" ).versioned( true )
.hidden( true ).build(), content, null );
root = repo.getTree( publicFolder.getPath(), -1, null, true );
assertFalse( root.getChildren().isEmpty() );
root = repo.getTree( publicFolder.getPath(), -1, null, false );
assertTrue( root.getChildren().isEmpty() );
}
@Test
public void testGetDataForReadInBatch_versioned() throws Exception {
login( sysAdminUserName, systemTenant, new String[] { tenantAdminRoleName, tenantAuthenticatedRoleName } );
ITenant tenantAcme =
tenantManager.createTenant( systemTenant, TENANT_ID_ACME, tenantAdminRoleName, tenantAuthenticatedRoleName,
"Anonymous" );
userRoleDao.createUser( tenantAcme, USERNAME_ADMIN, "password", "", new String[] { tenantAdminRoleName } );
login( USERNAME_ADMIN, tenantAcme, new String[] { tenantAdminRoleName, tenantAuthenticatedRoleName } );
userRoleDao.createUser( tenantAcme, USERNAME_SUZY, "password", "", null );
login( USERNAME_SUZY, tenantAcme, new String[] { tenantAuthenticatedRoleName } );
final String parentFolderPath = ClientRepositoryPaths.getUserHomeFolderPath( USERNAME_SUZY );
String sampleString1 = "sampleString1";
String sampleString2 = "sampleString2";
RepositoryFile newFile1 = createSampleFile( parentFolderPath, "helloworld.[~!@#$%^&*(){}|.,]-=_+|;'?<:>~.sample1", sampleString1, true, 1, true );
RepositoryFile newFile2 = createSampleFile( parentFolderPath, "[~!@#$%^&*(){}|.,]-=_+|;'?<:>~file2", sampleString2, false, 2 );
// Update newFile1 to create a new version
SampleRepositoryFileData updatedContent = new SampleRepositoryFileData( sampleString1 + "mod", true, 1 );
RepositoryFile modFile1 = repo.updateFile( newFile1, updatedContent, "New Version For Test" );
assertNotNull( newFile1.getId() );
assertTrue( newFile1.isVersioned() );
assertNotNull( newFile2.getId() );
assertFalse( newFile2.isVersioned() );
assertNotNull( modFile1.getId() );
assertTrue( modFile1.isVersioned() );
// Check that no version provided returns latest
RepositoryFile lookup1 = new RepositoryFile.Builder( newFile1.getId(), null ).build();
RepositoryFile lookup2 = new RepositoryFile.Builder( newFile2.getId(), null ).build();
List<SampleRepositoryFileData> data =
repo.getDataForReadInBatch( Arrays.asList( lookup1, lookup2 ), SampleRepositoryFileData.class );
assertEquals( 2, data.size() );
SampleRepositoryFileData d = data.get( 0 );
assertEquals( updatedContent.getSampleString(), d.getSampleString() );
d = data.get( 1 );
assertEquals( sampleString2, d.getSampleString() );
// Check that providing a version will fetch it properly
lookup1 = new RepositoryFile.Builder( newFile1.getId(), null ).versionId( newFile1.getVersionId() ).build();
lookup2 = new RepositoryFile.Builder( newFile2.getId(), null ).versionId( newFile2.getVersionId() ).build();
data = repo.getDataForReadInBatch( Arrays.asList( lookup1, lookup2 ), SampleRepositoryFileData.class );
assertEquals( 2, data.size() );
d = data.get( 0 );
assertEquals( sampleString1, d.getSampleString() );
d = data.get( 1 );
assertEquals( sampleString2, d.getSampleString() );
}
@Test
public void testMetadata() throws Exception {
String key1 = "myMetadataString";
String value1 = "wseyler";
String key2 = "myMetadataBoolean";
Boolean value2 = true;
String key3 = "myMetadataDate";
Calendar value3 = Calendar.getInstance();
String key4 = "myMetadataDouble";
Double value4 = 1234.378283293429;
String key5 = "myMetadataLong";
Long value5 = new Long( 12345768 );
login( sysAdminUserName, systemTenant, new String[] { tenantAdminRoleName, tenantAuthenticatedRoleName } );
ITenant tenantAcme =
tenantManager.createTenant( systemTenant, TENANT_ID_ACME, tenantAdminRoleName, tenantAuthenticatedRoleName,
"Anonymous" );
userRoleDao.createUser( tenantAcme, USERNAME_ADMIN, "password", "", new String[] { tenantAdminRoleName } );
login( USERNAME_ADMIN, tenantAcme, new String[] { tenantAdminRoleName, tenantAuthenticatedRoleName } );
userRoleDao.createUser( tenantAcme, USERNAME_SUZY, "password", "", null );
login( USERNAME_SUZY, tenantAcme, new String[] { tenantAuthenticatedRoleName } );
final String parentFolderPath = ClientRepositoryPaths.getUserHomeFolderPath( USERNAME_SUZY );
String sampleString1 = "sampleString1";
RepositoryFile newFile1 = createSampleFile( parentFolderPath, "helloworld.[~!@#$%^&*(){}|.,]-=_+|;'?<:>~.sample1", sampleString1, true, 1, true );
Map<String, Serializable> metadataMap = new HashMap<String, Serializable>();
metadataMap.put( key1, value1 );
repo.setFileMetadata( newFile1.getId(), metadataMap );
Map<String, Serializable> savedMap = repo.getFileMetadata( newFile1.getId() );
assertTrue( savedMap.containsKey( key1 ) );
assertEquals( value1, savedMap.get( key1 ) );
metadataMap.put( key2, value2 );
repo.setFileMetadata( newFile1.getId(), metadataMap );
savedMap = repo.getFileMetadata( newFile1.getId() );
assertTrue( savedMap.containsKey( key2 ) );
assertEquals( value2, savedMap.get( key2 ) );
metadataMap.put( key3, value3 );
repo.setFileMetadata( newFile1.getId(), metadataMap );
savedMap = repo.getFileMetadata( newFile1.getId() );
assertTrue( savedMap.containsKey( key3 ) );
assertEquals( value3.getTime().getTime(), ( (Calendar) savedMap.get( key3 ) ).getTime().getTime() );
metadataMap.put( key4, value4 );
repo.setFileMetadata( newFile1.getId(), metadataMap );
savedMap = repo.getFileMetadata( newFile1.getId() );
assertTrue( savedMap.containsKey( key4 ) );
assertEquals( value4, savedMap.get( key4 ) );
metadataMap.put( key5, value5 );
repo.setFileMetadata( newFile1.getId(), metadataMap );
savedMap = repo.getFileMetadata( newFile1.getId() );
assertTrue( savedMap.containsKey( key5 ) );
assertEquals( value5, savedMap.get( key5 ) );
}
@Test
public void testFileCreator() throws Exception {
login( sysAdminUserName, systemTenant, new String[] { tenantAdminRoleName, tenantAuthenticatedRoleName } );
ITenant tenantAcme =
tenantManager.createTenant( systemTenant, TENANT_ID_ACME, tenantAdminRoleName, tenantAuthenticatedRoleName,
"Anonymous" );
userRoleDao.createUser( tenantAcme, USERNAME_ADMIN, "password", "", new String[] { tenantAdminRoleName } );
login( USERNAME_ADMIN, tenantAcme, new String[] { tenantAdminRoleName, tenantAuthenticatedRoleName } );
userRoleDao.createUser( tenantAcme, USERNAME_SUZY, "password", "", null );
login( USERNAME_SUZY, tenantAcme, new String[] { tenantAuthenticatedRoleName } );
final String parentFolderPath = ClientRepositoryPaths.getUserHomeFolderPath( USERNAME_SUZY );
String sampleString1 = "sampleString1";
String sampleString2 = "sampleString2";
RepositoryFile newFile1 = createSampleFile( parentFolderPath, "helloworld.[~!@#$%^&*(){}|.,]-=_+|;'?<:>~.sample1", sampleString1, true, 1, true );
RepositoryFile newFile2 = createSampleFile( parentFolderPath, "helloworld.[~!@#$%^&*(){}|.,]-=_+|;'?<:>~.sample2", sampleString2, true, 1, true );
RepositoryFile.Builder builder = new RepositoryFile.Builder( newFile1 );
builder.creatorId( (String) newFile2.getId() );
final String mimeType = "text/plain";
final String dataString = "Hello World!";
final String encoding = "UTF-8";
byte[] data = dataString.getBytes( encoding );
ByteArrayInputStream dataStream = new ByteArrayInputStream( data );
final SimpleRepositoryFileData content = new SimpleRepositoryFileData( dataStream, encoding, mimeType );
RepositoryFile updatedFile = repo.updateFile( builder.build(), content, null );
RepositoryFile reconstituedFile = repo.getFileById( updatedFile.getId() );
assertEquals( reconstituedFile.getCreatorId(), newFile2.getId() );
}
@Test
public void testGetVersionSummaryInBatch() throws Exception {
login( sysAdminUserName, systemTenant, new String[] { tenantAdminRoleName, tenantAuthenticatedRoleName } );
ITenant tenantAcme =
tenantManager.createTenant( systemTenant, TENANT_ID_ACME, tenantAdminRoleName, tenantAuthenticatedRoleName,
"Anonymous" );
userRoleDao.createUser( tenantAcme, USERNAME_ADMIN, "password", "", new String[] { tenantAdminRoleName } );
login( USERNAME_ADMIN, tenantAcme, new String[] { tenantAdminRoleName, tenantAuthenticatedRoleName } );
userRoleDao.createUser( tenantAcme, USERNAME_SUZY, "password", "", null );
login( USERNAME_SUZY, tenantAcme, new String[] { tenantAuthenticatedRoleName } );
final String parentFolderPath =
ClientRepositoryPaths.getUserHomeFolderPath( PentahoSessionHolder.getSession().getName() );
RepositoryFile parentFolder = repo.getFile( parentFolderPath );
final String dataString = "Hello World!";
final String encoding = "UTF-8";
byte[] data = dataString.getBytes( encoding );
ByteArrayInputStream dataStream = new ByteArrayInputStream( data );
final String mimeType = "text/plain";
final String fileName1 = "helloworld1.[~!@#$%^&*(){}|.,]-=_+|;'?<:>~.xaction";
final String fileName2 = "helloworld2.[~!@#$%^&*(){}|.,]-=_+|;'?<:>~.xaction";
final SimpleRepositoryFileData content = new SimpleRepositoryFileData( dataStream, encoding, mimeType );
RepositoryFile newFile1 =
repo.createFile( parentFolder.getId(), new RepositoryFile.Builder( fileName1 ).versioned( true ).build(),
content, "created helloworld.xaction" );
final String createMsg = "created helloworld2.xaction";
RepositoryFile newFile2 =
repo.createFile( parentFolder.getId(), new RepositoryFile.Builder( fileName2 ).versioned( true ).build(),
content, createMsg );
final String updateMsg1 = "updating 1";
newFile1 = repo.updateFile( newFile1, content, updateMsg1 );
// Update file2 but don't save the info. We'll look up the original revision
repo.updateFile( newFile2, content, "updating 2" );
// Create a new file with just the Id set so we get the latest revision
RepositoryFile lookup1 = new RepositoryFile.Builder( newFile1.getId(), null ).build();
// Create a new file with the original version id and file id for file #2
RepositoryFile lookup2 =
new RepositoryFile.Builder( newFile2.getId(), null ).versionId( newFile2.getVersionId() ).build();
List<VersionSummary> versionSummaries = repo.getVersionSummaryInBatch( Arrays.asList( lookup1, lookup2 ) );
assertNotNull( versionSummaries );
assertEquals( 2, versionSummaries.size() );
VersionSummary summary = versionSummaries.get( 0 );
// First version summary should be for the latest version of file1
assertEquals( newFile1.getId(), summary.getVersionedFileId() );
assertEquals( updateMsg1, summary.getMessage() );
assertEquals( newFile1.getVersionId(), summary.getId() );
summary = versionSummaries.get( 1 );
// Second version summary should be for the first version of file2
assertEquals( newFile2.getId(), summary.getVersionedFileId() );
assertEquals( newFile2.getVersionId(), summary.getId() );
assertEquals( createMsg, summary.getMessage() );
}
private RepositoryFile createSampleFile( final String parentFolderPath, final String fileName,
final String sampleString, final boolean sampleBoolean, final int sampleInteger, boolean versioned )
throws Exception {
RepositoryFile parentFolder = repo.getFile( parentFolderPath );
final SampleRepositoryFileData content = new SampleRepositoryFileData( sampleString, sampleBoolean, sampleInteger );
return repo.createFile( parentFolder.getId(),
new RepositoryFile.Builder( fileName ).versioned( versioned ).build(), content, null );
}
private RepositoryFile createSampleFile( final String parentFolderPath, final String fileName,
final String sampleString, final boolean sampleBoolean, final int sampleInteger ) throws Exception {
return createSampleFile( parentFolderPath, fileName, sampleString, sampleBoolean, sampleInteger, false );
}
private RepositoryFile createSimpleFile( final Serializable parentFolderId, final String fileName ) throws Exception {
final String dataString = "Hello World!";
final String encoding = "UTF-8";
byte[] data = dataString.getBytes( encoding );
ByteArrayInputStream dataStream = new ByteArrayInputStream( data );
final SimpleRepositoryFileData content = new SimpleRepositoryFileData( dataStream, encoding, "text/plain" );
return repo.createFile( parentFolderId, new RepositoryFile.Builder( fileName ).build(), content, null );
}
private void assertLocalAceExists( final RepositoryFile file, final RepositoryFileSid sid,
final EnumSet<RepositoryFilePermission> permissions ) {
RepositoryFileAcl acl = repo.getAcl( file.getId() );
List<RepositoryFileAce> aces = acl.getAces();
for ( int i = 0; i < aces.size(); i++ ) {
RepositoryFileAce ace = aces.get( i );
if ( sid.equals( ace.getSid() ) && permissions.equals( ace.getPermissions() ) ) {
return;
}
}
fail();
}
private void assertLocalAclEmpty( final RepositoryFile file ) {
RepositoryFileAcl acl = repo.getAcl( file.getId() );
assertTrue( acl.getAces().size() == 0 );
}
@Override
public void setApplicationContext( final ApplicationContext applicationContext ) throws BeansException {
SessionFactory jcrSessionFactory = (SessionFactory) applicationContext.getBean( "jcrSessionFactory" );
testJcrTemplate = new JcrTemplate( jcrSessionFactory );
testJcrTemplate.setAllowCreate( true );
testJcrTemplate.setExposeNativeSession( true );
jcrTemplate = (JcrTemplate) applicationContext.getBean("jcrTemplate");
repositoryAdminUsername = (String) applicationContext.getBean( "repositoryAdminUsername" );
superAdminRoleName = (String) applicationContext.getBean( "superAdminAuthorityName" );
sysAdminUserName = (String) applicationContext.getBean( "superAdminUserName" );
tenantAuthenticatedRoleName = (String) applicationContext.getBean( "singleTenantAuthenticatedAuthorityName" );
tenantAdminRoleName = (String) applicationContext.getBean( "singleTenantAdminAuthorityName" );
tenantManager = (ITenantManager) applicationContext.getBean( "tenantMgrProxy" );
pathConversionHelper = (IPathConversionHelper) applicationContext.getBean( "pathConversionHelper" );
roleBindingDao =
(IRoleAuthorizationPolicyRoleBindingDao) applicationContext
.getBean( "roleAuthorizationPolicyRoleBindingDaoTxn" );
roleBindingDaoTarget =
(IRoleAuthorizationPolicyRoleBindingDao) applicationContext
.getBean( "roleAuthorizationPolicyRoleBindingDaoTarget" );
authorizationPolicy = (IAuthorizationPolicy) applicationContext.getBean( "authorizationPolicy" );
repo = (IUnifiedRepository) applicationContext.getBean( "unifiedRepository" );
userRoleDao = (IUserRoleDao) applicationContext.getBean( "userRoleDao" );
jcrTransactionTemplate = (TransactionTemplate) applicationContext.getBean( "jcrTransactionTemplate" );
defaultBackingRepositoryLifecycleManager =
(IBackingRepositoryLifecycleManager) applicationContext.getBean( "defaultBackingRepositoryLifecycleManager" );
repositoryFileDao = (IRepositoryFileDao) applicationContext.getBean( "repositoryFileDao" );
testUserRoleDao = userRoleDao;
repositoryLifecyleManager =
(IBackingRepositoryLifecycleManager) applicationContext.getBean( "defaultBackingRepositoryLifecycleManager" );
txnTemplate = (TransactionTemplate) applicationContext.getBean( "jcrTransactionTemplate" );
TestPrincipalProvider.userRoleDao = testUserRoleDao;
TestPrincipalProvider.adminCredentialsStrategy =
(CredentialsStrategy) applicationContext.getBean( "jcrAdminCredentialsStrategy" );
TestPrincipalProvider.repository = (Repository) applicationContext.getBean( "jcrRepository" );
}
protected void loginAsSysTenantAdmin() {
login( sysAdminUserName, systemTenant, new String[] { tenantAdminRoleName } );
}
/**
* Logs in with given username.
*
* @param username
* username of user
* @param tenantId
* tenant to which this user belongs
* @tenantAdmin true to add the tenant admin authority to the user's roles
*/
protected void login( final String username, final ITenant tenant, String[] roles ) {
StandaloneSession pentahoSession = new StandaloneSession( username );
pentahoSession.setAuthenticated( tenant.getId(), username );
PentahoSessionHolder.setSession( pentahoSession );
pentahoSession.setAttribute( IPentahoSession.TENANT_ID_KEY, tenant.getId() );
final String password = "password";
List<GrantedAuthority> authList = new ArrayList<GrantedAuthority>();
for ( String roleName : roles ) {
authList.add( new GrantedAuthorityImpl( roleName ) );
}
GrantedAuthority[] authorities = authList.toArray( new GrantedAuthority[0] );
UserDetails userDetails = new User( username, password, true, true, true, true, authorities );
Authentication auth = new UsernamePasswordAuthenticationToken( userDetails, password, authorities );
PentahoSessionHolder.setSession( pentahoSession );
// this line necessary for Spring Security's MethodSecurityInterceptor
SecurityContextHolder.getContext().setAuthentication( auth );
createUserHomeFolder( tenant, username );
defaultBackingRepositoryLifecycleManager.newTenant();
}
protected void logout() {
PentahoSessionHolder.removeSession();
SecurityContextHolder.getContext().setAuthentication( null );
}
protected void loginAsRepositoryAdmin() {
StandaloneSession pentahoSession = new StandaloneSession( repositoryAdminUsername );
pentahoSession.setAuthenticated( repositoryAdminUsername );
final GrantedAuthority[] repositoryAdminAuthorities =
new GrantedAuthority[] { new GrantedAuthorityImpl( superAdminRoleName ) };
final String password = "ignored";
UserDetails repositoryAdminUserDetails =
new User( repositoryAdminUsername, password, true, true, true, true, repositoryAdminAuthorities );
Authentication repositoryAdminAuthentication =
new UsernamePasswordAuthenticationToken( repositoryAdminUserDetails, password, repositoryAdminAuthorities );
PentahoSessionHolder.setSession( pentahoSession );
// this line necessary for Spring Security's MethodSecurityInterceptor
SecurityContextHolder.getContext().setAuthentication( repositoryAdminAuthentication );
}
protected ITenant getCurrentTenant() {
if ( PentahoSessionHolder.getSession() != null ) {
String tenantId = (String) PentahoSessionHolder.getSession().getAttribute( IPentahoSession.TENANT_ID_KEY );
return tenantId != null ? new Tenant( tenantId, true ) : null;
} else {
return null;
}
}
protected ITenant getTenant( String principalId, boolean isUser ) {
ITenant tenant = null;
ITenantedPrincipleNameResolver nameUtils = isUser ? userNameUtils : roleNameUtils;
if ( nameUtils != null ) {
tenant = nameUtils.getTenant( principalId );
}
if ( tenant == null || tenant.getId() == null ) {
tenant = getCurrentTenant();
}
return tenant;
}
protected String getPrincipalName( String principalId, boolean isUser ) {
String principalName = null;
ITenantedPrincipleNameResolver nameUtils = isUser ? userNameUtils : roleNameUtils;
if ( nameUtils != null ) {
principalName = nameUtils.getPrincipleName( principalId );
}
return principalName;
}
protected void createUserHomeFolder( final ITenant theTenant, final String theUsername ) {
IPentahoSession origPentahoSession = PentahoSessionHolder.getSession();
Authentication origAuthentication = SecurityContextHolder.getContext().getAuthentication();
StandaloneSession pentahoSession = new StandaloneSession( repositoryAdminUsername );
pentahoSession.setAuthenticated( null, repositoryAdminUsername );
PentahoSessionHolder.setSession( pentahoSession );
try {
txnTemplate.execute( new TransactionCallbackWithoutResult() {
public void doInTransactionWithoutResult( final TransactionStatus status ) {
Builder aclsForUserHomeFolder = null;
Builder aclsForTenantHomeFolder = null;
ITenant tenant = null;
String username = null;
if ( theTenant == null ) {
tenant = getTenant( username, true );
username = getPrincipalName( theUsername, true );
} else {
tenant = theTenant;
username = theUsername;
}
if ( tenant == null || tenant.getId() == null ) {
tenant = getCurrentTenant();
}
if ( tenant == null || tenant.getId() == null ) {
tenant = JcrTenantUtils.getDefaultTenant();
}
RepositoryFile userHomeFolder = null;
String userId = userNameUtils.getPrincipleId( theTenant, username );
final RepositoryFileSid userSid = new RepositoryFileSid( userId );
RepositoryFile tenantHomeFolder = null;
RepositoryFile tenantRootFolder = null;
// Get the Tenant Root folder. If the Tenant Root folder does not exist then exit.
tenantRootFolder =
repositoryFileDao.getFileByAbsolutePath( ServerRepositoryPaths.getTenantRootFolderPath( theTenant ) );
if ( tenantRootFolder != null ) {
// Try to see if Tenant Home folder exist
tenantHomeFolder =
repositoryFileDao.getFileByAbsolutePath( ServerRepositoryPaths.getTenantHomeFolderPath( theTenant ) );
if ( tenantHomeFolder == null ) {
String ownerId = userNameUtils.getPrincipleId( theTenant, username );
RepositoryFileSid ownerSid = new RepositoryFileSid( ownerId, Type.USER );
String tenantAuthenticatedRoleId = roleNameUtils.getPrincipleId( theTenant, tenantAuthenticatedRoleName );
RepositoryFileSid tenantAuthenticatedRoleSid =
new RepositoryFileSid( tenantAuthenticatedRoleId, Type.ROLE );
aclsForTenantHomeFolder =
new Builder( userSid ).ace( tenantAuthenticatedRoleSid, EnumSet
.of( RepositoryFilePermission.READ ) );
aclsForUserHomeFolder =
new Builder( userSid ).ace( ownerSid, EnumSet.of( RepositoryFilePermission.ALL ) );
tenantHomeFolder =
repositoryFileDao.createFolder( tenantRootFolder.getId(), new RepositoryFile.Builder(
ServerRepositoryPaths.getTenantHomeFolderName() ).folder( true ).build(), aclsForTenantHomeFolder
.build(), "tenant home folder" );
} else {
String ownerId = userNameUtils.getPrincipleId( theTenant, username );
RepositoryFileSid ownerSid = new RepositoryFileSid( ownerId, Type.USER );
aclsForUserHomeFolder =
new Builder( userSid ).ace( ownerSid, EnumSet.of( RepositoryFilePermission.ALL ) );
}
// now check if user's home folder exist
userHomeFolder =
repositoryFileDao.getFileByAbsolutePath( ServerRepositoryPaths.getUserHomeFolderPath( theTenant,
username ) );
if ( userHomeFolder == null ) {
userHomeFolder =
repositoryFileDao.createFolder( tenantHomeFolder.getId(), new RepositoryFile.Builder( username )
.folder( true ).build(), aclsForUserHomeFolder.build(), "user home folder" ); //$NON-NLS-1$
}
}
}
} );
} finally {
// Switch our identity back to the original user.
PentahoSessionHolder.setSession( origPentahoSession );
SecurityContextHolder.getContext().setAuthentication( origAuthentication );
}
}
@Test
public void testDeleteUsersFolder() throws Exception {
login( sysAdminUserName, systemTenant, new String[] { tenantAdminRoleName, tenantAuthenticatedRoleName } );
ITenant tenantAcme =
tenantManager.createTenant( systemTenant, TENANT_ID_ACME, tenantAdminRoleName, tenantAuthenticatedRoleName,
"Anonymous" );
userRoleDao.createUser( tenantAcme, USERNAME_ADMIN, "password", "", new String[] { tenantAdminRoleName } );
login( USERNAME_ADMIN, tenantAcme, new String[] { tenantAdminRoleName, tenantAuthenticatedRoleName } );
userRoleDao.createUser( tenantAcme, USERNAME_SUZY, "password", "", null );
login( USERNAME_SUZY, tenantAcme, new String[] { tenantAuthenticatedRoleName } );
final String parentFolderPath =
ClientRepositoryPaths.getUserHomeFolderPath( PentahoSessionHolder.getSession().getName() );
RepositoryFile parentFolder = repo.getFile( parentFolderPath );
final String dataString = "Hello World!";
final String encoding = "UTF-8";
byte[] data = dataString.getBytes( encoding );
ByteArrayInputStream dataStream = new ByteArrayInputStream( data );
final String mimeType = "text/plain";
final String fileName = "helloworld.xaction";
final SimpleRepositoryFileData content = new SimpleRepositoryFileData( dataStream, encoding, mimeType );
RepositoryFile newFile =
repo.createFile( parentFolder.getId(), new RepositoryFile.Builder( fileName ).build(), content, null );
final String filePath = parentFolderPath + RepositoryFile.SEPARATOR + fileName;
login( USERNAME_ADMIN, tenantAcme, new String[] { tenantAdminRoleName, tenantAuthenticatedRoleName } );
try {
repo.deleteFile( repo.getFile( parentFolderPath ).getId(), null );
} catch ( Exception e ) {
e.printStackTrace();
fail();
}
}
@Test
public void testDeleteInheritingFolder() throws Exception {
login( sysAdminUserName, systemTenant, new String[] { tenantAdminRoleName, tenantAuthenticatedRoleName } );
ITenant tenantAcme =
tenantManager.createTenant( systemTenant, TENANT_ID_ACME, tenantAdminRoleName, tenantAuthenticatedRoleName,
"Anonymous" );
userRoleDao.createUser( tenantAcme, USERNAME_ADMIN, "password", "", new String[] { tenantAdminRoleName } );
login( USERNAME_ADMIN, tenantAcme, new String[] { tenantAdminRoleName, tenantAuthenticatedRoleName } );
userRoleDao.createUser( tenantAcme, USERNAME_SUZY, "password", "", null );
login( USERNAME_SUZY, tenantAcme, new String[] { tenantAuthenticatedRoleName } );
final String parentFolderPath =
ClientRepositoryPaths.getUserHomeFolderPath( PentahoSessionHolder.getSession().getName() );
RepositoryFile parentFolder = repo.getFile( parentFolderPath );
final String dataString = "Hello World!";
final String encoding = "UTF-8";
byte[] data = dataString.getBytes( encoding );
ByteArrayInputStream dataStream = new ByteArrayInputStream( data );
final String mimeType = "text/plain";
final String fileName = "helloworld.xaction";
final SimpleRepositoryFileData content = new SimpleRepositoryFileData( dataStream, encoding, mimeType );
// Try an inheriting folder delete
//CHECKSTYLE IGNORE AvoidNestedBlocks FOR NEXT 3 LINES
{
RepositoryFile newFolder =
repo.createFolder( parentFolder.getId(), new RepositoryFile.Builder( "testFolder" ).folder( true ).build(),
null, null );
RepositoryFileAcl acl = repo.getAcl( newFolder.getId() );
RepositoryFileAcl newAcl =
new Builder( acl ).ace( userNameUtils.getPrincipleId( tenantAcme, USERNAME_ADMIN ),
Type.USER, RepositoryFilePermission.ALL ).entriesInheriting( true ).build();
repo.updateAcl( newAcl );
login( USERNAME_ADMIN, tenantAcme, new String[] { tenantAdminRoleName, tenantAuthenticatedRoleName } );
try {
repo.deleteFile( newFolder.getId(), null );
} catch ( Exception e ) {
e.printStackTrace();
fail();
}
}
// Now try one not inheriting
//CHECKSTYLE IGNORE AvoidNestedBlocks FOR NEXT 3 LINES
{
RepositoryFile newFolder =
repo.createFolder( parentFolder.getId(), new RepositoryFile.Builder( "testFolder2" ).folder( true ).build(),
null, null );
RepositoryFileAcl acl = repo.getAcl( newFolder.getId() );
RepositoryFileAcl newAcl =
new Builder( acl ).clearAces().ace(
userNameUtils.getPrincipleId( tenantAcme, USERNAME_ADMIN ), Type.USER,
RepositoryFilePermission.ALL ).entriesInheriting( false ).build();
repo.updateAcl( newAcl );
login( USERNAME_ADMIN, tenantAcme, new String[] { tenantAdminRoleName, tenantAuthenticatedRoleName } );
try {
repo.deleteFile( newFolder.getId(), null );
} catch ( Exception e ) {
e.printStackTrace();
fail();
}
}
}
@Test
public void testDeleteInheritingFile2() throws Exception {
login( sysAdminUserName, systemTenant, new String[] { tenantAdminRoleName, tenantAuthenticatedRoleName } );
ITenant tenantAcme =
tenantManager.createTenant( systemTenant, TENANT_ID_ACME, tenantAdminRoleName, tenantAuthenticatedRoleName,
"Anonymous" );
userRoleDao.createUser( tenantAcme, USERNAME_ADMIN, "password", "", new String[] { tenantAdminRoleName } );
login( USERNAME_ADMIN, tenantAcme, new String[] { tenantAdminRoleName, tenantAuthenticatedRoleName } );
userRoleDao.createUser( tenantAcme, USERNAME_SUZY, "password", "", null );
login( USERNAME_SUZY, tenantAcme, new String[] { tenantAuthenticatedRoleName } );
final String parentFolderPath =
ClientRepositoryPaths.getUserHomeFolderPath( PentahoSessionHolder.getSession().getName() );
RepositoryFile parentFolder = repo.getFile( parentFolderPath );
final String dataString = "Hello World!";
final String encoding = "UTF-8";
byte[] data = dataString.getBytes( encoding );
ByteArrayInputStream dataStream = new ByteArrayInputStream( data );
final String mimeType = "text/plain";
final String fileName = "helloworld.xaction";
final SimpleRepositoryFileData content = new SimpleRepositoryFileData( dataStream, encoding, mimeType );
RepositoryFile newFolder = null;
// Try an inheriting file delete
//CHECKSTYLE IGNORE AvoidNestedBlocks FOR NEXT 3 LINES
{
newFolder =
repo.createFolder( parentFolder.getId(), new RepositoryFile.Builder( "testFolder" ).folder( true ).build(),
null, null );
RepositoryFile newFile =
repo.createFile( newFolder.getId(), new RepositoryFile.Builder( "testFile" ).folder( false ).build(),
content, null );
RepositoryFileAcl acl = repo.getAcl( newFile.getId() );
RepositoryFileAcl newAcl =
new Builder( acl ).ace( userNameUtils.getPrincipleId( tenantAcme, USERNAME_ADMIN ),
Type.USER, RepositoryFilePermission.ALL ).entriesInheriting( true ).build();
repo.updateAcl( newAcl );
login( USERNAME_ADMIN, tenantAcme, new String[] { tenantAdminRoleName, tenantAuthenticatedRoleName } );
try {
repo.deleteFile( newFile.getId(), null );
} catch ( Exception e ) {
e.printStackTrace();
fail();
}
}
// Now try one not inheriting
//CHECKSTYLE IGNORE AvoidNestedBlocks FOR NEXT 3 LINES
{
RepositoryFile newFile =
repo.createFile( newFolder.getId(), new RepositoryFile.Builder( "testFile" ).folder( false ).build(),
content, null );
RepositoryFileAcl acl = repo.getAcl( newFile.getId() );
RepositoryFileAcl newAcl =
new Builder( acl ).ace( userNameUtils.getPrincipleId( tenantAcme, USERNAME_ADMIN ),
Type.USER, RepositoryFilePermission.ALL ).entriesInheriting( false ).build();
repo.updateAcl( newAcl );
login( USERNAME_ADMIN, tenantAcme, new String[] { tenantAdminRoleName, tenantAuthenticatedRoleName } );
try {
repo.deleteFile( newFile.getId(), null );
} catch ( Exception e ) {
e.printStackTrace();
fail();
}
}
}
@Test
public void testInheritingNodeRemoval() throws Exception {
login( sysAdminUserName, systemTenant, new String[] { tenantAdminRoleName, tenantAuthenticatedRoleName } );
ITenant tenantAcme =
tenantManager.createTenant( systemTenant, TENANT_ID_ACME, tenantAdminRoleName, tenantAuthenticatedRoleName,
"Anonymous" );
userRoleDao.createUser( tenantAcme, USERNAME_ADMIN, "password", "", new String[] { tenantAdminRoleName } );
login( USERNAME_ADMIN, tenantAcme, new String[] { tenantAdminRoleName, tenantAuthenticatedRoleName } );
userRoleDao.createUser( tenantAcme, USERNAME_SUZY, "password", "", null );
final String parentFolderPath = ClientRepositoryPaths.getPublicFolderPath();
RepositoryFile parentFolder = repo.getFile( parentFolderPath );
DataNode node = new DataNode( "kdjd" );
node.setProperty( "ddf", "ljsdfkjsdkf" );
DataNode newChild1 = node.addNode( "herfkmdx" );
NodeRepositoryFileData data = new NodeRepositoryFileData( node );
RepositoryFile repoFile =
repo.createFile( parentFolder.getId(), new RepositoryFile.Builder( "test" ).build(), data, null );
RepositoryFileAcl acl = repo.getAcl( repoFile.getId() );
RepositoryFileSid suzySid = new RepositoryFileSid( userNameUtils.getPrincipleId( tenantAcme, USERNAME_SUZY ) );
Builder newAclBuilder =
new Builder( acl ).ace( suzySid, EnumSet.of( RepositoryFilePermission.READ,
RepositoryFilePermission.WRITE ) );
repo.updateAcl( newAclBuilder.build() );
login( USERNAME_SUZY, tenantAcme, new String[] { tenantAuthenticatedRoleName } );
repoFile = repo.getFile( repoFile.getPath() );
node = new DataNode( "kdjd" );
node.setProperty( "foo", "bar" );
newChild1 = node.addNode( "sdfsdf" );
data = new NodeRepositoryFileData( node );
repo.updateFile( repoFile, data, "testUpdate" );
}
}