KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > com > fredck > FCKeditor > connector > ConnectorServlet


1 /*
2  * FCKeditor - The text editor for internet
3  * Copyright (C) 2003-2005 Frederico Caldeira Knabben
4  *
5  * Licensed under the terms of the GNU Lesser General Public License:
6  * http://www.opensource.org/licenses/lgpl-license.php
7  *
8  * For further information visit:
9  * http://www.fckeditor.net/
10  *
11  * File Name: ConnectorServlet.java
12  * Java Connector for Resource Manager class.
13  *
14  * Version: 2.3
15  * Modified: 2005-08-11 16:29:00
16  *
17  * File Authors:
18  * Simone Chiaretta (simo@users.sourceforge.net)
19  */

20  
21 package com.fredck.FCKeditor.connector;
22
23 import java.io.*;
24 import javax.servlet.*;
25 import javax.servlet.http.*;
26 import java.util.*;
27
28
29 import org.apache.commons.fileupload.*;
30
31
32 import javax.xml.parsers.*;
33 import org.w3c.dom.*;
34 import javax.xml.transform.*;
35 import javax.xml.transform.dom.DOMSource JavaDoc;
36 import javax.xml.transform.stream.StreamResult JavaDoc;
37
38 import com.Yasna.forum.Authorization;
39 import com.Yasna.forum.util.SkinUtils;
40
41
42 /**
43  * Servlet to upload and browse files.<br>
44  *
45  * This servlet accepts 4 commands used to retrieve and create files and folders from a server directory.
46  * The allowed commands are:
47  * <ul>
48  * <li>GetFolders: Retrive the list of directory under the current folder
49  * <li>GetFoldersAndFiles: Retrive the list of files and directory under the current folder
50  * <li>CreateFolder: Create a new directory under the current folder
51  * <li>FileUpload: Send a new file to the server (must be sent with a POST)
52  * </ul>
53  *
54  * @author Simone Chiaretta (simo@users.sourceforge.net)
55  */

