/* * Copyright (C) 2007-2012 Mathieu Baudier * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.argeo.slc.web.ajaxplorer.file; import java.io.File; import java.io.FileFilter; import java.io.OutputStreamWriter; import java.util.List; import java.util.Vector; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.commons.io.IOUtils; import org.argeo.slc.web.ajaxplorer.AjxpAnswer; import org.argeo.slc.web.ajaxplorer.AjxpDriverException; public class FileLsAction extends FileAction { public AjxpAnswer execute(FileDriver driver, HttpServletRequest request) { String modeStr = request.getParameter("mode"); LsMode mode; if (modeStr == null) mode = LsMode.NULL; else if (modeStr.equals("complete")) mode = LsMode.COMPLETE; else if (modeStr.equals("file_list")) mode = LsMode.FILE_LIST; else if (modeStr.equals("search")) mode = LsMode.SEARCH; else throw new AjxpDriverException("Unkown mode " + modeStr); String options = request.getParameter("options"); if (options != null) { if ("al".equals(options)) mode = LsMode.FILE_LIST; } String path = request.getParameter("dir"); if (path == null) { path = "/"; } boolean dirOnly = false; if (mode == LsMode.NULL || mode == LsMode.COMPLETE) { dirOnly = true; } List ajxpFiles = listFiles((T) driver, path, dirOnly); /* * File[] files = dir.listFiles(createFileFilter(request, dir)); * List ajxpFiles = new Vector(); for (File file : * files) { if (file.isDirectory()) { ajxpFiles.add(new AjxpFile(file, * path)); } else { if (!dirOnly) ajxpFiles.add(new AjxpFile(file, * path)); } } */ return new AxpLsAnswer(driver, ajxpFiles, mode); } protected List listFiles(T driver, String path, boolean dirOnly) { File dir = driver.getFile(path); if (!dir.exists()) throw new AjxpDriverException("Dir " + dir + " does not exist."); FileFilter filter = createFileFilter(dir); File[] files = dir.listFiles(filter); List ajxpFiles = new Vector(); for (File file : files) { if (file.isDirectory()) { ajxpFiles.add((F) new AjxpFile(file, path)); } else { if (!dirOnly) ajxpFiles.add((F) new AjxpFile(file, path)); } } return ajxpFiles; } /** To be overridden. Accept all by default. */ protected FileFilter createFileFilter(File dir) { return new FileFilter() { public boolean accept(File pathname) { return true; } }; } protected class AxpLsAnswer implements AjxpAnswer { private final List files; private final LsMode mode; private final FileDriver driver; public AxpLsAnswer(FileDriver driver, List files, LsMode mode) { this.files = files; this.mode = mode; this.driver = driver; } public void updateResponse(HttpServletResponse response) { final String encoding = driver.getEncoding(); response.setCharacterEncoding(encoding); response.setContentType("text/xml"); ServletOutputStream out = null; OutputStreamWriter writer = null; try { out = response.getOutputStream(); writer = new OutputStreamWriter(out, encoding); writer.write(""); // TODO add current path writer.write(""); for (AjxpFile file : files) { writer.write(file.toXml(mode, encoding)); } writer.write(""); writer.flush(); } catch (Exception e) { throw new AjxpDriverException("Could not write response.", e); } finally { IOUtils.closeQuietly(writer); IOUtils.closeQuietly(out); } } } }