/*
* Copyright (C) 2003-2010 eXo Platform SAS.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU Affero General Public License
* as published by the Free Software Foundation; either version 3
* of the License, or (at your option) any later version.
*
* 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.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, see<http://www.gnu.org/licenses/>.
*/
package org.exoplatform.services.jcr.impl.backup.rdbms;
import org.exoplatform.commons.utils.PrivilegedSystemHelper;
import org.exoplatform.commons.utils.SecurityHelper;
import org.exoplatform.services.jcr.impl.backup.BackupException;
import org.exoplatform.services.jcr.impl.backup.DataRestore;
import org.exoplatform.services.jcr.impl.util.io.DirectoryHelper;
import org.exoplatform.services.jcr.util.IdGenerator;
import org.exoplatform.services.log.ExoLogger;
import org.exoplatform.services.log.Log;
import java.io.File;
import java.io.IOException;
import java.security.PrivilegedExceptionAction;
import java.util.ArrayList;
import java.util.List;
/**
* @author <a href="mailto:anatoliy.bazko@gmail.com">Anatoliy Bazko</a>
* @version $Id: DirectoryRestorere.java 34360 2009-07-22 23:58:59Z tolusha $
*/
public class DirectoryRestore implements DataRestore
{
/**
* Logger.
*/
protected final static Log LOG = ExoLogger.getLogger("exo.jcr.component.core.DirectoryRestorer");
/**
* The list of directories with actual data.
*/
protected final List<File> dataDirs = new ArrayList<File>();
/**
* The list of compressed files.
*/
protected final List<File> zipFiles = new ArrayList<File>();
/**
* The list of temporary directories.
*/
private final List<File> tmpDirs = new ArrayList<File>();
/**
* Java temporary directory.
*/
protected final File tempDir = new File(PrivilegedSystemHelper.getProperty("java.io.tmpdir"));
/**
* The prefix for temporary directories.
*/
private static final String PREFIX = "dr";
/**
* Constructor DirectoryRestorer.
*
* @param dataDirs
* @param zipFiles
*/
public DirectoryRestore(List<File> dataDirs, List<File> zipFiles)
{
this.dataDirs.addAll(dataDirs);
this.zipFiles.addAll(zipFiles);
}
/**
* Constructor DirectoryRestorer.
*
* @param dataDir
* @param zipFile
*/
public DirectoryRestore(File dataDir, File zipFile)
{
this.dataDirs.add(dataDir);
this.zipFiles.add(zipFile);
}
/**
* {@inheritDoc}
*/
public void clean() throws BackupException
{
LOG.info("Start to clean old data from the storage");
try
{
SecurityHelper.doPrivilegedIOExceptionAction(new PrivilegedExceptionAction<Void>()
{
public Void run() throws IOException
{
for (int i = 0; i < dataDirs.size(); i++)
{
File dataDir = dataDirs.get(i);
File tmpDir = new File(tempDir, PREFIX + IdGenerator.generate());
tmpDir.mkdirs();
tmpDirs.add(tmpDir);
if (dataDir.exists())
{
DirectoryHelper.copyDirectory(dataDir, tmpDir);
DirectoryHelper.removeDirectory(dataDir);
}
}
return null;
}
});
}
catch (IOException e)
{
throw new BackupException(e);
}
}
/**
* {@inheritDoc}
*/
public void restore() throws BackupException
{
try
{
SecurityHelper.doPrivilegedIOExceptionAction(new PrivilegedExceptionAction<Void>()
{
public Void run() throws IOException
{
for (int i = 0; i < zipFiles.size(); i++)
{
File zipFile = zipFiles.get(i);
File dataDir = dataDirs.get(i);
if (zipFile.isDirectory())
{
DirectoryHelper.uncompressEveryFileFromDirectory(zipFile, dataDir);
}
else
{
DirectoryHelper.uncompressDirectory(zipFile, dataDir);
}
}
return null;
}
});
}
catch (IOException e)
{
throw new BackupException(e);
}
}
/**
* {@inheritDoc}
*/
public void commit() throws BackupException
{
}
/**
* {@inheritDoc}
*/
public void rollback() throws BackupException
{
try
{
SecurityHelper.doPrivilegedIOExceptionAction(new PrivilegedExceptionAction<Void>()
{
public Void run() throws IOException
{
for (int i = 0; i < tmpDirs.size(); i++)
{
File tmpDir = tmpDirs.get(i);
File dataDir = dataDirs.get(i);
if (dataDir.exists())
{
DirectoryHelper.removeDirectory(dataDir);
}
DirectoryHelper.copyDirectory(tmpDir, dataDir);
}
return null;
}
});
}
catch (IOException e)
{
throw new BackupException(e);
}
}
/**
* {@inheritDoc}
*/
public void close() throws BackupException
{
try
{
SecurityHelper.doPrivilegedIOExceptionAction(new PrivilegedExceptionAction<Void>()
{
public Void run() throws IOException
{
for (File tmpDir : tmpDirs)
{
DirectoryHelper.removeDirectory(tmpDir);
}
return null;
}
});
}
catch (IOException e)
{
throw new BackupException(e);
}
dataDirs.clear();
zipFiles.clear();
tmpDirs.clear();
}
}