56
57 public class ConnectorServlet extends HttpServlet {
58
59     private static String JavaDoc baseDir;
60     private static boolean debug=false;
61
62     /**
63      * Initialize the servlet.<br>
64      * Retrieve from the servlet configuration the "baseDir" which is the root of the file repository:<br>
65      * If not specified the value of "/UserFiles/" will be used.
66      *
67      */

68      public void init() throws ServletException {
69         baseDir=getInitParameter("baseDir");
70         debug=(new Boolean JavaDoc(getInitParameter("debug"))).booleanValue();
71         if(baseDir==null)
72             baseDir="/UserFiles/";
73         String JavaDoc realBaseDir=getServletContext().getRealPath(baseDir);
74         File baseFile=new File(realBaseDir);
75         if(!baseFile.exists()){
76             baseFile.mkdir();
77         }
78     }
79
80     /**
81      * Manage the Get requests (GetFolders, GetFoldersAndFiles, CreateFolder).<br>
82      *
83      * The servlet accepts commands sent in the following format:<br>
84      * connector?Command=CommandName&Type=ResourceType&CurrentFolder=FolderPath<br><br>
85      * It execute the command and then return the results to the client in XML format.
86      *
87      */

88     public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
89
90         if (debug) System.out.println("--- BEGIN DOGET ---");
91
92         response.setContentType("text/xml; charset=UTF-8");
93         response.setHeader("Cache-Control","no-cache");
94         PrintWriter out = response.getWriter();
95
96         Authorization authToken = SkinUtils.getUserAuthorization(request,response);
97         String JavaDoc userdir=request.getRemoteAddr();
98         if( authToken != null ) {
99             userdir = Integer.toString(authToken.getUserID());
100         }
101         String JavaDoc realBaseDir=getServletContext().getRealPath(baseDir+userdir);
102         File baseFile=new File(realBaseDir);
103         if(!baseFile.exists()){
104             baseFile.mkdir();
105         }
106
107
108         String JavaDoc commandStr=request.getParameter("Command");
109         String JavaDoc typeStr=request.getParameter("Type");
110         String JavaDoc currentFolderStr=request.getParameter("CurrentFolder");
111
112         String JavaDoc currentPath=baseDir+userdir+"/"+typeStr+currentFolderStr;
113         String JavaDoc currentDirPath=getServletContext().getRealPath(currentPath);
114
115         File currentDir=new File(currentDirPath);
116         if(!currentDir.exists()){
117             currentDir.mkdir();
118         }
119
120         Document document=null;
121         try {
122             DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
123             DocumentBuilder builder = factory.newDocumentBuilder();
124             document=builder.newDocument();
125         } catch (ParserConfigurationException pce) {
126             pce.printStackTrace();
127         }
128
129         Node root=CreateCommonXml(document,commandStr,typeStr,currentFolderStr,request.getContextPath()+currentPath);
130
131         if (debug) System.out.println("Command = " + commandStr);
132
133         if(commandStr.equals("GetFolders")) {
134             getFolders(currentDir,root,document);
135         }
136         else if (commandStr.equals("GetFoldersAndFiles")) {
137             getFolders(currentDir,root,document);
138             getFiles(currentDir,root,document);
139         }
140         else if (commandStr.equals("CreateFolder")) {
141             String JavaDoc newFolderStr=request.getParameter("NewFolderName");
142             File newFolder=new File(currentDir,newFolderStr);
143             String JavaDoc retValue="110";
144
145             if(newFolder.exists()){
146                 retValue="101";
147             }
148             else {
149                 try {
150                     boolean dirCreated = newFolder.mkdir();
151                     if(dirCreated)
152                         retValue="0";
153                     else
154                         retValue="102";
155                 }catch(SecurityException JavaDoc sex) {
156                     retValue="103";
157                 }
158
159             }
160             setCreateFolderResponse(retValue,root,document);
161         }
162
163         document.getDocumentElement().normalize();
164         try {
165         TransformerFactory tFactory = TransformerFactory.newInstance();
166         Transformer transformer = tFactory.newTransformer();
167
168         DOMSource JavaDoc source = new DOMSource JavaDoc(document);
169
170         StreamResult JavaDoc result = new StreamResult JavaDoc(out);
171         transformer.transform(source, result);
172
173         if (debug) {
174             StreamResult JavaDoc dbgResult = new StreamResult JavaDoc(System.out);
175             transformer.transform(source, dbgResult);
176             System.out.println("");
177             System.out.println("--- END DOGET ---");
178         }
179
180
181         } catch (Exception JavaDoc ex) {
182             ex.printStackTrace();
183         }
184
185
186         out.flush();
187         out.close();
188     }
189
190
191     /**
192      * Manage the Post requests (FileUpload).<br>
193      *
194      * The servlet accepts commands sent in the following format:<br>
195      * connector?Command=FileUpload&Type=ResourceType&CurrentFolder=FolderPath<br><br>
196      * It store the file (renaming it in case a file with the same name exists) and then return an HTML file
197      * with a javascript command in it.
198      *
199      */

