/* * 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 - 2016 Pentaho Corporation. All rights reserved. */ package org.pentaho.platform.plugin.services.importexport.exportManifest; import java.io.File; import java.util.ArrayList; import java.util.Date; import java.util.EnumSet; import java.util.HashSet; import java.util.List; import java.util.Locale; import org.apache.commons.lang.StringUtils; import org.pentaho.platform.api.repository2.unified.RepositoryFile; import org.pentaho.platform.api.repository2.unified.RepositoryFileAce; import org.pentaho.platform.api.repository2.unified.RepositoryFileAcl; import org.pentaho.platform.api.repository2.unified.RepositoryFilePermission; import org.pentaho.platform.api.repository2.unified.RepositoryFileSid; import org.pentaho.platform.plugin.services.importexport.exportManifest.bindings.CustomProperty; import org.pentaho.platform.plugin.services.importexport.exportManifest.bindings.EntityAcl; import org.pentaho.platform.plugin.services.importexport.exportManifest.bindings.EntityMetaData; import org.pentaho.platform.plugin.services.importexport.exportManifest.bindings.ExportManifestEntityDto; import org.pentaho.platform.plugin.services.importexport.exportManifest.bindings.ExportManifestProperty; import org.pentaho.platform.repository2.messages.Messages; import org.pentaho.platform.security.userroledao.DefaultTenantedPrincipleNameResolver; import org.pentaho.platform.util.messages.LocaleHelper; /** * This Object represents the information stored in the ExportManifest for one file or folder. The * <code>ExportManifest</code> object contains a Hashmap of these objects keyed by the path. * * @author tkafalas */ public class ExportManifestEntity { private ExportManifestEntityDto rawExportManifestEntity; private EntityMetaData entityMetaData; private EntityAcl entityAcl; private List<CustomProperty> customProperties; protected ExportManifestEntity() { rawExportManifestEntity = new ExportManifestEntityDto(); } protected ExportManifestEntity( String rootFolder, RepositoryFile repositoryFile, RepositoryFileAcl repositoryFileAcl ) throws ExportManifestFormatException { this(); ExportManifestProperty rawExportManifestProperty = new ExportManifestProperty(); createEntityMetaData( rootFolder, repositoryFile ); createEntityAcl( repositoryFileAcl ); rawExportManifestProperty.setEntityMetaData( entityMetaData ); rawExportManifestProperty.setEntityAcl( entityAcl ); } protected ExportManifestEntity( File file, String userId, String projectId, Boolean isFolder, Boolean isHidden, Boolean isSchedulable ) { this(); ExportManifestProperty rawExportManifestProperty = new ExportManifestProperty(); createEntityMetaData( file, userId, projectId, isFolder, isHidden, isSchedulable ); createEntityAcl( userId ); rawExportManifestProperty.setEntityMetaData( entityMetaData ); rawExportManifestProperty.setEntityAcl( entityAcl ); } private void createEntityAcl( String userId ) { entityAcl = new EntityAcl(); entityAcl.setEntriesInheriting( true ); } private void createEntityMetaData( File file, String userId, String projectId, Boolean isFolder, Boolean isHidden, Boolean isSchedulable ) { if ( LocaleHelper.getLocale() == null ) { LocaleHelper.setLocale( Locale.getDefault() ); } entityMetaData = new EntityMetaData(); entityMetaData.setCreatedBy( userId ); entityMetaData.setCreatedDate( XmlGregorianCalendarConverter.asXMLGregorianCalendar( new Date() ) ); entityMetaData.setDescription( "Project folder for AgileBi Project named: " + projectId ); entityMetaData.setHidden( isHidden ); entityMetaData.setSchedulable( isSchedulable ); entityMetaData.setIsFolder( isFolder ); entityMetaData.setLocale( LocaleHelper.getLocale().toString() ); entityMetaData.setName( file.getName() ); entityMetaData.setPath( StringUtils.replaceChars( file.getPath(), "/\\", "//" ) ); entityMetaData.setTitle( file.getName() ); setPath( StringUtils.replaceChars( file.getPath(), "/\\", "//" ) ); } private void createEntityMetaData( String rootFolder, RepositoryFile repositoryFile ) throws ExportManifestFormatException { if ( LocaleHelper.getLocale() == null ) { LocaleHelper.setLocale( Locale.getDefault() ); } entityMetaData = new EntityMetaData(); entityMetaData.setCreatedBy( repositoryFile.getCreatorId() ); entityMetaData.setCreatedDate( XmlGregorianCalendarConverter.asXMLGregorianCalendar( repositoryFile .getCreatedDate() ) ); entityMetaData.setDescription( repositoryFile.getDescription() ); entityMetaData.setHidden( repositoryFile.isHidden() ); entityMetaData.setSchedulable( repositoryFile.isSchedulable() ); entityMetaData.setIsFolder( repositoryFile.isFolder() ); entityMetaData.setLocale( LocaleHelper.getLocale().toString() ); entityMetaData.setName( repositoryFile.getName() ); /* * before testing, strip trailing slash from rootFolder if it exists but only for string comparison with * repositoryFile path. This is just a convenience to not fail if someone adds a trailing slash to the repo path * when exporting from the command line */ String testRootFolder = rootFolder; if ( testRootFolder.endsWith( "/" ) ) { testRootFolder = testRootFolder.substring( 0, testRootFolder.length() - 1 ); } if ( !repositoryFile.getPath().startsWith( testRootFolder ) ) { throw new ExportManifestFormatException( "File path does not start with rootFolder" ); } String adjustedPath = repositoryFile.getPath().substring( rootFolder.length() ); entityMetaData.setPath( adjustedPath ); entityMetaData.setTitle( repositoryFile.getTitle() ); setPath( adjustedPath ); } private void createEntityAcl( RepositoryFileAcl repositoryFileAcl ) { DefaultTenantedPrincipleNameResolver nameResolver = new DefaultTenantedPrincipleNameResolver(); if ( repositoryFileAcl == null ) { return; } entityAcl = new EntityAcl(); entityAcl.setEntriesInheriting( repositoryFileAcl.isEntriesInheriting() ); entityAcl.setOwner( nameResolver.getPrincipleName( repositoryFileAcl.getOwner().getName() ) ); entityAcl.setOwnerType( repositoryFileAcl.getOwner().getType().name() ); List<EntityAcl.Aces> aces = entityAcl.getAces(); aces.clear(); for ( RepositoryFileAce repositoryFileAce : repositoryFileAcl.getAces() ) { EntityAcl.Aces ace = new EntityAcl.Aces(); ace.setRecipient( nameResolver.getPrincipleName( repositoryFileAce.getSid().getName() ) ); ace.setRecipientType( repositoryFileAce.getSid().getType().name() ); List<String> permissions = ace.getPermissions(); for ( RepositoryFilePermission permission : repositoryFileAce.getPermissions() ) { permissions.add( permission.toString() ); } aces.add( ace ); } } /** * Helper method for importing. Returns a FileRepository object for the the ExportManifestEntity. Will return null if * there is no EntityMetaData present although this should not happen if the manifest is present at all. * * @return RepositoryFile */ public RepositoryFile getRepositoryFile() { EntityMetaData emd = getEntityMetaData(); if ( entityMetaData == null ) { return null; } return new RepositoryFile( null, emd.getName(), emd.isIsFolder(), emd.isHidden(), emd.isSchedulable(), false, null, emd.getPath(), XmlGregorianCalendarConverter.asDate( emd.getCreatedDate() ), null, false, null, null, null, "en-US", emd .getTitle(), emd.getDescription(), null, null, 0, emd.getOwner(), null ); } /** * Helper method for importing. Returns a FileRepositoryAcl object for the the ExportManifestEntity. Will return null * if there is no EntityAcl present. * * @return RepositoryFile */ public RepositoryFileAcl getRepositoryFileAcl() throws ExportManifestFormatException { RepositoryFileAcl repositoryFileAcl; EntityAcl entityAcl = getEntityAcl(); if ( entityAcl == null ) { return null; } ArrayList<RepositoryFileAce> repositoryFileAces = new ArrayList<RepositoryFileAce>(); RepositoryFileSid rfs; for ( EntityAcl.Aces ace : entityAcl.getAces() ) { rfs = getSid( ace.getRecipient(), ace.getRecipientType() ); HashSet<RepositoryFilePermission> permissionSet = new HashSet<RepositoryFilePermission>(); for ( String permission : ace.getPermissions() ) { permissionSet.add( getPermission( permission ) ); } RepositoryFileAce repositoryFileAce = new RepositoryFileAce( rfs, EnumSet.copyOf( permissionSet ) ); repositoryFileAces.add( repositoryFileAce ); } repositoryFileAcl = new RepositoryFileAcl( "", getSid( entityAcl.getOwner(), entityAcl.getOwnerType() ), entityAcl .isEntriesInheriting(), repositoryFileAces ); return repositoryFileAcl; } /** * Creates a RepositoryFileSid object from the serialized values adding error handling for enum values that may not * exist * * @param name * @param type * @return * @throws ExportManifestFormatException */ private RepositoryFileSid getSid( String name, String type ) throws ExportManifestFormatException { RepositoryFileSid.Type typevalue; try { typevalue = RepositoryFileSid.Type.valueOf( type ); } catch ( IllegalArgumentException e ) { throw new ExportManifestFormatException( Messages.getInstance().getString( "ExportManifestFormatException.invalidRepositoryFileSidType", type ), e ); } return new RepositoryFileSid( name, typevalue ); } /** * Assigns Enum Permission value from string representation adding error handling if the string is invalid * * @param stringValue * @return integer value * @throws ExportManifestFormatException */ private RepositoryFilePermission getPermission( String stringValue ) throws ExportManifestFormatException { RepositoryFilePermission value; try { value = RepositoryFilePermission.valueOf( stringValue ); } catch ( IllegalArgumentException e ) { throw new ExportManifestFormatException( Messages.getInstance().getString( "ExportManifestFormatException.invalidPermissionType", stringValue ), e ); } return value; } /** * Builds an ExportManifestEntityDto for use by the ExportManifest Package. * * @return */ ExportManifestEntityDto getExportManifestEntityDto() { // Property list is not kept in sync. Create it now List<ExportManifestProperty> rawProperties = rawExportManifestEntity.getExportManifestProperty(); rawProperties.clear(); if ( entityMetaData != null ) { ExportManifestProperty exportManifestProperty = new ExportManifestProperty(); exportManifestProperty.setEntityMetaData( entityMetaData ); rawProperties.add( exportManifestProperty ); } if ( entityAcl != null ) { ExportManifestProperty exportManifestProperty = new ExportManifestProperty(); exportManifestProperty.setEntityAcl( entityAcl ); rawProperties.add( exportManifestProperty ); } if ( customProperties != null && customProperties.size() > 0 ) { ExportManifestProperty exportManifestProperty = new ExportManifestProperty(); exportManifestProperty.getCustomProperty().addAll( customProperties ); rawProperties.add( exportManifestProperty ); } return rawExportManifestEntity; } /** * Create this object from the Jaxb bound version of the object. * * @param exportManifestEntity */ public ExportManifestEntity( ExportManifestEntityDto exportManifestEntity ) { this.rawExportManifestEntity = exportManifestEntity; for ( ExportManifestProperty exportManifestProperty : exportManifestEntity.getExportManifestProperty() ) { if ( exportManifestProperty.getEntityMetaData() != null ) { entityMetaData = exportManifestProperty.getEntityMetaData(); } else if ( exportManifestProperty.getEntityAcl() != null ) { entityAcl = exportManifestProperty.getEntityAcl(); } else if ( exportManifestProperty.getCustomProperty() != null && exportManifestProperty.getCustomProperty().size() > 0 ) { customProperties = exportManifestProperty.getCustomProperty(); } } } public boolean isValid() { if ( entityMetaData == null ) { return false; } else { return true; } } /** * @return the entityMetaData */ public EntityMetaData getEntityMetaData() { return entityMetaData; } /** * @param entityMetaData the entityMetaData to set */ public void setEntityMetaData( EntityMetaData entityMetaData ) { this.entityMetaData = entityMetaData; } /** * @return the entityAcl */ public EntityAcl getEntityAcl() { return entityAcl; } /** * @param entityAcl the entityAcl to set */ public void setEntityAcl( EntityAcl entityAcl ) { this.entityAcl = entityAcl; } /** * @return the customProperty */ public List<CustomProperty> getCustomProperties() { return customProperties; } /** * @param customProperties the customProperty to set */ public void setCustomProperties( List<CustomProperty> customProperties ) { this.customProperties = customProperties; } /** * @return the path */ public String getPath() { return rawExportManifestEntity.getPath(); } /** * @param path the path to set */ public void setPath( String path ) { rawExportManifestEntity.setPath( path ); } }