001: // Copyright (C) 2003,2004,2005 by Object Mentor, Inc. All rights reserved.
002: // Released under the terms of the GNU General Public License version 2 or later.
003: package fitnesse.responders.files;
004:
005: import java.io.BufferedInputStream;
006: import java.io.BufferedOutputStream;
007: import java.io.File;
008: import java.io.FileInputStream;
009: import java.io.FileOutputStream;
010: import java.io.InputStream;
011: import java.io.OutputStream;
012: import java.util.regex.Matcher;
013: import java.util.regex.Pattern;
014:
015: import fitnesse.FitNesseContext;
016: import fitnesse.authentication.AlwaysSecureOperation;
017: import fitnesse.authentication.SecureOperation;
018: import fitnesse.http.Request;
019: import fitnesse.http.Response;
020: import fitnesse.http.SimpleResponse;
021: import fitnesse.http.UploadedFile;
022: import fitnesse.responders.SecureResponder;
023: import fitnesse.util.FileUtil;
024:
025: public class UploadResponder implements SecureResponder {
026: private static final Pattern filenamePattern = Pattern
027: .compile("([^/\\\\]*[/\\\\])*([^/\\\\]*)");
028:
029: private String rootPath;
030:
031: public Response makeResponse(FitNesseContext context,
032: Request request) throws Exception {
033: rootPath = context.rootPagePath;
034: SimpleResponse response = new SimpleResponse();
035: String resource = request.getResource().replace("%20", " ");
036: UploadedFile uploadedFile = (UploadedFile) request
037: .getInput("file");
038: if (uploadedFile.isUsable()) {
039: File file = makeFileToCreate(uploadedFile, resource);
040: writeFile(file, uploadedFile);
041: }
042:
043: response.redirect("/" + resource.replace(" ", "%20"));
044: return response;
045: }
046:
047: public void writeFile(File file, UploadedFile uploadedFile)
048: throws Exception {
049: boolean renamed = uploadedFile.getFile().renameTo(file);
050: if (!renamed) {
051: InputStream input = new BufferedInputStream(
052: new FileInputStream(uploadedFile.getFile()));
053: OutputStream output = new BufferedOutputStream(
054: new FileOutputStream(file));
055: FileUtil.copyBytes(input, output);
056: input.close();
057: output.close();
058: uploadedFile.delete();
059: }
060: }
061:
062: private File makeFileToCreate(UploadedFile uploadedFile,
063: String resource) {
064: String relativeFilename = makeRelativeFilename(uploadedFile
065: .getName());
066: String filename = relativeFilename;
067: int prefix = 1;
068: File file = new File(makeFullFilename(resource, filename));
069: while (file.exists()) {
070: filename = makeNewFilename(relativeFilename, prefix++);
071: file = new File(makeFullFilename(resource, filename));
072: }
073: return file;
074: }
075:
076: private String makeFullFilename(String resource, String filename) {
077: return rootPath + "/" + resource + filename;
078: }
079:
080: public static String makeRelativeFilename(String name) {
081: Matcher match = filenamePattern.matcher(name);
082: if (match.find())
083: return match.group(2);
084: else
085: return name;
086: }
087:
088: public static String makeNewFilename(String filename, int copyId) {
089: String[] parts = filename.split("\\.");
090:
091: if (parts.length == 1)
092: return filename + "_copy" + copyId;
093: else {
094: String newName = "";
095: for (int i = 0; i < parts.length - 1; i++) {
096: if (i != 0)
097: newName += ".";
098: newName += parts[i];
099: }
100: newName += "_copy" + copyId + "." + parts[parts.length - 1];
101: return newName;
102: }
103: }
104:
105: public SecureOperation getSecureOperation() {
106: return new AlwaysSecureOperation();
107: }
108: }
|