public DataRestore getDataRestorer(DataRestoreContext context) throws BackupException
{
List<DataRestore> restorers = new ArrayList<DataRestore>();
ObjectReader backupInfo = null;
try
{
File storageDir = (File) context.getObject(DataRestoreContext.STORAGE_DIR);
Connection jdbcConn = null;
if (context.getObject(DataRestoreContext.DB_CONNECTION) == null)
{
try
{
jdbcConn = connFactory.getJdbcConnection();
jdbcConn.setAutoCommit(false);
}
catch (SQLException e)
{
throw new BackupException(e);
}
catch (RepositoryException e)
{
throw new BackupException(e);
}
}
else
{
jdbcConn = (Connection) context.getObject(DataRestoreContext.DB_CONNECTION);
}
backupInfo =
new ObjectReaderImpl(PrivilegedFileHelper.fileInputStream(new File(storageDir,
"JDBCWorkspaceDataContainer.info")));
String srcContainerName = backupInfo.readString();
boolean srcMultiDb = backupInfo.readBoolean();
Map<String, RestoreTableRule> tables = new LinkedHashMap<String, RestoreTableRule>();
// ITEM table
String dstTableName = "JCR_" + (multiDb ? "M" : "S") + "ITEM";
String srcTableName = "JCR_" + (srcMultiDb ? "M" : "S") + "ITEM";
RestoreTableRule restoreTableRule = new RestoreTableRule();
restoreTableRule.setSrcContainerName(srcContainerName);
restoreTableRule.setSrcMultiDb(srcMultiDb);
restoreTableRule.setDstContainerName(containerName);
restoreTableRule.setDstMultiDb(multiDb);
restoreTableRule.setContentFile(new File(storageDir, srcTableName + DBBackup.CONTENT_FILE_SUFFIX));
restoreTableRule.setContentLenFile(new File(storageDir, srcTableName + DBBackup.CONTENT_LEN_FILE_SUFFIX));
if (multiDb)
{
if (!srcMultiDb)
{
// CONTAINER_NAME column index
restoreTableRule.setDeleteColumnIndex(4);
// ID and PARENT_ID column indexes
Set<Integer> convertColumnIndex = new HashSet<Integer>();
convertColumnIndex.add(0);
convertColumnIndex.add(1);
restoreTableRule.setConvertColumnIndex(convertColumnIndex);
}
}
else
{
if (srcMultiDb)
{
// CONTAINER_NAME column index
restoreTableRule.setNewColumnIndex(4);
restoreTableRule.setNewColumnName("CONTAINER_NAME");
restoreTableRule.setNewColumnType(Types.VARCHAR);
// ID and PARENT_ID column indexes
Set<Integer> convertColumnIndex = new HashSet<Integer>();
convertColumnIndex.add(0);
convertColumnIndex.add(1);
restoreTableRule.setConvertColumnIndex(convertColumnIndex);
}
else
{
// ID and PARENT_ID and CONTAINER_NAME column indexes
Set<Integer> convertColumnIndex = new HashSet<Integer>();
convertColumnIndex.add(0);
convertColumnIndex.add(1);
convertColumnIndex.add(4);
restoreTableRule.setConvertColumnIndex(convertColumnIndex);
}
}
tables.put(dstTableName, restoreTableRule);
// VALUE table
dstTableName = "JCR_" + (multiDb ? "M" : "S") + "VALUE";
srcTableName = "JCR_" + (srcMultiDb ? "M" : "S") + "VALUE";
restoreTableRule = new RestoreTableRule();
restoreTableRule.setSrcContainerName(srcContainerName);
restoreTableRule.setSrcMultiDb(srcMultiDb);
restoreTableRule.setDstContainerName(containerName);
restoreTableRule.setDstMultiDb(multiDb);
restoreTableRule.setContentFile(new File(storageDir, srcTableName + DBBackup.CONTENT_FILE_SUFFIX));
restoreTableRule.setContentLenFile(new File(storageDir, srcTableName + DBBackup.CONTENT_LEN_FILE_SUFFIX));
// auto increment ID column
restoreTableRule.setSkipColumnIndex(0);
if (!multiDb || !srcMultiDb)
{
// PROPERTY_ID column index
Set<Integer> convertColumnIndex = new HashSet<Integer>();
convertColumnIndex.add(3);
restoreTableRule.setConvertColumnIndex(convertColumnIndex);
}
tables.put(dstTableName, restoreTableRule);
// REF tables
dstTableName = "JCR_" + (multiDb ? "M" : "S") + "REF";
srcTableName = "JCR_" + (srcMultiDb ? "M" : "S") + "REF";
restoreTableRule = new RestoreTableRule();
restoreTableRule.setSrcContainerName(srcContainerName);
restoreTableRule.setSrcMultiDb(srcMultiDb);
restoreTableRule.setDstContainerName(containerName);
restoreTableRule.setDstMultiDb(multiDb);
restoreTableRule.setContentFile(new File(storageDir, srcTableName + DBBackup.CONTENT_FILE_SUFFIX));
restoreTableRule.setContentLenFile(new File(storageDir, srcTableName + DBBackup.CONTENT_LEN_FILE_SUFFIX));
if (!multiDb || !srcMultiDb)
{
// NODE_ID and PROPERTY_ID column indexes
Set<Integer> convertColumnIndex = new HashSet<Integer>();
convertColumnIndex.add(0);
convertColumnIndex.add(1);
restoreTableRule.setConvertColumnIndex(convertColumnIndex);
}
tables.put(dstTableName, restoreTableRule);
if (dbDialect == DBConstants.DB_DIALECT_SYBASE)
{
restorers.add(new SybaseDBRestore(storageDir, jdbcConn, tables, wsConfig, swapCleaner));
}
else
{
restorers.add(new DBRestore(storageDir, jdbcConn, tables, wsConfig, swapCleaner));
}
// prepare value storage restorer
File backupValueStorageDir = new File(storageDir, "values");
if (wsConfig.getContainer().getValueStorages() != null)
{
List<File> dataDirs = new ArrayList<File>();
List<File> backupDirs = new ArrayList<File>();
List<ValueStorageEntry> valueStorages = wsConfig.getContainer().getValueStorages();
String[] valueStoragesFiles = PrivilegedFileHelper.list(backupValueStorageDir);
if ((valueStoragesFiles == null && valueStorages.size() != 0)
|| (valueStoragesFiles != null && valueStoragesFiles.length != valueStorages.size()))
{
throw new RepositoryConfigurationException("Workspace configuration [" + wsConfig.getName()
+ "] has a different amount of value storages than exist in backup");
}
for (ValueStorageEntry valueStorage : valueStorages)
{
File backupDir = new File(backupValueStorageDir, valueStorage.getId());
if (!PrivilegedFileHelper.exists(backupDir))
{
throw new RepositoryConfigurationException("Can't restore value storage. Directory "
+ backupDir.getName() + " doesn't exists");
}
else
{
File dataDir = new File(valueStorage.getParameterValue(FileValueStorage.PATH));
dataDirs.add(dataDir);
backupDirs.add(backupDir);
}
}
restorers.add(new DirectoryRestore(dataDirs, backupDirs));
}
else
{
if (PrivilegedFileHelper.exists(backupValueStorageDir))
{
throw new RepositoryConfigurationException("Value storage didn't configure in workspace ["
+ wsConfig.getName() + "] configuration but value storage backup files exist");
}
}
return new ComplexDataRestore(restorers);
}
catch (FileNotFoundException e)
{
throw new BackupException(e);
}
catch (IOException e)
{
throw new BackupException(e);
}
catch (NamingException e)
{
throw new BackupException(e);
}
catch (SQLException e)
{
throw new BackupException(e);
}
catch (RepositoryConfigurationException e)
{
throw new BackupException(e);
}
finally
{
if (backupInfo != null)
{
try
{
backupInfo.close();
}
catch (IOException e)
{
LOG.error("Can't close object reader", e);
}