200     public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
201
202         if (debug) System.out.println("--- BEGIN DOPOST ---");
203         Authorization authToken = SkinUtils.getUserAuthorization(request,response);
204         String JavaDoc userdir=request.getRemoteAddr();
205         if( authToken != null ) {
206             userdir = Integer.toString(authToken.getUserID());
207         }
208         String JavaDoc realBaseDir=getServletContext().getRealPath(baseDir+userdir);
209         File baseFile=new File(realBaseDir);
210         if(!baseFile.exists()){
211             baseFile.mkdir();
212         }
213
214         response.setContentType("text/html; charset=UTF-8");
215         response.setHeader("Cache-Control","no-cache");
216         PrintWriter out = response.getWriter();
217
218         String JavaDoc commandStr=request.getParameter("Command");
219         String JavaDoc typeStr=request.getParameter("Type");
220         String JavaDoc currentFolderStr=request.getParameter("CurrentFolder");
221
222         String JavaDoc currentPath=baseDir+userdir+"/"+typeStr+currentFolderStr;
223         String JavaDoc currentDirPath=getServletContext().getRealPath(currentPath);
224
225         if (debug) System.out.println(currentDirPath);
226
227         String JavaDoc retVal="0";
228         String JavaDoc newName="";
229
230         if(!commandStr.equals("FileUpload"))
231             retVal="203";
232         else {
233             DiskFileUpload upload = new DiskFileUpload();
234             try {
235                 List items = upload.parseRequest(request);
236
237                 Map fields=new HashMap();
238
239                 Iterator iter = items.iterator();
240                 while (iter.hasNext()) {
241                     FileItem item = (FileItem) iter.next();
242                     if (item.isFormField())
243                         fields.put(item.getFieldName(),item.getString());
244                     else
245                         fields.put(item.getFieldName(),item);
246                 }
247                 FileItem uplFile=(FileItem)fields.get("NewFile");
248                 String JavaDoc fileNameLong=uplFile.getName();
249                 fileNameLong=fileNameLong.replace('\\','/');
250                 String JavaDoc[] pathParts=fileNameLong.split("/");
251                 String JavaDoc fileName=pathParts[pathParts.length-1];
252
253                 String JavaDoc nameWithoutExt=getNameWithoutExtension(fileName);
254                 String JavaDoc ext=getExtension(fileName);
255                 File pathToSave=new File(currentDirPath,fileName);
256                 int counter=1;
257                 while(pathToSave.exists()){
258                     newName=nameWithoutExt+"("+counter+")"+"."+ext;
259                     retVal="201";
260                     pathToSave=new File(currentDirPath,newName);
261                     counter++;
262                     }
263                 uplFile.write(pathToSave);
264             }catch (Exception JavaDoc ex) {
265                 retVal="203";
266             }
267
268         }
269
270         out.println("<script type=\"text/javascript\">");
271         out.println("window.parent.frames['frmUpload'].OnUploadCompleted("+retVal+",'"+newName+"');");
272         out.println("</script>");
273         out.flush();
274         out.close();
275
276         if (debug) System.out.println("--- END DOPOST ---");
277
278     }
279
280     private void setCreateFolderResponse(String JavaDoc retValue,Node root,Document doc) {
281         Element myEl=doc.createElement("Error");
282         myEl.setAttribute("number",retValue);
283         root.appendChild(myEl);
284     }
285
286
287     private void getFolders(File dir,Node root,Document doc) {
288         Element folders=doc.createElement("Folders");
289         root.appendChild(folders);
290         File[] fileList=dir.listFiles();
291         for(int i=0;i<fileList.length;++i) {
292             if(fileList[i].isDirectory()){
293                 Element myEl=doc.createElement("Folder");
294                 myEl.setAttribute("name",fileList[i].getName());
295                 folders.appendChild(myEl);
296                 }
297             }
298     }
299
300     private void getFiles(File dir,Node root,Document doc) {
301         Element files=doc.createElement("Files");
302         root.appendChild(files);
303         File[] fileList=dir.listFiles();
304         for(int i=0;i<fileList.length;++i) {
305             if(fileList[i].isFile()){
306                 Element myEl=doc.createElement("File");
307                 myEl.setAttribute("name",fileList[i].getName());
308                 myEl.setAttribute("size",""+fileList[i].length()/1024);
309                 files.appendChild(myEl);
310                 }
311             }
312     }
313
314     private Node CreateCommonXml(Document doc,String JavaDoc commandStr, String JavaDoc typeStr, String JavaDoc currentPath, String JavaDoc currentUrl ) {
315
316         Element root=doc.createElement("Connector");
317         doc.appendChild(root);
318         root.setAttribute("command",commandStr);
319         root.setAttribute("resourceType",typeStr);
320
321         Element myEl=doc.createElement("CurrentFolder");
322         myEl.setAttribute("path",currentPath);
323         myEl.setAttribute("url",currentUrl);
324         root.appendChild(myEl);
325
326         return root;
327
328     }
329
330     /*
331       * This method was fixed after Kris Barnhoorn (kurioskronic) submitted SF bug #991489
332       */

333       private static String JavaDoc getNameWithoutExtension(String JavaDoc fileName) {
334             return fileName.substring(0, fileName.lastIndexOf("."));
335         }
336
337     /*
338       * This method was fixed after Kris Barnhoorn (kurioskronic) submitted SF bug #991489
339       */

340     private String JavaDoc getExtension(String JavaDoc fileName) {
341         return fileName.substring(fileName.lastIndexOf(".")+1);
342     }
343
344
345 }
346
347
Popular Tags