/* * 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 java.io.Serializable; import java.util.Collections; import java.util.EnumSet; import java.util.List; import java.util.Locale; import java.util.Map; import java.util.Properties; import java.util.UUID; import java.util.concurrent.Callable; import org.apache.commons.lang.exception.ExceptionUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.pentaho.platform.api.locale.IPentahoLocale; import org.pentaho.platform.api.repository2.unified.IRepositoryFileData; import org.pentaho.platform.api.repository2.unified.IUnifiedRepository; 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.RepositoryFileTree; import org.pentaho.platform.api.repository2.unified.RepositoryRequest; import org.pentaho.platform.api.repository2.unified.UnifiedRepositoryException; import org.pentaho.platform.api.repository2.unified.VersionSummary; import org.pentaho.platform.repository2.messages.Messages; import org.springframework.util.Assert; /** * Decorates another {@code IUnifiedRepository} instance and logs exceptions if they occur. Also, a new non-chained * exception is thrown. (The root cause will not leave this class.) * * @author mlowery */ public class ExceptionLoggingDecorator implements IUnifiedRepository { // ~ Static fields/initializers // ====================================================================================== private static final Log logger = LogFactory.getLog( ExceptionLoggingDecorator.class ); // ~ Instance fields // ================================================================================================= private final IUnifiedRepository delegatee; private final Map<String, ExceptionConverter> exceptionConverterMap; // ~ Constructors // ==================================================================================================== public ExceptionLoggingDecorator( final IUnifiedRepository delegatee, final Map<String, ExceptionConverter> exceptionConverterMap ) { super(); Assert.notNull( delegatee ); this.delegatee = delegatee; this.exceptionConverterMap = exceptionConverterMap; } // ~ Methods // ========================================================================================================= public boolean canUnlockFile( final Serializable fileId ) { return callLogThrow( new Callable<Boolean>() { public Boolean call() throws Exception { return delegatee.canUnlockFile( fileId ); } }, Messages.getInstance().getString( "ExceptionLoggingDecorator.canUnlockFile", fileId ) ); //$NON-NLS-1$ } public RepositoryFile createFile( final Serializable parentFolderId, final RepositoryFile file, final IRepositoryFileData data, final String versionMessage ) { return callLogThrow( new Callable<RepositoryFile>() { public RepositoryFile call() throws Exception { return delegatee.createFile( parentFolderId, file, data, versionMessage ); } }, Messages.getInstance().getString( "ExceptionLoggingDecorator.createFile", file.getName() ) ); //$NON-NLS-1$ } public RepositoryFile createFolder( final Serializable parentFolderId, final RepositoryFile file, final String versionMessage ) { return callLogThrow( new Callable<RepositoryFile>() { public RepositoryFile call() throws Exception { return delegatee.createFolder( parentFolderId, file, versionMessage ); } }, Messages.getInstance().getString( "ExceptionLoggingDecorator.createFolder", file.getName() ) ); //$NON-NLS-1$ } public void deleteFile( final Serializable fileId, final boolean permanent, final String versionMessage ) { callLogThrow( new Callable<Void>() { public Void call() throws Exception { delegatee.deleteFile( fileId, permanent, versionMessage ); return null; } }, Messages.getInstance().getString( "ExceptionLoggingDecorator.deleteFile", fileId ) ); //$NON-NLS-1$ } public void deleteFile( final Serializable fileId, final String versionMessage ) { callLogThrow( new Callable<Void>() { public Void call() throws Exception { delegatee.deleteFile( fileId, versionMessage ); return null; } }, Messages.getInstance().getString( "ExceptionLoggingDecorator.deleteFile", fileId ) ); //$NON-NLS-1$ } public void deleteFileAtVersion( final Serializable fileId, final Serializable versionId ) { callLogThrow( new Callable<Void>() { public Void call() throws Exception { delegatee.deleteFileAtVersion( fileId, versionId ); return null; } }, Messages.getInstance().getString( "ExceptionLoggingDecorator.deleteFileAtVersion", fileId, versionId ) ); //$NON-NLS-1$ } public RepositoryFileAcl getAcl( final Serializable fileId ) { return callLogThrow( new Callable<RepositoryFileAcl>() { public RepositoryFileAcl call() throws Exception { return delegatee.getAcl( fileId ); } }, Messages.getInstance().getString( "ExceptionLoggingDecorator.getAcl", fileId ) ); //$NON-NLS-1$ } @Override public List<RepositoryFile> getChildren( final RepositoryRequest repositoryRequest ) { return callLogThrow( new Callable<List<RepositoryFile>>() { public List<RepositoryFile> call() throws Exception { return delegatee.getChildren( repositoryRequest ); } }, Messages.getInstance().getString( "ExceptionLoggingDecorator.getChildren", repositoryRequest.getPath() ) ); //$NON-NLS-1$ } @Deprecated public List<RepositoryFile> getChildren( final Serializable folderId ) { return getChildren( folderId, "", false); } @Deprecated public List<RepositoryFile> getChildren( final Serializable folderId, final String filter) { return getChildren( folderId, filter, false); } @Deprecated public List<RepositoryFile> getChildren( final Serializable folderId, final String filter, final Boolean showHiddenFiles ) { return getChildren( new RepositoryRequest(folderId.toString(), showHiddenFiles, -1, filter ) ); } public <T extends IRepositoryFileData> T getDataAtVersionForExecute( final Serializable fileId, final Serializable versionId, final Class<T> dataClass ) { return callLogThrow( new Callable<T>() { public T call() throws Exception { return delegatee.getDataAtVersionForExecute( fileId, versionId, dataClass ); } }, Messages.getInstance().getString( "ExceptionLoggingDecorator.getDataAtVersion", fileId, versionId ) ); //$NON-NLS-1$ } public <T extends IRepositoryFileData> T getDataAtVersionForRead( final Serializable fileId, final Serializable versionId, final Class<T> dataClass ) { return callLogThrow( new Callable<T>() { public T call() throws Exception { return delegatee.getDataAtVersionForRead( fileId, versionId, dataClass ); } }, Messages.getInstance().getString( "ExceptionLoggingDecorator.getDataAtVersion", fileId, versionId ) ); //$NON-NLS-1$ } public <T extends IRepositoryFileData> T getDataForExecute( final Serializable fileId, final Class<T> dataClass ) { return callLogThrow( new Callable<T>() { public T call() throws Exception { return delegatee.getDataForExecute( fileId, dataClass ); } }, Messages.getInstance().getString( "ExceptionLoggingDecorator.getData", fileId ) ); //$NON-NLS-1$ } public <T extends IRepositoryFileData> java.util.List<T> getDataForExecuteInBatch( final List<RepositoryFile> files, final Class<T> dataClass ) { return callLogThrow( new Callable<List<T>>() { public List<T> call() throws Exception { return delegatee.getDataForReadInBatch( files, dataClass ); } }, Messages.getInstance().getString( "ExceptionLoggingDecorator.getDataInBatch" ) ); //$NON-NLS-1$ } public <T extends IRepositoryFileData> T getDataForRead( final Serializable fileId, final Class<T> dataClass ) { return callLogThrow( new Callable<T>() { public T call() throws Exception { return delegatee.getDataForRead( fileId, dataClass ); } }, Messages.getInstance().getString( "ExceptionLoggingDecorator.getData", fileId ) ); //$NON-NLS-1$ } public <T extends IRepositoryFileData> List<T> getDataForReadInBatch( final List<RepositoryFile> files, final Class<T> dataClass ) { return callLogThrow( new Callable<List<T>>() { public List<T> call() throws Exception { return delegatee.getDataForReadInBatch( files, dataClass ); } }, Messages.getInstance().getString( "ExceptionLoggingDecorator.getDataInBatch" ) ); //$NON-NLS-1$ } public List<RepositoryFile> getDeletedFiles( final String origParentFolderPath ) { return callLogThrow( new Callable<List<RepositoryFile>>() { public List<RepositoryFile> call() throws Exception { return delegatee.getDeletedFiles( origParentFolderPath ); } }, Messages.getInstance().getString( "ExceptionLoggingDecorator.getDeletedFilesInFolder", origParentFolderPath ) ); //$NON-NLS-1$ } public List<RepositoryFile> getDeletedFiles( final String origParentFolderPath, final String filter ) { return callLogThrow( new Callable<List<RepositoryFile>>() { public List<RepositoryFile> call() throws Exception { return delegatee.getDeletedFiles( origParentFolderPath, filter ); } }, Messages.getInstance().getString( "ExceptionLoggingDecorator.getDeletedFilesInFolder", origParentFolderPath ) ); //$NON-NLS-1$ } public List<RepositoryFile> getDeletedFiles() { return callLogThrow( new Callable<List<RepositoryFile>>() { public List<RepositoryFile> call() throws Exception { return delegatee.getDeletedFiles(); } }, Messages.getInstance().getString( "ExceptionLoggingDecorator.getDeletedFiles" ) ); //$NON-NLS-1$ } public List<RepositoryFileAce> getEffectiveAces( final Serializable fileId ) { return callLogThrow( new Callable<List<RepositoryFileAce>>() { public List<RepositoryFileAce> call() throws Exception { return delegatee.getEffectiveAces( fileId ); } }, Messages.getInstance().getString( "ExceptionLoggingDecorator.getEffectiveAces", fileId ) ); //$NON-NLS-1$ } public List<RepositoryFileAce> getEffectiveAces( final Serializable fileId, final boolean forceEntriesInheriting ) { return callLogThrow( new Callable<List<RepositoryFileAce>>() { public List<RepositoryFileAce> call() throws Exception { return delegatee.getEffectiveAces( fileId, forceEntriesInheriting ); } }, Messages.getInstance().getString( "ExceptionLoggingDecorator.getEffectiveAces", fileId ) ); //$NON-NLS-1$ } public RepositoryFile getFile( final String path ) { return callLogThrow( new Callable<RepositoryFile>() { public RepositoryFile call() throws Exception { return delegatee.getFile( path ); } }, Messages.getInstance().getString( "ExceptionLoggingDecorator.getFile", path ) ); //$NON-NLS-1$ } public RepositoryFile getFile( final String path, final boolean loadLocaleMaps ) { return callLogThrow( new Callable<RepositoryFile>() { public RepositoryFile call() throws Exception { return delegatee.getFile( path, loadLocaleMaps ); } }, Messages.getInstance().getString( "ExceptionLoggingDecorator.getFile", path ) ); //$NON-NLS-1$ } public RepositoryFile getFileAtVersion( final Serializable fileId, final Serializable versionId ) { return callLogThrow( new Callable<RepositoryFile>() { public RepositoryFile call() throws Exception { return delegatee.getFileAtVersion( fileId, versionId ); } }, Messages.getInstance().getString( "ExceptionLoggingDecorator.getFileAtVersion", fileId, versionId ) ); //$NON-NLS-1$ } public RepositoryFile getFileById( final Serializable fileId ) { return callLogThrow( new Callable<RepositoryFile>() { public RepositoryFile call() throws Exception { return delegatee.getFileById( fileId ); } }, Messages.getInstance().getString( "ExceptionLoggingDecorator.getFileById", fileId ) ); //$NON-NLS-1$ } public RepositoryFile getFileById( final Serializable fileId, final boolean loadLocaleMaps ) { return callLogThrow( new Callable<RepositoryFile>() { public RepositoryFile call() throws Exception { return delegatee.getFileById( fileId, loadLocaleMaps ); } }, Messages.getInstance().getString( "ExceptionLoggingDecorator.getFileById", fileId ) ); //$NON-NLS-1$ } @Override public RepositoryFile getFile( final String path, final IPentahoLocale locale ) { return callLogThrow( new Callable<RepositoryFile>() { public RepositoryFile call() throws Exception { return delegatee.getFile( path, locale ); } }, Messages.getInstance().getString( "ExceptionLoggingDecorator.getFile", path ) ); //$NON-NLS-1$ } @Override public RepositoryFile getFileById( final Serializable fileId, final IPentahoLocale locale ) { return callLogThrow( new Callable<RepositoryFile>() { public RepositoryFile call() throws Exception { return delegatee.getFileById( fileId, locale ); } }, Messages.getInstance().getString( "ExceptionLoggingDecorator.getFileById", fileId ) ); //$NON-NLS-1$ } @Override public RepositoryFile getFile( final String path, final boolean loadLocaleMaps, final IPentahoLocale locale ) { return callLogThrow( new Callable<RepositoryFile>() { public RepositoryFile call() throws Exception { return delegatee.getFile( path, loadLocaleMaps, locale ); } }, Messages.getInstance().getString( "ExceptionLoggingDecorator.getFile", path ) ); //$NON-NLS-1$ } @Override public RepositoryFile getFileById( final Serializable fileId, final boolean loadLocaleMaps, final IPentahoLocale locale ) { return callLogThrow( new Callable<RepositoryFile>() { public RepositoryFile call() throws Exception { return delegatee.getFileById( fileId, loadLocaleMaps, locale ); } }, Messages.getInstance().getString( "ExceptionLoggingDecorator.getFileById", fileId ) ); //$NON-NLS-1$ } public List<VersionSummary> getVersionSummaries( final Serializable fileId ) { return callLogThrow( new Callable<List<VersionSummary>>() { public List<VersionSummary> call() throws Exception { return delegatee.getVersionSummaries( fileId ); } }, Messages.getInstance().getString( "ExceptionLoggingDecorator.getVersionSummaries", fileId ) ); //$NON-NLS-1$ } public VersionSummary getVersionSummary( final Serializable fileId, final Serializable versionId ) { return callLogThrow( new Callable<VersionSummary>() { public VersionSummary call() throws Exception { return delegatee.getVersionSummary( fileId, versionId ); } }, Messages.getInstance().getString( "ExceptionLoggingDecorator.getVersionSummary", fileId, versionId ) ); //$NON-NLS-1$ } public List<VersionSummary> getVersionSummaryInBatch( final List<RepositoryFile> files ) { return callLogThrow( new Callable<List<VersionSummary>>() { public List<VersionSummary> call() throws Exception { return delegatee.getVersionSummaryInBatch( files ); } }, Messages.getInstance().getString( "ExceptionLoggingDecorator.getVersionSummaryInBatch" ) ); //$NON-NLS-1$ } public boolean hasAccess( final String path, final EnumSet<RepositoryFilePermission> permissions ) { return callLogThrow( new Callable<Boolean>() { public Boolean call() throws Exception { return delegatee.hasAccess( path, permissions ); } }, Messages.getInstance().getString( "ExceptionLoggingDecorator.hasAccess", path ) ); //$NON-NLS-1$ } public void lockFile( final Serializable fileId, final String message ) { callLogThrow( new Callable<Void>() { public Void call() throws Exception { delegatee.lockFile( fileId, message ); return null; } }, Messages.getInstance().getString( "ExceptionLoggingDecorator.lockFile", fileId ) ); //$NON-NLS-1$ } public void moveFile( final Serializable fileId, final String destAbsPath, final String versionMessage ) { callLogThrow( new Callable<Void>() { public Void call() throws Exception { delegatee.moveFile( fileId, destAbsPath, versionMessage ); return null; } }, Messages.getInstance().getString( "ExceptionLoggingDecorator.moveFile", fileId, destAbsPath ) ); //$NON-NLS-1$ } public void copyFile( final Serializable fileId, final String destAbsPath, final String versionMessage ) { callLogThrow( new Callable<Void>() { public Void call() throws Exception { delegatee.copyFile( fileId, destAbsPath, versionMessage ); return null; } }, Messages.getInstance().getString( "ExceptionLoggingDecorator.copyFile", fileId, destAbsPath ) ); //$NON-NLS-1$ } public void restoreFileAtVersion( final Serializable fileId, final Serializable versionId, final String versionMessage ) { callLogThrow( new Callable<Void>() { public Void call() throws Exception { delegatee.restoreFileAtVersion( fileId, versionId, versionMessage ); return null; } }, Messages.getInstance().getString( "ExceptionLoggingDecorator.restoreFileAtVersion", fileId, versionId ) ); //$NON-NLS-1$ } public void undeleteFile( final Serializable fileId, final String versionMessage ) { callLogThrow( new Callable<Void>() { public Void call() throws Exception { delegatee.undeleteFile( fileId, versionMessage ); return null; } }, Messages.getInstance().getString( "ExceptionLoggingDecorator.undeleteFile", fileId ) ); //$NON-NLS-1$ } public void unlockFile( final Serializable fileId ) { callLogThrow( new Callable<Void>() { public Void call() throws Exception { delegatee.unlockFile( fileId ); return null; } }, Messages.getInstance().getString( "ExceptionLoggingDecorator.unlockFile", fileId ) ); //$NON-NLS-1$ } public RepositoryFileAcl updateAcl( final RepositoryFileAcl acl ) { return callLogThrow( new Callable<RepositoryFileAcl>() { public RepositoryFileAcl call() throws Exception { return delegatee.updateAcl( acl ); } }, Messages.getInstance().getString( "ExceptionLoggingDecorator.updateAcl", acl != null ? acl.getId() : null ) ); //$NON-NLS-1$ } public RepositoryFile updateFile( final RepositoryFile file, final IRepositoryFileData data, final String versionMessage ) { return callLogThrow( new Callable<RepositoryFile>() { public RepositoryFile call() throws Exception { return delegatee.updateFile( file, data, versionMessage ); } }, Messages.getInstance().getString( "ExceptionLoggingDecorator.updateFile", file != null ? file.getId() : null ) ); //$NON-NLS-1$ } @Override public RepositoryFileTree getTree( final RepositoryRequest repositoryRequest ) { return callLogThrow( new Callable<RepositoryFileTree>() { public RepositoryFileTree call() throws Exception { return delegatee.getTree( repositoryRequest ); } }, Messages.getInstance().getString( "ExceptionLoggingDecorator.getTree", repositoryRequest.getPath() ) ); //$NON-NLS-1$ } @Deprecated public RepositoryFileTree getTree( final String path, final int depth, final String filter, final boolean showHidden ) { return getTree( new RepositoryRequest( path, showHidden, depth, filter ) ); } public RepositoryFile createFile( final Serializable parentFolderId, final RepositoryFile file, final IRepositoryFileData data, final RepositoryFileAcl acl, final String versionMessage ) { return callLogThrow( new Callable<RepositoryFile>() { public RepositoryFile call() throws Exception { return delegatee.createFile( parentFolderId, file, data, acl, versionMessage ); } }, Messages.getInstance().getString( "ExceptionLoggingDecorator.createFile", file.getName() ) ); //$NON-NLS-1$ } public RepositoryFile createFolder( final Serializable parentFolderId, final RepositoryFile file, final RepositoryFileAcl acl, final String versionMessage ) { return callLogThrow( new Callable<RepositoryFile>() { public RepositoryFile call() throws Exception { return delegatee.createFolder( parentFolderId, file, acl, versionMessage ); } }, Messages.getInstance().getString( "ExceptionLoggingDecorator.createFolder", file.getName() ) ); //$NON-NLS-1$ } /** * Calls the Callable and returns the value it returns. If an exception occurs, it is logged and a new * non-chained exception is thrown. * * @param <T> * return type * @param callable * code to call * @param message * verbose description of operation * @return return value of Callable */ private <T> T callLogThrow( final Callable<T> callable, final String message ) { try { return callable.call(); } catch ( Exception e ) { // generate reference # String refNum = UUID.randomUUID().toString(); if ( logger.isDebugEnabled() ) { logger.debug( Messages.getInstance().getString( "ExceptionLoggingDecorator.referenceNumber", refNum ), e ); //$NON-NLS-1$ } // list all exceptions in stack @SuppressWarnings( "unchecked" ) List<Throwable> throwablesInStack = ExceptionUtils.getThrowableList( e ); // reverse them so most specific exception (root cause) comes first Collections.reverse( throwablesInStack ); for ( Throwable t : throwablesInStack ) { String className = t.getClass().getName(); if ( exceptionConverterMap.containsKey( className ) ) { throw exceptionConverterMap.get( className ).convertException( (Exception) t, message, refNum ); } } // no converter; throw general exception throw new UnifiedRepositoryException( Messages.getInstance().getString( "ExceptionLoggingDecorator.generalException", message, refNum ), e ); //$NON-NLS-1$ } } public List<RepositoryFile> getReferrers( final Serializable fileId ) { return callLogThrow( new Callable<List<RepositoryFile>>() { public List<RepositoryFile> call() throws Exception { return delegatee.getReferrers( fileId ); } }, Messages.getInstance().getString( "ExceptionLoggingDecorator.getReferrers", fileId ) ); //$NON-NLS-1$ } public void setFileMetadata( final Serializable fileId, final Map<String, Serializable> metadataMap ) { callLogThrow( new Callable<Void>() { public Void call() throws Exception { delegatee.setFileMetadata( fileId, metadataMap ); return null; } }, Messages.getInstance().getString( "ExceptionLoggingDecorator.setFileMetadata", fileId, metadataMap ) ); //$NON-NLS-1$ } public Map<String, Serializable> getFileMetadata( final Serializable fileId ) { return callLogThrow( new Callable<Map<String, Serializable>>() { public Map<String, Serializable> call() throws Exception { return delegatee.getFileMetadata( fileId ); } }, Messages.getInstance().getString( "ExceptionLoggingDecorator.getFileMetadata", fileId ) ); //$NON-NLS-1$ } public List<Character> getReservedChars() { return callLogThrow( new Callable<List<Character>>() { public List<Character> call() throws Exception { return delegatee.getReservedChars(); } }, Messages.getInstance().getString( "ExceptionLoggingDecorator.getReservedChars" ) ); //$NON-NLS-1$ } /** * Converts an exception before throwing to callers. */ public static interface ExceptionConverter { /** * Converts the exception. * * @param exception * exception * @param activityMessage * message describing activity in progress when exception occurred * @param refNum * reference number generated on server for this exception * @return converted exception */ UnifiedRepositoryException convertException( final Exception exception, final String activityMessage, final String refNum ); } @Override public List<Locale> getAvailableLocalesForFileById( final Serializable fileId ) { return callLogThrow( new Callable<List<Locale>>() { public List<Locale> call() throws Exception { return delegatee.getAvailableLocalesForFileById( fileId ); } }, Messages.getInstance().getString( "ExceptionLoggingDecorator.getAvailableLocalesForFile", fileId ) ); //$NON-NLS-1$ } @Override public List<Locale> getAvailableLocalesForFileByPath( final String relPath ) { return callLogThrow( new Callable<List<Locale>>() { public List<Locale> call() throws Exception { return delegatee.getAvailableLocalesForFileByPath( relPath ); } }, Messages.getInstance().getString( "ExceptionLoggingDecorator.getAvailableLocalesForFile", relPath ) ); //$NON-NLS-1$ } @Override public List<Locale> getAvailableLocalesForFile( final RepositoryFile repositoryFile ) { return callLogThrow( new Callable<List<Locale>>() { public List<Locale> call() throws Exception { return delegatee.getAvailableLocalesForFile( repositoryFile ); } }, Messages.getInstance() .getString( "ExceptionLoggingDecorator.getAvailableLocalesForFile", repositoryFile.getId() ) ); //$NON-NLS-1$ } @Override public Properties getLocalePropertiesForFileById( final Serializable fileId, final String locale ) { return callLogThrow( new Callable<Properties>() { public Properties call() throws Exception { return delegatee.getLocalePropertiesForFileById( fileId, locale ); } }, Messages.getInstance().getString( "ExceptionLoggingDecorator.getLocalePropertiesForFile", fileId ) ); //$NON-NLS-1$ } @Override public Properties getLocalePropertiesForFileByPath( final String relPath, final String locale ) { return callLogThrow( new Callable<Properties>() { public Properties call() throws Exception { return delegatee.getLocalePropertiesForFileByPath( relPath, locale ); } }, Messages.getInstance().getString( "ExceptionLoggingDecorator.getLocalePropertiesForFile", relPath ) ); //$NON-NLS-1$ } @Override public Properties getLocalePropertiesForFile( final RepositoryFile repositoryFile, final String locale ) { return callLogThrow( new Callable<Properties>() { public Properties call() throws Exception { return delegatee.getLocalePropertiesForFile( repositoryFile, locale ); } }, Messages.getInstance() .getString( "ExceptionLoggingDecorator.getLocalePropertiesForFile", repositoryFile.getId() ) ); //$NON-NLS-1$ } @Override public void setLocalePropertiesForFileById( final Serializable fileId, final String locale, final Properties properties ) { callLogThrow( new Callable<Void>() { public Void call() throws Exception { delegatee.setLocalePropertiesForFileById( fileId, locale, properties ); return null; } }, Messages.getInstance().getString( "ExceptionLoggingDecorator.setLocalePropertiesForFile", fileId ) ); //$NON-NLS-1$ } @Override public void setLocalePropertiesForFileByPath( final String relPath, final String locale, final Properties properties ) { callLogThrow( new Callable<Void>() { public Void call() throws Exception { delegatee.setLocalePropertiesForFileByPath( relPath, locale, properties ); return null; } }, Messages.getInstance().getString( "ExceptionLoggingDecorator.setLocalePropertiesForFile", relPath ) ); //$NON-NLS-1$ } @Override public void setLocalePropertiesForFile( final RepositoryFile repositoryFile, final String locale, final Properties properties ) { callLogThrow( new Callable<Void>() { public Void call() throws Exception { delegatee.setLocalePropertiesForFile( repositoryFile, locale, properties ); return null; } }, Messages.getInstance() .getString( "ExceptionLoggingDecorator.setLocalePropertiesForFile", repositoryFile.getId() ) ); //$NON-NLS-1$ } @Override public void deleteLocalePropertiesForFile( final RepositoryFile repositoryFile, final String locale ) { callLogThrow( new Callable<Void>() { public Void call() throws Exception { delegatee.deleteLocalePropertiesForFile( repositoryFile, locale ); return null; } }, Messages.getInstance().getString( "ExceptionLoggingDecorator.deleteLocalePropertiesForFile", repositoryFile.getId() ) ); //$NON-NLS-1$ } @Override public RepositoryFile updateFolder( final RepositoryFile folder, final String versionMessage ) { return callLogThrow( new Callable<RepositoryFile>() { public RepositoryFile call() throws Exception { return delegatee.updateFolder( folder, versionMessage ); } }, Messages.getInstance() .getString( "ExceptionLoggingDecorator.updateFile", folder != null ? folder.getId() : null ) ); //$NON-NLS-1$ } }