/*
* This software is distributed under the terms of the FSF
* Gnu Lesser General Public License (see lgpl.txt).
*
* This program is distributed WITHOUT ANY WARRANTY. See the
* GNU General Public License for more details.
*/
package com.scooterframework.builtin;
import static com.scooterframework.web.controller.ActionControl.*;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import com.scooterframework.admin.ApplicationConfig;
import com.scooterframework.admin.EnvConfig;
import com.scooterframework.common.logging.LogUtil;
import com.scooterframework.common.util.FileUtil;
import com.scooterframework.web.controller.UploadFile;
/**
* FilesController class manages files and folders on the server.
*
* @author (Fei) John Chen
*/
public class FilesController {
private LogUtil log = LogUtil.getLogger(getClass().getName());
private static String appPath = ApplicationConfig.getInstance().getApplicationPath();
static {
filterManagerFor(FilesController.class).declareBeforeFilter(
AdminSignonController.class, "loginRequired");
filterManagerFor(FilesController.class).declareBeforeFilter(
"validatePath", "except", "create, update, doCopy, doUpload, doReplace");
}
public String validatePath() {
String path = p("f");
if (path == null) {
path = "/";
setViewData("f", path);
}
File file = getFile(path);
if (!file.exists()) {
flash("error", "There is no file related to '" + path + "'.");
return forwardTo(EnvConfig.getInstance().getErrorPageURI());
}
return null;
}
private File getFile(String path) {
String fullPath = appPath + File.separatorChar + path;
return new File(fullPath);
}
/**
* Returns a list of files or folders.
*/
public String list() {
String path = p("f");
File requestFile = getFile(path);
setViewData("requestFile", requestFile);
List<FileInfo> files = new ArrayList<FileInfo>();
if (requestFile != null) {
if (requestFile.isDirectory()) {
File[] children = requestFile.listFiles();
if (children != null) {
for (File f : children) {
if (f.isDirectory())
files.add(new FileInfo(f));
}
for (File f : children) {
if (!f.isDirectory())
files.add(new FileInfo(f));
}
}
} else if (requestFile.isFile()) {
files.add(new FileInfo(requestFile));
}
}
setViewData("files", files);
return null;
}
/**
* Returns a file.
*/
public String show() {
String path = p("f");
File requestFile = getFile(path);
setViewData("requestFile", requestFile);
if (isTextFile(requestFile)) {
StringBuilder sb = new StringBuilder();
String lineBreak = System.getProperty("line.separator");
try {
List<String> contentLines = FileUtil.readContent(requestFile);
for (String line : contentLines) {
sb.append(line).append(lineBreak);
}
} catch (Exception ex) {
log.error("Failed to read file " + path);
flash("error", "Failed to read file " + path);
}
String classCode = getFileExtension(requestFile);
if (EnvConfig.getInstance().isHighlightable(classCode)) {
classCode = classCode + "_code";
} else {
classCode = "code";
}
setViewData("classCode", classCode);
setViewData("fileContent", sb.toString());
} else {
publishFile(requestFile);
}
return null;
}
public String add() {
String path = p("f");
File requestFile = getFile(path);
setViewData("requestFile", requestFile);
return null;
}
public String create() {
String path = p("f");
File requestFile = getFile(path);
setViewData("requestFile", requestFile);
String name = p("name");
String newPath = path + "/" + name;
File newFile = getFile(newPath);
String content = p("fileContent");
try {
FileUtil.updateFile(newFile, content);
flash("notice", "File was successfully created.");
return redirectTo(BuiltinHelper.FILE_BROWSER_LINK_PREFIX_FILE + newPath);
} catch (Exception ex) {
log.error("Error in create() caused by " + ex.getMessage());
flash("error", "There was a problem creating the file.");
}
return renderView("add");
}
public String edit() {
String path = p("f");
File requestFile = getFile(path);
setViewData("requestFile", requestFile);
if (isTextFile(requestFile)) {
StringBuilder sb = new StringBuilder();
String lineBreak = System.getProperty("line.separator");
try {
List<String> contentLines = FileUtil.readContent(requestFile);
int i = 0;
for (; i < contentLines.size() - 1; i++) {
String line = contentLines.get(i);
sb.append(line).append(lineBreak);
}
sb.append(contentLines.get(i));
} catch (Exception ex) {
log.error("Failed to read file " + path);
flash("error", "Failed to read file " + path);
}
setViewData("fileContent", sb.toString());
} else {
flash("error", "You can not edit a non-text file.");
}
return null;
}
public String update() {
String path = p("f");
File requestFile = getFile(path);
String content = p("fileContent");
try {
FileUtil.updateFile(requestFile, content);
flash("notice", "File was successfully updated.");
return redirectTo(BuiltinHelper.FILE_BROWSER_LINK_PREFIX_FILE + path);
} catch (Exception ex) {
log.error("Error in update() caused by " + ex.getMessage());
flash("error", "There was a problem updating the file.");
}
return renderView("edit");
}
public String delete() {
String path = p("f");
File requestFile = getFile(path);
String parentPath = "/";
if (requestFile != null) {
parentPath = (new FileInfo(requestFile.getParentFile())).getRelativePath();
boolean deleted = requestFile.delete();
if (deleted) {
flash("notice", "The file was successfully deleted.");
} else {
flash("error", "The file was not deleted.");
}
}
return redirectTo(BuiltinHelper.FILE_BROWSER_LINK_PREFIX_DIR + parentPath);
}
public String copy() {
String path = p("f");
File requestFile = getFile(path);
setViewData("requestFile", requestFile);
return null;
}
public String doCopy() {
String path = p("f");
File requestFile = getFile(path);
setViewData("requestFile", requestFile);
String target = p("target");
File targetFile = getFile(target);
try {
FileUtil.copy(requestFile, targetFile);
flash("notice", "Copy was successful.");
return (targetFile.isDirectory()) ?
redirectTo(BuiltinHelper.FILE_BROWSER_LINK_PREFIX_DIR + target) :
redirectTo(BuiltinHelper.FILE_BROWSER_LINK_PREFIX_FILE + target);
} catch (Exception ex) {
log.error("Error in doCopy() caused by " + ex.getMessage());
flash("error", "There was a problem in copying.");
}
return renderView("copy");
}
public String rename() {
String path = p("f");
File requestFile = getFile(path);
setViewData("requestFile", requestFile);
return null;
}
public String doRename() {
String path = p("f");
File requestFile = getFile(path);
setViewData("requestFile", requestFile);
String target = p("target");
File targetFile = getFile(target);
try {
boolean renamed = FileUtil.rename(requestFile, targetFile);
if (renamed) {
flash("notice", "Rename was successful.");
return (targetFile.isDirectory()) ?
redirectTo(BuiltinHelper.FILE_BROWSER_LINK_PREFIX_DIR + target) :
redirectTo(BuiltinHelper.FILE_BROWSER_LINK_PREFIX_FILE + target);
} else {
flash("error", "Rename was not successful.");
}
} catch (Exception ex) {
log.error("Error in doRename() caused by " + ex.getMessage());
flash("error", "There was a problem in renaming.");
}
return renderView("rename");
}
public String upload() {
String path = p("f");
File requestFile = getFile(path);
setViewData("requestFile", requestFile);
return null;
}
public String doUpload() {
String path = p("f");
File requestFile = getFile(path);
setViewData("requestFile", requestFile);
try {
UploadFile uf = pFile("theFile");
uf.writeTo(appPath + "/" + path);
flash("notice", "File was successfully uploaded.");
return redirectTo(BuiltinHelper.FILE_BROWSER_LINK_PREFIX_DIR + path);
} catch (Exception ex) {
log.error("Error in doUpload() caused by " + ex.getMessage());
flash("error", "There is a problem with upload.");
}
return renderView("upload");
}
public String replace() {
String path = p("f");
File requestFile = getFile(path);
setViewData("requestFile", requestFile);
return null;
}
public String doReplace() {
String path = p("f");
File requestFile = getFile(path);
setViewData("requestFile", requestFile);
try {
String parentPath = (new FileInfo(requestFile.getParentFile())).getRelativePath();
UploadFile uf = pFile("theFile");
uf.writeTo(requestFile);
flash("notice", "File was successfully replaced.");
return redirectTo(BuiltinHelper.FILE_BROWSER_LINK_PREFIX_DIR + parentPath);
} catch (Exception ex) {
log.error("Error in doReplace() caused by " + ex.getMessage());
}
flash("error", "There is a problem with replace.");
return renderView("replace");
}
}