X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;f=source%2Fmircoders%2Fservlet%2FServletModuleFileEdit.java;h=6543c11ce2ea2e9e1900ab618a5531a4aaf55a47;hb=42680c1f9fe3250bcbd0f9ed5d9dee6188333b15;hp=63218edcdeaf1e7bfae66ec510cfb26ded1d5b4d;hpb=da98183e311156246d826104eb4af70ec24c6273;p=mir.git diff --git a/source/mircoders/servlet/ServletModuleFileEdit.java b/source/mircoders/servlet/ServletModuleFileEdit.java index 63218edc..6543c11c 100755 --- a/source/mircoders/servlet/ServletModuleFileEdit.java +++ b/source/mircoders/servlet/ServletModuleFileEdit.java @@ -30,28 +30,20 @@ package mircoders.servlet; -import java.io.File; -import java.io.FileReader; -import java.io.FileWriter; -import java.io.FilenameFilter; -import java.io.StringReader; -import java.io.StringWriter; -import java.util.HashMap; -import java.util.List; -import java.util.Locale; -import java.util.Map; -import java.util.Vector; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - -import mir.log.LoggerWrapper; -import mir.servlet.ServletModule; +import mir.servlet.AdminServletModule; import mir.servlet.ServletModuleExc; import mir.servlet.ServletModuleFailure; -import mir.util.FileFunctions; +import mir.util.FileRoutines; import mir.util.HTTPRequestParser; import mir.util.StringRoutines; import mir.util.URLBuilder; +import mir.changetracker.ChangeType; +import mircoders.global.MirGlobal; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.util.*; /* * ServletModuleFileEdit - @@ -59,73 +51,31 @@ import mir.util.URLBuilder; * in the config file. * * @author $Author: zapata $ - * @version $Revision: 1.11 $ $Date: 2003/04/28 00:44:06 $ + * @version $Revision: 1.13.2.14 $ $Date: 2006/12/25 20:10:23 $ * */ -public class ServletModuleFileEdit extends ServletModule -{ - private static ServletModuleFileEdit instance = new ServletModuleFileEdit(); - public static ServletModule getInstance() { return instance; } - +public class ServletModuleFileEdit extends AdminServletModule { private Map directories; private List directoryNames; private FilenameFilter dirFilter; - private class FileEditDirectory { - private String name; - private FileFunctions.RegExpFileFilter filter; - private File rootDirectory; - private boolean recursive; - - public FileEditDirectory(String aName, String aRootDirectory, String aFilter, boolean aRecursive) { - name = aName; - rootDirectory = new File(aRootDirectory); - filter = new FileFunctions.RegExpFileFilter(aFilter); - recursive = aRecursive; - } - - public String getName() { - return name; - } - - public FileFunctions.RegExpFileFilter getFilter() { - return filter; - } - - public File getRootDirectory() { - return rootDirectory; - } - - public boolean getRecursive() { - return recursive; - } - } - - private ServletModuleFileEdit() { - super(); - - logger = new LoggerWrapper("ServletModule.FileEdit"); - + public ServletModuleFileEdit() { directories = new HashMap(); - directoryNames = new Vector(); + directoryNames = new ArrayList(); - String settings[] = configuration.getStringArray("ServletModule.FileEdit.Configuration"); -/* -ServletModule.FileEdit.FileDirectory=/pub/Dokumente/Indymedia/de-tech/Mir/produced -ServletModule.FileEdit.ExtFilter=.*\.inc$ -ServletModule.FileEdit.Recursive=0 -*/ + String settings[] = + getConfiguration().getStringArray("ServletModule.FileEdit.Configuration"); if (settings!=null) { for (int i = 0; i < settings.length; i++) { String setting = settings[i].trim(); if (setting.length() > 0) { - List parts = StringRoutines.splitString(setting, ":"); + List parts = StringRoutines.splitStringWithEscape(setting, ':', '\\'); if (parts.size() != 4) { - logger.error("config error: " + settings[i] + ", 4 parts expected"); + getLogger().error("config error: " + settings[i] + ", 4 parts expected"); } else { String name = (String) parts.get(0); @@ -134,18 +84,14 @@ ServletModule.FileEdit.Recursive=0 String recursive = (String) parts.get(3); directories.put(name, new FileEditDirectory(name, directory, filter, - recursive.equals("1") || recursive.toLowerCase().equals("y"))); + "1".equals(recursive) || "y".equals(recursive.toLowerCase()))); directoryNames.add(name); } } } } - dirFilter = new FileFunctions.DirectoryFilter(); - - templateListString =configuration.getString("ServletModule.FileEdit.ListTemplate"); - templateObjektString =configuration.getString("ServletModule.FileEdit.ObjektTemplate"); - templateConfirmString =configuration.getString("ServletModule.FileEdit.ConfirmTemplate"); + dirFilter = new FileRoutines.DirectoryFilter(); } public List getEntries() { @@ -160,13 +106,11 @@ ServletModule.FileEdit.Recursive=0 return result; } - public void list(HttpServletRequest aRequest, HttpServletResponse aResponse) throws ServletModuleExc - { + public void list(HttpServletRequest aRequest, HttpServletResponse aResponse) throws ServletModuleExc { listSubDirectory(getDirectory(aRequest), "/", aRequest, aResponse); } - public void edit(HttpServletRequest aRequest, HttpServletResponse aResponse) throws ServletModuleExc - { + public void edit(HttpServletRequest aRequest, HttpServletResponse aResponse) throws ServletModuleExc { try { HTTPRequestParser requestParser = new HTTPRequestParser(aRequest); @@ -201,26 +145,35 @@ ServletModule.FileEdit.Recursive=0 } } - public void update(HttpServletRequest aRequest, HttpServletResponse aResponse) throws ServletModuleExc - { + /** + * Called when an edited file is saved by the user + */ + public void update(HttpServletRequest aRequest, HttpServletResponse aResponse) throws ServletModuleExc { HTTPRequestParser requestParser = new HTTPRequestParser(aRequest); String filename = requestParser.getParameter("filename"); String subDirectory = requestParser.getParameter("subdirectory"); - String text = requestParser.getParameter("text"); + String text = + StringRoutines.performRegularExpressionReplacement( + requestParser.getParameter("text"), + "\r\n", + System.getProperty("line.separator")); FileEditDirectory directory = getDirectory(aRequest); try { File f = new File(new File(directory.getRootDirectory(), subDirectory), filename); - if (validateDirectory(directory, f)) { - StringReader in = new StringReader(text); + if (isDirectoryValid(directory, f)) { FileWriter out = new FileWriter(f); + try { + out.write(text.toCharArray()); + } + finally { + out.close(); + } - int c; - while ( (c = in.read()) != -1) - out.write(c); - in.close(); - out.close(); + logAdminUsage(aRequest, f.getAbsolutePath(), "object modified"); + + MirGlobal.getChangeEngine().getTracker().addChange(f.getCanonicalPath(), ChangeType.MODIFICATION); editFile(directory, filename, subDirectory, aRequest, aResponse); } @@ -233,22 +186,22 @@ ServletModule.FileEdit.Recursive=0 public void listSubDirectory(FileEditDirectory aDirectory, String aSubDirectory, HttpServletRequest aRequest, HttpServletResponse aResponse) throws ServletModuleExc { try { - Map responseData = ServletHelper.makeGenerationData(new Locale[] { getLocale(aRequest), getFallbackLocale(aRequest)}); + Map responseData = ServletHelper.makeGenerationData(aRequest, aResponse, new Locale[] { getLocale(aRequest), getFallbackLocale(aRequest)}); File dir = new File(aDirectory.getRootDirectory(), aSubDirectory); - if (!validateDirectory(aDirectory, dir) || !dir.isDirectory()) { + if (!isDirectoryValid(aDirectory, dir) || !dir.isDirectory()) { dir = aDirectory.getRootDirectory(); aSubDirectory = ""; } - responseData.put("filelist", FileFunctions.getDirectoryContentsAsList(dir, aDirectory.getFilter())); + responseData.put("filelist", FileRoutines.getDirectoryContentsAsList(dir, aDirectory.getFilter())); if (aDirectory.getRecursive()) { - List dirs = new Vector(); + List dirs = new ArrayList(); if (!dir.getCanonicalPath().equals(aDirectory.getRootDirectory().getCanonicalPath())) responseData.put("updir", new File(aSubDirectory).getParent()); - dirs.addAll(FileFunctions.getDirectoryContentsAsList(dir, dirFilter)); + dirs.addAll(FileRoutines.getDirectoryContentsAsList(dir, dirFilter)); responseData.put("dirlist", dirs); } @@ -260,23 +213,22 @@ ServletModule.FileEdit.Recursive=0 responseData.put("subdirectory", aSubDirectory); responseData.put("entry", aDirectory.getName()); - ServletHelper.generateResponse(aResponse.getWriter(), responseData, templateListString); + ServletHelper.generateResponse(aResponse.getWriter(), responseData, listGenerator); } catch (Throwable e) { throw new ServletModuleFailure(e); } } - public void editFile(FileEditDirectory aDirectory, String aFileName, String aSubDirectory, HttpServletRequest aRequest, HttpServletResponse aResponse) throws ServletModuleExc - { + public void editFile(FileEditDirectory aDirectory, String aFileName, String aSubDirectory, HttpServletRequest aRequest, HttpServletResponse aResponse) throws ServletModuleExc { try { File f = new File(new File(aDirectory.getRootDirectory(), aSubDirectory), aFileName); - if (!validateDirectory(aDirectory, f) || f.isDirectory() || !validateFile(aDirectory, f)) { + if (!isDirectoryValid(aDirectory, f) || f.isDirectory() || !isFileValid(aDirectory, f)) { listSubDirectory(aDirectory, "", aRequest, aResponse); } else { - Map responseData = ServletHelper.makeGenerationData(new Locale[] { getLocale(aRequest), getFallbackLocale(aRequest)}); + Map responseData = ServletHelper.makeGenerationData(aRequest, aResponse, new Locale[] { getLocale(aRequest), getFallbackLocale(aRequest)}); URLBuilder urlBuilder = new URLBuilder(); urlBuilder.setValue("module", "FileEdit"); @@ -285,22 +237,26 @@ ServletModule.FileEdit.Recursive=0 urlBuilder.setValue("directory", ""); urlBuilder.setValue("subdirectory", aSubDirectory); - FileReader in = new FileReader(f); - StringWriter out = new StringWriter(); + BufferedReader in = new BufferedReader(new FileReader(f)); + StringWriter textout = new StringWriter(); + BufferedWriter out = new BufferedWriter(textout); - int c; - while ( (c = in.read()) != -1) - out.write(c); + // TODO read array + char[] c = new char[4096]; + int read; + while ((read=in.read(c)) != -1) { + out.write(c, 0, read); + } in.close(); out.close(); responseData.put("entry", aDirectory.getName()); - responseData.put("text", out.toString()); + responseData.put("text", textout.toString()); responseData.put("filename", aFileName); responseData.put("subdirectory", aSubDirectory); responseData.put("returnurl", urlBuilder.getQuery()); - ServletHelper.generateResponse(aResponse.getWriter(), responseData, templateObjektString); + ServletHelper.generateResponse(aResponse.getWriter(), responseData, editGenerator); } } catch (Throwable e) { @@ -308,16 +264,16 @@ ServletModule.FileEdit.Recursive=0 } } - protected boolean validateDirectory(FileEditDirectory aDirectory, File aFile) { + private boolean isDirectoryValid(FileEditDirectory aDirectory, File aFile) { try { - return (aFile.getCanonicalPath().startsWith(aDirectory.getRootDirectory().getCanonicalPath())); + return aFile.getCanonicalPath().startsWith(aDirectory.getRootDirectory().getCanonicalPath()); } catch (Throwable t) { return false; } } - protected boolean validateFile(FileEditDirectory aDirectory, File aFile) { + private boolean isFileValid(FileEditDirectory aDirectory, File aFile) { try { return aDirectory.getFilter().accept(aFile.getParentFile(), aFile.getName()); } @@ -325,4 +281,35 @@ ServletModule.FileEdit.Recursive=0 return false; } } + + private class FileEditDirectory { + private String name; + private FileRoutines.RegExpFileFilter filter; + private File rootDirectory; + private boolean recursive; + + public FileEditDirectory(String aName, String aRootDirectory, String aFilter, boolean aRecursive) { + name = aName; + rootDirectory = new File(aRootDirectory); + filter = new FileRoutines.RegExpFileFilter(aFilter); + recursive = aRecursive; + } + + public String getName() { + return name; + } + + public FileRoutines.RegExpFileFilter getFilter() { + return filter; + } + + public File getRootDirectory() { + return rootDirectory; + } + + public boolean getRecursive() { + return recursive; + } + } + }