]> git.argeo.org Git - gpl/argeo-slc.git/blob - runtime/org.argeo.slc.server/src/main/java/org/argeo/slc/web/ajaxplorer/file/FileLsAction.java
94240f0f0cdeee3f782fb12fe9770bd098a2ad37
[gpl/argeo-slc.git] / runtime / org.argeo.slc.server / src / main / java / org / argeo / slc / web / ajaxplorer / file / FileLsAction.java
1 /*
2 * Copyright (C) 2007-2012 Mathieu Baudier
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16 package org.argeo.slc.web.ajaxplorer.file;
17
18 import java.io.File;
19 import java.io.FileFilter;
20 import java.io.OutputStreamWriter;
21 import java.util.List;
22 import java.util.Vector;
23
24 import javax.servlet.ServletOutputStream;
25 import javax.servlet.http.HttpServletRequest;
26 import javax.servlet.http.HttpServletResponse;
27
28 import org.apache.commons.io.IOUtils;
29 import org.argeo.slc.web.ajaxplorer.AjxpAnswer;
30 import org.argeo.slc.web.ajaxplorer.AjxpDriverException;
31
32 public class FileLsAction<T extends FileDriver, F extends AjxpFile> extends
33 FileAction {
34
35 public AjxpAnswer execute(FileDriver driver, HttpServletRequest request) {
36 String modeStr = request.getParameter("mode");
37 LsMode mode;
38 if (modeStr == null)
39 mode = LsMode.NULL;
40 else if (modeStr.equals("complete"))
41 mode = LsMode.COMPLETE;
42 else if (modeStr.equals("file_list"))
43 mode = LsMode.FILE_LIST;
44 else if (modeStr.equals("search"))
45 mode = LsMode.SEARCH;
46 else
47 throw new AjxpDriverException("Unkown mode " + modeStr);
48
49 String options = request.getParameter("options");
50 if (options != null) {
51 if ("al".equals(options))
52 mode = LsMode.FILE_LIST;
53 }
54
55 String path = request.getParameter("dir");
56 if (path == null) {
57 path = "/";
58 }
59
60 boolean dirOnly = false;
61 if (mode == LsMode.NULL || mode == LsMode.COMPLETE) {
62 dirOnly = true;
63 }
64
65 List<F> ajxpFiles = listFiles((T) driver, path, dirOnly);
66 /*
67 * File[] files = dir.listFiles(createFileFilter(request, dir));
68 * List<AjxpFile> ajxpFiles = new Vector<AjxpFile>(); for (File file :
69 * files) { if (file.isDirectory()) { ajxpFiles.add(new AjxpFile(file,
70 * path)); } else { if (!dirOnly) ajxpFiles.add(new AjxpFile(file,
71 * path)); } }
72 */
73 return new AxpLsAnswer(driver, ajxpFiles, mode);
74 }
75
76 protected List<F> listFiles(T driver, String path, boolean dirOnly) {
77 File dir = driver.getFile(path);
78
79 if (!dir.exists())
80 throw new AjxpDriverException("Dir " + dir + " does not exist.");
81
82 FileFilter filter = createFileFilter(dir);
83 File[] files = dir.listFiles(filter);
84 List<F> ajxpFiles = new Vector<F>();
85 for (File file : files) {
86 if (file.isDirectory()) {
87 ajxpFiles.add((F) new AjxpFile(file, path));
88 } else {
89 if (!dirOnly)
90 ajxpFiles.add((F) new AjxpFile(file, path));
91 }
92 }
93 return ajxpFiles;
94 }
95
96 /** To be overridden. Accept all by default. */
97 protected FileFilter createFileFilter(File dir) {
98 return new FileFilter() {
99 public boolean accept(File pathname) {
100 return true;
101 }
102
103 };
104 }
105
106 protected class AxpLsAnswer implements AjxpAnswer {
107 private final List<F> files;
108 private final LsMode mode;
109 private final FileDriver driver;
110
111 public AxpLsAnswer(FileDriver driver, List<F> files, LsMode mode) {
112 this.files = files;
113 this.mode = mode;
114 this.driver = driver;
115 }
116
117 public void updateResponse(HttpServletResponse response) {
118 final String encoding = driver.getEncoding();
119 response.setCharacterEncoding(encoding);
120 response.setContentType("text/xml");
121
122 ServletOutputStream out = null;
123 OutputStreamWriter writer = null;
124 try {
125 out = response.getOutputStream();
126 writer = new OutputStreamWriter(out, encoding);
127 writer.write("<?xml version=\"1.0\" encoding=\"" + encoding
128 + "\"?>");
129 // TODO add current path
130 writer.write("<tree>");
131 for (AjxpFile file : files) {
132 writer.write(file.toXml(mode, encoding));
133 }
134 writer.write("</tree>");
135 writer.flush();
136
137 } catch (Exception e) {
138 throw new AjxpDriverException("Could not write response.", e);
139 } finally {
140 IOUtils.closeQuietly(writer);
141 IOUtils.closeQuietly(out);
142 }
143 }
144
145 }
146 }