/*
* Copyright (C) 2009 eXo Platform SAS.
*
* This 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 software 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.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.exoplatform.services.jcr.ext.backup.impl;
import org.exoplatform.commons.utils.PrivilegedFileHelper;
import org.exoplatform.services.log.ExoLogger;
import org.exoplatform.services.log.Log;
import java.io.File;
import java.io.FilenameFilter;
import java.io.IOException;
import java.util.Calendar;
/**
* Created by The eXo Platform SARL Author : Alex Reshetnyak alex.reshetnyak@exoplatform.com.ua Nov
* 20, 2007
*/
public class FileNameProducer
{
/**
* Logger.
*/
private static final Log LOG = ExoLogger.getLogger("exo.jcr.component.ext.FileNameProducer");
class SkipBackupLogFilter
implements FilenameFilter
{
public boolean accept(File dir, String name)
{
return !name.endsWith(".xml");
}
}
/**
* Backup set name.
*/
private String backupSetName;
/**
* Backup set directory.
*/
private File backupSetDir;
/**
* Indicates is full backup or not.
*/
private boolean isFullBackup;
/**
* Indicates that need to create a directory for full backup otherwise is will be the single file.
*/
private boolean isDirectoryForFullBackup;
/**
* Constructor FileNameProducer.
*
* @param backupSetName
* backup set name
* @param backupDir
* backup directory
* @param timeStamp
* time stamp for creation unique backup set directory
* @param isFullBackup
* indicates is full backup or not
* @param isDirectory
* indicates that need to create a directory for full backup otherwise is will be the single file
*/
public FileNameProducer(String backupSetName, String backupDir, Calendar timeStamp, boolean isFullBackup,
boolean isDirectory)
{
this.backupSetName = backupSetName;
this.isFullBackup = isFullBackup;
this.isDirectoryForFullBackup = isDirectory;
this.backupSetDir = new File(backupDir);
if (!PrivilegedFileHelper.exists(backupSetDir))
{
PrivilegedFileHelper.mkdirs(backupSetDir);
}
}
public static File generateBackupSetDir(String repositoryName, String workspaceName, String backupDir,
Calendar timeStamp)
{
FileNameProducer fileNameProducer = new FileNameProducer();
String sTime = "-" + fileNameProducer.getStrDate(timeStamp) + "_" + fileNameProducer.getStrTime(timeStamp);
File fBackupSetDir = new File(backupDir + File.separator + repositoryName + "_" + workspaceName + sTime);
if (!PrivilegedFileHelper.exists(fBackupSetDir))
{
PrivilegedFileHelper.mkdirs(fBackupSetDir);
}
else
{
int i = 2;
do
{
fBackupSetDir =
new File(backupDir + File.separator + repositoryName + "_" + workspaceName + sTime + "_" + i++);
}
while (PrivilegedFileHelper.exists(fBackupSetDir));
}
return fBackupSetDir;
}
/**
* Constructor FileNameProducer.
*
* @param repositoryName
* repository name for creation backup set name
* @param workspaceName
* workspace name for creation backup set name
* @param backupDir
* backup directory
* @param timeStamp
* time stamp for creation unique backup set directory
* @param isFullBackup
* indicates is full backup or not
* @param isDirectory
* indicates that need to create a directory for full backup otherwise is will be the single file
*/
public FileNameProducer(String repositoryName, String workspaceName, String backupDir, Calendar timeStamp,
boolean isFullBackup, boolean isDirectory)
{
this(repositoryName + "_" + workspaceName, backupDir, timeStamp, isFullBackup, isDirectory);
}
/**
* Constructor FileNameProducer.
*
* @param repositoryName
* repository name for creation backup set name
* @param workspaceName
* workspace name for creation backup set name
* @param backupDir
* backup directory
* @param timeStamp
* time stamp for creation unique backup set directory
* @param isFullBackup
* indicates is full backup or not
*/
public FileNameProducer(String repositoryName, String workspaceName, String backupDir, Calendar timeStamp,
boolean isFullBackup)
{
this(repositoryName + "_" + workspaceName, backupDir, timeStamp, isFullBackup, false);
}
/**
* Empty constructor.
*/
public FileNameProducer()
{
}
/**
* Get next file in backup set.
*
* @return
* file
*/
public File getNextFile()
{
File nextFile = null;
try
{
String sNextName = generateName();
nextFile = new File(backupSetDir.getAbsoluteFile() + File.separator + sNextName);
if (isFullBackup && isDirectoryForFullBackup)
{
if (!PrivilegedFileHelper.exists(nextFile))
{
PrivilegedFileHelper.mkdirs(nextFile);
}
}
else
{
PrivilegedFileHelper.createNewFile(nextFile);
}
}
catch (IOException e)
{
LOG.error("Can nit get next file : " + e.getLocalizedMessage(), e);
}
return nextFile;
}
/**
* Generate name for backup file (directory) based on backup set name and current time.
*/
private String generateName()
{
Calendar date = Calendar.getInstance();
String sDate = getStrDate(date);
String sTime = getStrTime(date);
StringBuilder fileName = new StringBuilder(backupSetName).append("-").append(sDate).append("_").append(sTime).append(".");
if (isFullBackup)
{
fileName.append("0");
}
else
{
fileName.append(getNextSufix());
}
return fileName.toString();
}
private String getNextSufix()
{
String[] fileList = PrivilegedFileHelper.list(backupSetDir, new SkipBackupLogFilter());
int sufix = 0;
for (int i = 0; i < fileList.length; i++)
{
String[] stringArray = fileList[i].split("[.]");
int currentSufix = Integer.valueOf(stringArray[stringArray.length - 1]).intValue();
if (currentSufix > sufix)
{
sufix = currentSufix;
}
}
return String.valueOf(++sufix);
}
/**
* Returns date as String in format YYYYMMDD.
*/
private String getStrDate(Calendar c)
{
int m = c.get(Calendar.MONTH) + 1;
int d = c.get(Calendar.DATE);
return "" + c.get(Calendar.YEAR) + (m < 10 ? "0" + m : m) + (d < 10 ? "0" + d : d);
}
/**
* Returns time as String in format HHMMSS.
*/
private String getStrTime(Calendar c)
{
int h = c.get(Calendar.HOUR);
int m = c.get(Calendar.MINUTE);
int s = c.get(Calendar.SECOND);
return "" + (h < 10 ? "0" + h : h) + (m < 10 ? "0" + m : m) + (s < 10 ? "0" + s : s);
}
/**
* Get Backup set directory.
*
* @return File
* The backup set directory
*/
public File getBackupSetDir()
{
return backupSetDir;
}
}