/** * Copyright (c) 2000-present Liferay, Inc. All rights reserved. * * This library is free software; you can redistribute it and/or modify it under * the terms of the GNU Lesser General Public License as published by the Free * Software Foundation; either version 2.1 of the License, or (at your option) * any later version. * * This library 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 Lesser General Public License for more * details. */ package com.liferay.portal.store.ignore.duplicates.wrapper.internal; import com.liferay.document.library.kernel.exception.DuplicateFileException; import com.liferay.document.library.kernel.store.Store; import com.liferay.portal.kernel.exception.PortalException; import com.liferay.portal.kernel.log.Log; import com.liferay.portal.kernel.log.LogFactoryUtil; import java.io.File; import java.io.InputStream; /** * @author Adolfo PĂ©rez */ public class IgnoreDuplicatesStore implements Store { public IgnoreDuplicatesStore(Store store) { _store = store; } @Override public void addDirectory( long companyId, long repositoryId, String dirName) { _store.addDirectory(companyId, repositoryId, dirName); } @Override public void addFile( final long companyId, final long repositoryId, final String fileName, final byte[] bytes) throws PortalException { recoverAndRetryOnFailure( createDeleteFileStoreAction( companyId, repositoryId, fileName, Store.VERSION_DEFAULT), new StoreAction() { @Override public void execute() throws PortalException { _store.addFile(companyId, repositoryId, fileName, bytes); } }); } @Override public void addFile( final long companyId, final long repositoryId, final String fileName, final File file) throws PortalException { recoverAndRetryOnFailure( createDeleteFileStoreAction( companyId, repositoryId, fileName, Store.VERSION_DEFAULT), new StoreAction() { @Override public void execute() throws PortalException { _store.addFile(companyId, repositoryId, fileName, file); } }); } @Override public void addFile( final long companyId, final long repositoryId, final String fileName, final InputStream is) throws PortalException { recoverAndRetryOnFailure( createDeleteFileStoreAction( companyId, repositoryId, fileName, Store.VERSION_DEFAULT), new StoreAction() { @Override public void execute() throws PortalException { _store.addFile(companyId, repositoryId, fileName, is); } }); } @Override public void checkRoot(long companyId) { _store.checkRoot(companyId); } @Override public void copyFileVersion( final long companyId, final long repositoryId, final String fileName, final String fromVersionLabel, final String toVersionLabel) throws PortalException { if (fromVersionLabel.equals(toVersionLabel)) { return; } recoverAndRetryOnFailure( createDeleteFileStoreAction( companyId, repositoryId, fileName, toVersionLabel), new StoreAction() { @Override public void execute() throws PortalException { _store.copyFileVersion( companyId, repositoryId, fileName, fromVersionLabel, toVersionLabel); } }); } @Override public void deleteDirectory( long companyId, long repositoryId, String dirName) { _store.deleteDirectory(companyId, repositoryId, dirName); } @Override public void deleteFile(long companyId, long repositoryId, String fileName) { _store.deleteFile(companyId, repositoryId, fileName); } @Override public void deleteFile( long companyId, long repositoryId, String fileName, String versionLabel) { _store.deleteFile(companyId, repositoryId, fileName, versionLabel); } @Override public File getFile(long companyId, long repositoryId, String fileName) throws PortalException { return _store.getFile(companyId, repositoryId, fileName); } @Override public File getFile( long companyId, long repositoryId, String fileName, String versionLabel) throws PortalException { return _store.getFile(companyId, repositoryId, fileName, versionLabel); } @Override public byte[] getFileAsBytes( long companyId, long repositoryId, String fileName) throws PortalException { return _store.getFileAsBytes(companyId, repositoryId, fileName); } @Override public byte[] getFileAsBytes( long companyId, long repositoryId, String fileName, String versionLabel) throws PortalException { return _store.getFileAsBytes( companyId, repositoryId, fileName, versionLabel); } @Override public InputStream getFileAsStream( long companyId, long repositoryId, String fileName) throws PortalException { return _store.getFileAsStream(companyId, repositoryId, fileName); } @Override public InputStream getFileAsStream( long companyId, long repositoryId, String fileName, String versionLabel) throws PortalException { return _store.getFileAsStream( companyId, repositoryId, fileName, versionLabel); } @Override public String[] getFileNames(long companyId, long repositoryId) { return _store.getFileNames(companyId, repositoryId); } @Override public String[] getFileNames( long companyId, long repositoryId, String dirName) { return _store.getFileNames(companyId, repositoryId, dirName); } @Override public long getFileSize(long companyId, long repositoryId, String fileName) throws PortalException { return _store.getFileSize(companyId, repositoryId, fileName); } @Override public boolean hasDirectory( long companyId, long repositoryId, String dirName) { return _store.hasDirectory(companyId, repositoryId, dirName); } @Override public boolean hasFile(long companyId, long repositoryId, String fileName) { return _store.hasFile(companyId, repositoryId, fileName); } @Override public boolean hasFile( long companyId, long repositoryId, String fileName, String versionLabel) { return _store.hasFile(companyId, repositoryId, fileName, versionLabel); } @Override public void move(String srcDir, String destDir) { _store.move(srcDir, destDir); } @Override public void updateFile( final long companyId, final long repositoryId, final long newRepositoryId, final String fileName) throws PortalException { if (repositoryId == newRepositoryId) { return; } recoverAndRetryOnFailure( createDeleteFileStoreAction(companyId, newRepositoryId, fileName), new StoreAction() { @Override public void execute() throws PortalException { _store.updateFile( companyId, repositoryId, newRepositoryId, fileName); } }); } @Override public void updateFile( final long companyId, final long repositoryId, final String fileName, final String newFileName) throws PortalException { if (fileName.equals(newFileName)) { return; } recoverAndRetryOnFailure( createDeleteFileStoreAction(companyId, repositoryId, newFileName), new StoreAction() { @Override public void execute() throws PortalException { _store.updateFile( companyId, repositoryId, fileName, newFileName); } }); } @Override public void updateFile( final long companyId, final long repositoryId, final String fileName, final String versionLabel, final byte[] bytes) throws PortalException { recoverAndRetryOnFailure( createDeleteFileStoreAction( companyId, repositoryId, fileName, versionLabel), new StoreAction() { @Override public void execute() throws PortalException { _store.updateFile( companyId, repositoryId, fileName, versionLabel, bytes); } }); } @Override public void updateFile( final long companyId, final long repositoryId, final String fileName, final String versionLabel, final File file) throws PortalException { recoverAndRetryOnFailure( createDeleteFileStoreAction( companyId, repositoryId, fileName, versionLabel), new StoreAction() { @Override public void execute() throws PortalException { _store.updateFile( companyId, repositoryId, fileName, versionLabel, file); } }); } @Override public void updateFile( final long companyId, final long repositoryId, final String fileName, final String versionLabel, final InputStream is) throws PortalException { recoverAndRetryOnFailure( createDeleteFileStoreAction( companyId, repositoryId, fileName, versionLabel), new StoreAction() { @Override public void execute() throws PortalException { _store.updateFile( companyId, repositoryId, fileName, versionLabel, is); } }); } @Override public void updateFileVersion( final long companyId, final long repositoryId, final String fileName, final String fromVersionLabel, final String toVersionLabel) throws PortalException { recoverAndRetryOnFailure( createDeleteFileStoreAction( companyId, repositoryId, fileName, toVersionLabel), new StoreAction() { @Override public void execute() throws PortalException { _store.updateFileVersion( companyId, repositoryId, fileName, fromVersionLabel, toVersionLabel); } }); } protected StoreAction createDeleteFileStoreAction( final long companyId, final long repositoryId, final String fileName) { return new StoreAction() { @Override public void execute() throws PortalException { _store.deleteFile(companyId, repositoryId, fileName); } }; } protected StoreAction createDeleteFileStoreAction( final long companyId, final long repositoryId, final String fileName, final String versionLabel) { return new StoreAction() { @Override public void execute() throws PortalException { _store.deleteFile( companyId, repositoryId, fileName, versionLabel); } }; } protected void recoverAndRetryOnFailure( StoreAction recoverStoreAction, StoreAction storeAction) throws PortalException { try { storeAction.execute(); } catch (DuplicateFileException dfe) { // LPS-52675 if (_log.isDebugEnabled()) { _log.debug(dfe, dfe); } recoverStoreAction.execute(); storeAction.execute(); } } private static final Log _log = LogFactoryUtil.getLog( IgnoreDuplicatesStore.class); private final Store _store; private interface StoreAction { public void execute() throws PortalException; } }