package ring.deployer;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.io.Reader;
import java.io.Writer;
import ring.util.UserUtilities;
/**
* Deploys anything that's not xml.
* @author projectmoon
*
*/
public class RegularDeployer {
private File documentFile;
private DeployableFileEntry entry;
//Only need to know if one file is changed.
private static boolean codeUpdates = false;
public RegularDeployer(File documentFile, DeployableFileEntry entry) {
this.documentFile = documentFile;
this.entry = entry;
}
public boolean codeUpdates() {
return codeUpdates;
}
public void deploy() {
//We have now determined that this document needs to be deployed, or overwritten.
if (checkCodeUpdates()) {
if (!documentFile.exists()) {
System.out.println("Deploying new file: " + entry.getEntryName());
}
else {
System.out.println("Updating file: " + entry.getEntryName());
}
//directoryToCreate = IMPORTROOT + entry.getEntryName()
//if directoryToCreate.exists() == false:
// directoryToCreate.mkdirs()
if (!documentFile.getParentFile().exists()) {
documentFile.getParentFile().mkdirs();
}
writeDocumentFile();
}
//Copy file over via BufferedInputStream.
//Overwrites any existing file.
}
private boolean checkCodeUpdates() {
//Determine if a code update happened: new files and updated files means code update.
//if (!codeUpdates):
// if document does not exist:
// codeUpdates = true.
// else:
// if shaHash(currDocument) != shaHash(incomingDocument):
// codeUpdates = true
// else:
// return. this document does not need to be updated.
if (!codeUpdates) {
if (!documentFile.exists()) {
codeUpdates = true;
return true;
}
else {
String fileContent = getContent(documentFile);
String entryContent = getContent(entry);
if (UserUtilities.sha1Hash(fileContent).equals(UserUtilities.sha1Hash(entryContent)) == false) {
codeUpdates = true;
return true;
}
else {
return false; //this file does not need to be updated.
}
}
}
else {
return true;
}
}
private void writeDocumentFile() {
PrintWriter writer = null;
try {
writer = new PrintWriter(documentFile);
String[] lines = getContent(entry).split("\n");
for (String line : lines) {
writer.println(line);
}
}
catch (IOException e) {
e.printStackTrace();
}
finally {
close(writer);
}
}
private String getContent(File file) {
BufferedReader reader = null;
try {
FileInputStream input = new FileInputStream(file);
reader = new BufferedReader(new InputStreamReader(input));
String content = "";
String line = "";
while ((line = reader.readLine()) != null) {
content += line + "\n"; //preserve newlines.
}
return content;
}
catch (IOException e) {
e.printStackTrace();
}
finally {
close(reader);
}
//Nothing to return
return null;
}
private String getContent(DeployableFileEntry entry) {
BufferedReader reader = null;
try {
InputStream input = entry.getInputStream();
reader = new BufferedReader(new InputStreamReader(input));
String content = "";
String line = "";
while ((line = reader.readLine()) != null) {
content += line + "\n"; //Preserve newlines
}
return content;
}
catch (IOException e) {
e.printStackTrace();
}
finally {
close(reader);
}
//Nothing to return
return null;
}
private void close(Reader reader) {
if (reader != null) {
try {
reader.close();
}
catch (IOException e) {
e.printStackTrace();
}
}
}
private void close(Writer writer) {
if (writer != null) {
try {
writer.close();
}
catch (IOException e) {
e.printStackTrace();
}
}
}
}