X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;f=source%2Fmircoders%2Fservlet%2FServletModuleFileEdit.java;h=101886812f2d6877648a8c53c4a123eb7f14f198;hb=4368e83f65cd067f2ac70668e35cd1ab4432c4d6;hp=2fef2b9b329ff2f785c7bce47c7cf54f24847272;hpb=a459f111d85598df56c6ab711cec11632676b39c;p=mir.git diff --git a/source/mircoders/servlet/ServletModuleFileEdit.java b/source/mircoders/servlet/ServletModuleFileEdit.java index 2fef2b9b..10188681 100755 --- a/source/mircoders/servlet/ServletModuleFileEdit.java +++ b/source/mircoders/servlet/ServletModuleFileEdit.java @@ -18,93 +18,110 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * In addition, as a special exception, The Mir-coders gives permission to link - * the code of this program with any library licensed under the Apache Software License, - * The Sun (tm) Java Advanced Imaging library (JAI), The Sun JIMI library - * (or with modified versions of the above that use the same license as the above), - * and distribute linked combinations including the two. You must obey the - * GNU General Public License in all respects for all of the code used other than - * the above mentioned libraries. If you modify this file, you may extend this - * exception to your version of the file, but you are not obligated to do so. + * the code of this program with any library licensed under the Apache Software License, + * The Sun (tm) Java Advanced Imaging library (JAI), The Sun JIMI library + * (or with modified versions of the above that use the same license as the above), + * and distribute linked combinations including the two. You must obey the + * GNU General Public License in all respects for all of the code used other than + * the above mentioned libraries. If you modify this file, you may extend this + * exception to your version of the file, but you are not obligated to do so. * If you do not wish to do so, delete this exception statement from your version. */ 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.Arrays; -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 mircoders.global.MirGlobal; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.util.*; /* * ServletModuleFileEdit - * Allows one to do a basic edit of a file in a directory specified * in the config file. * - * @author $Author: idfx $ - * @version $Revision: 1.10 $ $Date: 2003/04/21 12:42:51 $ + * @author $Author: zapata $ + * @version $Revision: 1.13.2.12 $ $Date: 2006/06/01 17:57:21 $ * */ -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 File rootDirectory; - private FilenameFilter filter; private FilenameFilter dirFilter; - private boolean recurse; - private ServletModuleFileEdit() { - super(); + public ServletModuleFileEdit() { + directories = new HashMap(); + directoryNames = new ArrayList(); + + 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.splitStringWithEscape(setting, ':', '\\'); + if (parts.size() != 4) { + getLogger().error("config error: " + settings[i] + ", 4 parts expected"); + } + else { + String name = (String) parts.get(0); + String directory = (String) parts.get(1); + String filter = (String) parts.get(2); + String recursive = (String) parts.get(3); + + directories.put(name, new FileEditDirectory(name, directory, filter, + "1".equals(recursive) || "y".equals(recursive.toLowerCase()))); + directoryNames.add(name); + } + } + } + } - logger = new LoggerWrapper("ServletModule.FileEdit"); + dirFilter = new FileRoutines.DirectoryFilter(); + } - rootDirectory = new File(configuration.getString("ServletModule.FileEdit.FileDirectory")); - recurse = configuration.getString("ServletModule.FileEdit.Recursive", "").equals("1"); + public List getEntries() { + return directoryNames; + } - filter = new FileFunctions.RegExpFileFilter(configuration.getString("ServletModule.FileEdit.ExtFilter")); - dirFilter = new FileFunctions.DirectoryFilter(); + public FileEditDirectory getDirectory(HttpServletRequest aRequest) throws ServletModuleExc { + FileEditDirectory result = (FileEditDirectory) directories.get(aRequest.getParameter("entry")); + if (result == null) + throw new ServletModuleExc("Unknown entry: " + aRequest.getParameter("entry")); - templateListString =configuration.getString("ServletModule.FileEdit.ListTemplate"); - templateObjektString =configuration.getString("ServletModule.FileEdit.ObjektTemplate"); - templateConfirmString =configuration.getString("ServletModule.FileEdit.ConfirmTemplate"); + return result; } public void list(HttpServletRequest aRequest, HttpServletResponse aResponse) throws ServletModuleExc { - listSubDirectory("/", aRequest, aResponse); + listSubDirectory(getDirectory(aRequest), "/", aRequest, aResponse); } public void edit(HttpServletRequest aRequest, HttpServletResponse aResponse) throws ServletModuleExc { try { HTTPRequestParser requestParser = new HTTPRequestParser(aRequest); + String filename = requestParser.getParameter("filename"); String subDirectory = requestParser.getParameterWithDefault("subdirectory", ""); if (filename == null) throw new ServletModuleExc("No filename specified"); - editFile(filename, subDirectory, aRequest, aResponse); + editFile(getDirectory(aRequest), filename, subDirectory, aRequest, aResponse); } catch (Throwable e) { throw new ServletModuleFailure(e); @@ -115,38 +132,52 @@ public class ServletModuleFileEdit extends ServletModule { try { HTTPRequestParser requestParser = new HTTPRequestParser(aRequest); + String directoryName = requestParser.getParameter("directory"); String subDirectoryName = requestParser.getParameter("subdirectory"); if (directoryName==null | subDirectoryName==null) throw new ServletModuleExc("No directory/subDirectory specified"); - listSubDirectory(subDirectoryName+File.separator+directoryName, aRequest, aResponse); + listSubDirectory(getDirectory(aRequest), subDirectoryName+File.separator+directoryName, aRequest, aResponse); } catch (Throwable e) { throw new ServletModuleFailure(e); } } + + /** + * Called when an edited file is saved by the user + */ public void update(HttpServletRequest aRequest, HttpServletResponse aResponse) throws ServletModuleExc { - String filename = aRequest.getParameter("filename"); - String subDirectory = aRequest.getParameter("subdirectory"); - String text = aRequest.getParameter("text"); + HTTPRequestParser requestParser = new HTTPRequestParser(aRequest); + String filename = requestParser.getParameter("filename"); + String subDirectory = requestParser.getParameter("subdirectory"); + String text = + StringRoutines.performRegularExpressionReplacement( + requestParser.getParameter("text"), + "\r\n", + System.getProperty("line.separator")); + FileEditDirectory directory = getDirectory(aRequest); try { - File f = new File(new File(rootDirectory, subDirectory), filename); + File f = new File(new File(directory.getRootDirectory(), subDirectory), filename); - if (validateDirectory(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()); - editFile(filename, subDirectory, aRequest, aResponse); + editFile(directory, filename, subDirectory, aRequest, aResponse); } } catch (Throwable e) { @@ -154,25 +185,25 @@ public class ServletModuleFileEdit extends ServletModule } } - public void listSubDirectory(String aSubDirectory, HttpServletRequest aRequest, HttpServletResponse aResponse) throws ServletModuleExc + public void listSubDirectory(FileEditDirectory aDirectory, String aSubDirectory, HttpServletRequest aRequest, HttpServletResponse aResponse) throws ServletModuleExc { try { - Map responseData = ServletHelper.makeGenerationData(new Locale[] { getLocale(aRequest), getFallbackLocale(aRequest)}); - File dir = new File(rootDirectory, aSubDirectory); + Map responseData = ServletHelper.makeGenerationData(aRequest, aResponse, new Locale[] { getLocale(aRequest), getFallbackLocale(aRequest)}); + File dir = new File(aDirectory.getRootDirectory(), aSubDirectory); - if (!validateDirectory(dir) || !dir.isDirectory()) { - dir = rootDirectory; + if (!isDirectoryValid(aDirectory, dir) || !dir.isDirectory()) { + dir = aDirectory.getRootDirectory(); aSubDirectory = ""; } - responseData.put("filelist", Arrays.asList(dir.list(filter))); + responseData.put("filelist", FileRoutines.getDirectoryContentsAsList(dir, aDirectory.getFilter())); - if (recurse) { - List dirs = new Vector(); - if (!dir.getCanonicalPath().equals(rootDirectory.getCanonicalPath())) + if (aDirectory.getRecursive()) { + List dirs = new ArrayList(); + if (!dir.getCanonicalPath().equals(aDirectory.getRootDirectory().getCanonicalPath())) responseData.put("updir", new File(aSubDirectory).getParent()); - dirs.addAll(Arrays.asList(dir.list(dirFilter))); + dirs.addAll(FileRoutines.getDirectoryContentsAsList(dir, dirFilter)); responseData.put("dirlist", dirs); } @@ -182,46 +213,52 @@ public class ServletModuleFileEdit extends ServletModule } 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(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(rootDirectory, aSubDirectory), aFileName); + File f = new File(new File(aDirectory.getRootDirectory(), aSubDirectory), aFileName); - if (!validateDirectory(f) || f.isDirectory() || !validateFile(f)) { - listSubDirectory("", aRequest, aResponse); + 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"); urlBuilder.setValue("do", "enter"); + urlBuilder.setValue("entry", aDirectory.getName()); 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("text", out.toString()); + responseData.put("entry", aDirectory.getName()); + 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) { @@ -229,21 +266,52 @@ public class ServletModuleFileEdit extends ServletModule } } - protected boolean validateDirectory(File aFile) { + private boolean isDirectoryValid(FileEditDirectory aDirectory, File aFile) { try { - return (aFile.getCanonicalPath().startsWith(rootDirectory.getCanonicalPath())); + return aFile.getCanonicalPath().startsWith(aDirectory.getRootDirectory().getCanonicalPath()); } catch (Throwable t) { return false; } } - protected boolean validateFile(File aFile) { + private boolean isFileValid(FileEditDirectory aDirectory, File aFile) { try { - return filter.accept(aFile.getParentFile(), aFile.getName()); + return aDirectory.getFilter().accept(aFile.getParentFile(), aFile.getName()); } catch (Throwable t) { 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; + } + } + }