View Javadoc

1   /*
2    * FCKeditor - The text editor for Internet - http://www.fckeditor.net
3    * Copyright (C) 2003-2008 Frederico Caldeira Knabben
4    * 
5    * == BEGIN LICENSE ==
6    * 
7    * Licensed under the terms of any of the following licenses at your
8    * choice:
9    * 
10   *  - GNU General Public License Version 2 or later (the "GPL")
11   *    http://www.gnu.org/licenses/gpl.html
12   * 
13   *  - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
14   *    http://www.gnu.org/licenses/lgpl.html
15   * 
16   *  - Mozilla Public License Version 1.1 or later (the "MPL")
17   *    http://www.mozilla.org/MPL/MPL-1.1.html
18   * 
19   * == END LICENSE ==
20   */
21  package net.fckeditor.response;
22  
23  import java.io.File;
24  import java.io.FileFilter;
25  import java.io.StringWriter;
26  
27  import javax.xml.parsers.DocumentBuilder;
28  import javax.xml.parsers.DocumentBuilderFactory;
29  import javax.xml.parsers.ParserConfigurationException;
30  import javax.xml.transform.Transformer;
31  import javax.xml.transform.TransformerException;
32  import javax.xml.transform.TransformerFactory;
33  import javax.xml.transform.dom.DOMSource;
34  import javax.xml.transform.stream.StreamResult;
35  
36  import net.fckeditor.handlers.CommandHandler;
37  import net.fckeditor.handlers.ResourceTypeHandler;
38  import net.fckeditor.tool.Utils;
39  
40  import org.apache.commons.io.filefilter.DirectoryFileFilter;
41  import org.apache.commons.io.filefilter.FileFileFilter;
42  import org.w3c.dom.Document;
43  import org.w3c.dom.Element;
44  
45  /**
46   * static error objects won't probably provided due to performance reasons of 
47   * Document instance creation
48   * 
49   * TODO document me!
50   * @author mosipov
51   *
52   */
53  public class XmlResponse {
54  
55  	private Document document;
56  	private Element errorElement;
57  	private Element foldersElement;
58  	private Element filesElement;
59  	
60  	/** Error number OK */
61  	public static final int EN_OK = 0;
62  	
63  	/** Error number ERROR */
64  	public static final int EN_ERROR = 1;
65  
66  	/** Error number ALREADY EXISTS */
67  	public static final int EN_ALREADY_EXISTS = 101;
68  
69  	/** Error number INVALID FOLDER NAME */
70  	public static final int EN_INVALID_FOLDER_NAME = 102;
71  
72  	/** Error number SECURITY ERROR */
73  	public static final int EN_SECURITY_ERROR = 103;
74  
75  	/** Error number UNKNOWN ERROR */
76  	public static final int EN_UKNOWN = 110;
77  
78  	/**
79  	 * 
80  	 * @param command
81  	 * @param resourceType
82  	 * @param currentFolder
83  	 * @param constructedUrl
84  	 */
85  	public XmlResponse(CommandHandler command, ResourceTypeHandler resourceType, 
86  			String currentFolder, String constructedUrl) {
87  
88  		try {
89  			DocumentBuilderFactory factory = DocumentBuilderFactory
90  					.newInstance();
91  			DocumentBuilder builder = factory.newDocumentBuilder();
92  			document = builder.newDocument();
93  		} catch (ParserConfigurationException e) {
94  			throw new RuntimeException(e);
95  		}
96  
97  		Element root = document.createElement("Connector");
98  		document.appendChild(root);
99  		root.setAttribute("command", command.toString());
100 		root.setAttribute("resourceType", resourceType.toString());
101 
102 		Element currentFolderElement = document.createElement("CurrentFolder");
103 		currentFolderElement.setAttribute("path", currentFolder);
104 
105 		currentFolderElement.setAttribute("url", constructedUrl);
106 		root.appendChild(currentFolderElement);
107 
108 	}
109 	
110 	/**
111 	 * TODO document me!
112 	 * @param number
113 	 * @param text
114 	 */
115 	public XmlResponse(int number, String text) {
116 		try {
117 			DocumentBuilderFactory factory = DocumentBuilderFactory
118 					.newInstance();
119 			DocumentBuilder builder = factory.newDocumentBuilder();
120 			document = builder.newDocument();
121 		} catch (ParserConfigurationException e) {
122 			throw new RuntimeException(e);
123 		}
124 
125 		Element root = document.createElement("Connector");
126 		document.appendChild(root);
127 		setError(number, text);
128 	}
129 	
130 	/***
131 	 * TODO document me!
132 	 * @param number
133 	 */
134 	public XmlResponse(int number) {
135 		this(number, null);
136 	}
137 
138 	public void setError(int number, String text) {
139 
140 		if (errorElement == null) {
141 			errorElement = document.createElement("Error");
142 			document.getDocumentElement().appendChild(errorElement);
143 		}
144 
145 		errorElement.setAttribute("number", String.valueOf(number));
146 		if (Utils.isNotEmpty(text))
147 			errorElement.setAttribute("text", text);
148 
149 	}
150 
151 	public void setError(int number) {
152 		setError(number, null);
153 	}
154 
155 	public void setFolders(File dir) {
156 
157 		if (foldersElement != null) {
158 			Element parent = (Element) foldersElement.getParentNode();
159 			parent.removeChild(foldersElement);
160 		}
161 
162 		foldersElement = document.createElement("Folders");
163 		document.getDocumentElement().appendChild(foldersElement);
164 
165 		String[] fileList = dir.list(DirectoryFileFilter.DIRECTORY);
166 		for (String file : fileList) {
167 			Element folderElement = document.createElement("Folder");
168 			folderElement.setAttribute("name", file);
169 			foldersElement.appendChild(folderElement);
170 		}
171 	}
172 	
173 	public void setFiles(File dir) {
174 		
175 		if (filesElement != null) {
176 			Element parent = (Element) filesElement.getParentNode();
177 			parent.removeChild(filesElement);
178 		}
179 
180 		filesElement = document.createElement("Files");
181 		document.getDocumentElement().appendChild(filesElement);
182 		
183 		File[] fileList = dir.listFiles((FileFilter) FileFileFilter.FILE);
184 		long length;
185 		for (File file : fileList) {
186 			Element fileElement = document.createElement("File");
187 			fileElement.setAttribute("name", file.getName());
188 			if (file.length() < 1024)
189 				length = 1L;
190 			else 
191 				length = file.length()/1024;
192 			fileElement.setAttribute("size", String.valueOf(length));
193 			filesElement.appendChild(fileElement);
194 		}
195 	}
196 	
197 	public void setFoldersAndFiles(File dir) {
198 		setFolders(dir);
199 		setFiles(dir);
200 	}
201 	
202 	@Override
203 	public String toString() {
204 		document.getDocumentElement().normalize();
205 		TransformerFactory factory = TransformerFactory.newInstance();
206 
207 		StringWriter sw = new StringWriter();
208 
209 		try {
210 			Transformer transformer = factory.newTransformer();
211 
212 			DOMSource source = new DOMSource(document);
213 			StreamResult result = new StreamResult(sw);
214 
215 			transformer.transform(source, result);
216 		} catch (TransformerException e) {
217 			throw new RuntimeException(e);
218 		}
219 
220 		return sw.toString();
221 	}
222 
223 }