/**
* $RCSfile: ,v $
* $Revision: $
* $Date: $
*
* Copyright (C) 2004-2011 Jive Software. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jivesoftware;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Collection;
import java.util.HashSet;
public class SparkCompatibility {
/**
* Old Spark settings directory
*/
private final String OLD_USER_SPARK_HOME = System.getProperties().getProperty("user.home") + "/" + getUserConf();
private final String OLD_USER_SPARK_HOME_MAC = System.getProperties().getProperty("user.home") + "/Spark";
public SparkCompatibility() {
}
/**
* Copies the old USER_SPARK_HOME to the new directory if it does not exist
* @param userSparkHome
* The previous directory to copy from
* @param skipFiles
* The files to skip
* @throws IOException
*/
public void transferConfig(String userSparkHome, Collection<String> skipFiles)
throws IOException {
File newSparkHomeDir = new File(userSparkHome);
File oldSparkHomeDir;
if (System.getProperty("os.name").toLowerCase().contains("mac")) {
oldSparkHomeDir = new File(OLD_USER_SPARK_HOME_MAC);
} else {
oldSparkHomeDir = new File(OLD_USER_SPARK_HOME);
}
if (!newSparkHomeDir.exists() && oldSparkHomeDir.exists()) {
copyDirectory(oldSparkHomeDir, newSparkHomeDir, skipFiles);
}
}
/**
* Copies the directories / files recursively
* @param src
* The source dir/file to copy
* @param dest
* The destination dir/file to copy
* @param skipFiles
* A colleciton of files to skip
* @throws IOException
*/
private void copyDirectory(File src , File dest, Collection<String> skipFiles) throws IOException {
if (src.isDirectory()) {
if (!dest.exists()) {
dest.mkdir();
}
String[] children = src.list();
for (int i=0; i<children.length; i++) {
// Skip any directories / files which may need to be skipped.
if (!skipFiles.contains((new File(dest, children[i]).getAbsolutePath()))) {
copyDirectory(new File(src, children[i]),
new File(dest, children[i]), new HashSet<String>());
}
}
} else {
InputStream in = null;
OutputStream out = null;
try {
in = new FileInputStream(src);
out = new FileOutputStream(dest);
} catch (FileNotFoundException e) {
IOException wrapper = new IOException("copyDirectory: Unable to open handle on file: "
+ src.getAbsolutePath() + "and" + dest.getAbsolutePath() + ".");
wrapper.initCause(e);
wrapper.setStackTrace(e.getStackTrace());
throw wrapper;
} catch (SecurityException e) {
IOException wrapper = new IOException("copyDirectory: access denied to copy file: "
+ src.getAbsolutePath() + "and" + dest.getAbsolutePath() + ".");
wrapper.initCause(e);
wrapper.setStackTrace(e.getStackTrace());
throw wrapper;
}
try {
// Copy the bits from instream to outstream
byte[] buf = new byte[1024];
int len;
while ((len = in.read(buf)) > 0) {
out.write(buf, 0, len);
}
} catch (IOException e) {
IOException wrapper = new IOException("copyDirectory: Unable to copy file: "
+ src.getAbsolutePath() + "to" + dest.getAbsolutePath() + ".");
wrapper.initCause(e);
wrapper.setStackTrace(e.getStackTrace());
throw wrapper;
} finally {
in.close();
out.close();
}
}
}
/**
* Keep track of the users configuration directory.
*
* @return Directory name depending on Operating System.
*/
private static String getUserConf() {
return Spark.getUserConf();
}
}