com.meikai.common.web.servlet.FCKeditorConnectorServlet.java Source code

Java tutorial

Introduction

Here is the source code for com.meikai.common.web.servlet.FCKeditorConnectorServlet.java

Source

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

package com.meikai.common.web.servlet;

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

import java.text.SimpleDateFormat;
import java.util.*;

import org.apache.commons.fileupload.*;
import org.apache.log4j.Logger;

import javax.xml.parsers.*;
import org.w3c.dom.*;

import javax.xml.transform.*;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

/**
 * Servlet to upload and browse files.<br>
 * 
 * This servlet accepts 4 commands used to retrieve and create files and folders
 * from a server directory. The allowed commands are:
 * <ul>
 * <li>GetFolders: Retrive the list of directory under the current folder
 * <li>GetFoldersAndFiles: Retrive the list of files and directory under the
 * current folder
 * <li>CreateFolder: Create a new directory under the current folder
 * <li>FileUpload: Send a new file to the server (must be sent with a POST)
 * </ul>
 * 
 * @author ntyookien
 */

public class FCKeditorConnectorServlet extends HttpServlet {

    private final static Logger logger = Logger.getLogger(FCKeditorConnectorServlet.class);

    private static String baseDir;

    private static Hashtable allowedExtensions;

    private static Hashtable deniedExtensions;

    private static boolean debug = false;

    private String dateCreated = null;

    /**
     * Initialize the servlet.<br>
     * Retrieve from the servlet configuration the "baseDir" which is the root
     * of the file repository:<br>
     * If not specified the value of "/UserFiles/" will be used.
     * 
     */
    public void init() throws ServletException {
        baseDir = getInitParameter("baseDir");
        debug = (new Boolean(getInitParameter("debug"))).booleanValue();
        if (baseDir == null)
            baseDir = "/UserFiles/";
        String realBaseDir = getServletContext().getRealPath(baseDir);
        File baseFile = new File(realBaseDir);
        if (!baseFile.exists()) {
            baseFile.mkdir();
        }

        allowedExtensions = new Hashtable(3);
        deniedExtensions = new Hashtable(3);

        allowedExtensions.put("File", FckeditorUtil.stringToArrayList(getInitParameter("AllowedExtensionsFile")));
        deniedExtensions.put("File", FckeditorUtil.stringToArrayList(getInitParameter("DeniedExtensionsFile")));

        allowedExtensions.put("Image", FckeditorUtil.stringToArrayList(getInitParameter("AllowedExtensionsImage")));
        deniedExtensions.put("Image", FckeditorUtil.stringToArrayList(getInitParameter("DeniedExtensionsImage")));

        allowedExtensions.put("Flash", FckeditorUtil.stringToArrayList(getInitParameter("AllowedExtensionsFlash")));
        deniedExtensions.put("Flash", FckeditorUtil.stringToArrayList(getInitParameter("DeniedExtensionsFlash")));

        try {
            SimpleDateFormat simpledateformat = new SimpleDateFormat("yyyy-MM-dd");
            dateCreated = simpledateformat.format(new Date());
        } catch (Exception ex) {
            logger.error("? : " + ex.getMessage());
        }
    }

    /**
     * Manage the Get requests (GetFolders, GetFoldersAndFiles, CreateFolder).<br>
     * 
     * The servlet accepts commands sent in the following format:<br>
     * connector?Command=CommandName&Type=ResourceType&CurrentFolder=FolderPath<br>
     * <br>
     * It execute the command and then return the results to the client in XML
     * format.
     * 
     */
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        if (debug)
            System.out.println("--- BEGIN DOGET (list files) ---");
        response.setContentType("text/xml; charset=UTF-8");
        response.setHeader("Cache-Control", "no-cache");
        PrintWriter out = response.getWriter();

        String commandStr = request.getParameter("Command");
        String typeStr = request.getParameter("Type");
        String currentFolderStr = request.getParameter("CurrentFolder");

        // edit begin +++++++++++++++++
        /*
         * User user = (User) HttpUtil.getAttribute(request.getSession(),
         * Symbols.SESSION_USER); String userId = ""; if (debug)
         * System.out.println("user is null : " + (user == null)); if (user ==
         * null) { userId = HttpUtil.getCookieValue(request,
         * Symbols.COOKIE_FCKEDITOR); } else { userId = user.getId().toString(); }
         * if (debug) System.out.println("get user id from cookie and userId
         * value is : " + userId);
         */
        /*
         * String currentPath=baseDir+typeStr+currentFolderStr; String
         * currentDirPath=getServletContext().getRealPath(currentPath);
         */
        if (debug)
            System.out.println("?  " + dateCreated);
        String currentPath = baseDir + typeStr + "/" + dateCreated.substring(0, 4) + "/" + dateCreated.substring(5)
                + currentFolderStr;
        if (debug)
            System.out.println("?Path : " + currentPath);

        // create user dir
        makeDirectory(getServletContext().getRealPath("/"), currentPath);
        // String currentPath = "";
        String currentDirPath = getServletContext().getRealPath(currentPath);
        // edit end ++++++++++++++++

        File currentDir = new File(currentDirPath);
        /*
         * if(!currentDir.exists()){ currentDir.mkdir(); }
         */
        Document document = null;
        try {
            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
            DocumentBuilder builder = factory.newDocumentBuilder();
            document = builder.newDocument();
        } catch (ParserConfigurationException pce) {
            pce.printStackTrace();
        }

        Node root = CreateCommonXml(document, commandStr, typeStr, currentFolderStr,
                request.getContextPath() + currentPath);

        if (debug)
            System.out.println("Command = " + commandStr);

        if (commandStr.equals("GetFolders")) {
            getFolders(currentDir, root, document);
        } else if (commandStr.equals("GetFoldersAndFiles")) {
            getFolders(currentDir, root, document);
            getFiles(currentDir, root, document);
        } else if (commandStr.equals("CreateFolder")) {
            String newFolderStr = request.getParameter("NewFolderName");
            File newFolder = new File(currentDir, newFolderStr);
            String retValue = "110";
            if (newFolder.exists()) {
                retValue = "101";
            } else {
                try {
                    boolean dirCreated = newFolder.mkdir();
                    if (dirCreated)
                        retValue = "0";
                    else
                        retValue = "102";
                } catch (SecurityException sex) {
                    retValue = "103";
                }
            }
            setCreateFolderResponse(retValue, root, document);
        }

        document.getDocumentElement().normalize();
        try {
            TransformerFactory tFactory = TransformerFactory.newInstance();
            Transformer transformer = tFactory.newTransformer();

            DOMSource source = new DOMSource(document);

            StreamResult result = new StreamResult(out);
            transformer.transform(source, result);

            if (debug) {
                StreamResult dbgResult = new StreamResult(System.out);
                transformer.transform(source, dbgResult);
                System.out.println("");
                System.out.println("--- END DOGET ---");
            }

        } catch (Exception ex) {
            ex.printStackTrace();
        }

        out.flush();
        out.close();
    }

    /**
     * Manage the Post requests (FileUpload).<br>
     * 
     * The servlet accepts commands sent in the following format:<br>
     * connector?Command=FileUpload&Type=ResourceType&CurrentFolder=FolderPath<br>
     * <br>
     * It store the file (renaming it in case a file with the same name exists)
     * and then return an HTML file with a javascript command in it.
     * 
     */
    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        if (debug)
            System.out.println("--- BEGIN Connector DOPOST ---");

        response.setContentType("text/html; charset=UTF-8");
        response.setHeader("Cache-Control", "no-cache");

        String retVal = "0";
        String newName = "";

        // edit check user uploader file size
        int contextLength = request.getContentLength();
        int fileSize = (int) (((float) contextLength) / ((float) (1024)));
        PrintWriter out = response.getWriter();

        if (fileSize < 30240) {

            String commandStr = request.getParameter("Command");
            String typeStr = request.getParameter("Type");
            String currentFolderStr = request.getParameter("CurrentFolder");
            String currentPath = baseDir + typeStr + "/" + dateCreated.substring(0, 4) + "/"
                    + dateCreated.substring(5) + currentFolderStr;
            // create user dir
            makeDirectory(getServletContext().getRealPath("/"), currentPath);
            String currentDirPath = getServletContext().getRealPath(currentPath);
            // edit end ++++++++++++++++

            if (debug)
                System.out.println(currentDirPath);

            if (!commandStr.equals("FileUpload"))
                retVal = "203";
            else {
                DiskFileUpload upload = new DiskFileUpload();

                try {

                    upload.setSizeMax(1 * 1024 * 1024); // ??,??: 
                    upload.setSizeThreshold(4096); // ???,??: 
                    upload.setRepositoryPath("c:/temp/"); // ?getSizeThreshold()? 
                    List items = upload.parseRequest(request);

                    Map fields = new HashMap();

                    Iterator iter = items.iterator();
                    while (iter.hasNext()) {
                        FileItem item = (FileItem) iter.next();
                        if (item.isFormField())
                            fields.put(item.getFieldName(), item.getString());
                        else
                            fields.put(item.getFieldName(), item);
                    }
                    FileItem uplFile = (FileItem) fields.get("NewFile");
                    String fileNameLong = uplFile.getName();
                    fileNameLong = fileNameLong.replace('\\', '/');
                    String[] pathParts = fileNameLong.split("/");
                    String fileName = pathParts[pathParts.length - 1];

                    String nameWithoutExt = getNameWithoutExtension(fileName);
                    String ext = getExtension(fileName);
                    File pathToSave = new File(currentDirPath, fileName);
                    if (FckeditorUtil.extIsAllowed(allowedExtensions, deniedExtensions, typeStr, ext)) {
                        int counter = 1;
                        while (pathToSave.exists()) {
                            newName = nameWithoutExt + "(" + counter + ")" + "." + ext;
                            retVal = "201";
                            pathToSave = new File(currentDirPath, newName);
                            counter++;
                        }
                        uplFile.write(pathToSave);
                        // ?
                        if (logger.isInfoEnabled()) {
                            logger.info("...");
                        }
                    } else {
                        retVal = "202";
                        if (debug)
                            System.out.println("Invalid file type: " + ext);
                    }
                } catch (Exception ex) {
                    ex.printStackTrace();
                    retVal = "203";
                }
            }
        } else {
            retVal = "204";
        }
        out.println("<script type=\"text/javascript\">");
        out.println("window.parent.frames['frmUpload'].OnUploadCompleted(" + retVal + ",'" + newName + "');");
        out.println("</script>");
        out.flush();
        out.close();

        if (debug)
            System.out.println("--- END DOPOST ---");

    }

    private void setCreateFolderResponse(String retValue, Node root, Document doc) {
        Element myEl = doc.createElement("Error");
        myEl.setAttribute("number", retValue);
        root.appendChild(myEl);
    }

    private void getFolders(File dir, Node root, Document doc) {
        Element folders = doc.createElement("Folders");
        root.appendChild(folders);
        File[] fileList = dir.listFiles();
        for (int i = 0; i < fileList.length; ++i) {
            if (fileList[i].isDirectory()) {
                Element myEl = doc.createElement("Folder");
                myEl.setAttribute("name", fileList[i].getName());
                folders.appendChild(myEl);
            }
        }
    }

    private void getFiles(File dir, Node root, Document doc) {
        Element files = doc.createElement("Files");
        root.appendChild(files);
        File[] fileList = dir.listFiles();
        for (int i = 0; i < fileList.length; ++i) {
            if (fileList[i].isFile()) {
                Element myEl = doc.createElement("File");
                myEl.setAttribute("name", fileList[i].getName());
                myEl.setAttribute("size", "" + fileList[i].length() / 1024);
                files.appendChild(myEl);
            }
        }
    }

    private Node CreateCommonXml(Document doc, String commandStr, String typeStr, String currentPath,
            String currentUrl) {

        Element root = doc.createElement("Connector");
        doc.appendChild(root);
        root.setAttribute("command", commandStr);
        root.setAttribute("resourceType", typeStr);

        Element myEl = doc.createElement("CurrentFolder");
        myEl.setAttribute("path", currentPath);
        myEl.setAttribute("url", currentUrl);
        root.appendChild(myEl);

        return root;

    }

    /**
     * Helper function to convert the configuration string to an ArrayList.
     */

    private ArrayList stringToArrayList(String str) {
        if (debug)
            System.out.println(str);
        String[] strArr = str.split("\\|");

        ArrayList tmp = new ArrayList();
        if (str.length() > 0) {
            for (int i = 0; i < strArr.length; ++i) {
                if (debug)
                    System.out.println(i + " - " + strArr[i]);
                tmp.add(strArr[i].toLowerCase());
            }
        }
        return tmp;
    }

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

    /*
     * This method was fixed after Kris Barnhoorn (kurioskronic) submitted SF
     * bug #991489
     */
    private String getExtension(String fileName) {
        return fileName.substring(fileName.lastIndexOf(".") + 1);
    }

    /**
     * ?
     * 
     * @param currentDir
     *            ?
     * @param dirEnum
     *            
     */
    public void makeDirectory(String currentDir, String dirEnum) {
        // ??,?
        if (dirEnum == null) {
            dirEnum = "";
        }
        StringTokenizer dirTokenizer = new StringTokenizer(dirEnum, "/");
        String dirName = "";
        File newDir = null;
        while (dirTokenizer.hasMoreTokens()) {
            dirName = dirTokenizer.nextToken();
            newDir = new File(applyRelativeDirectory(currentDir, dirName));
            currentDir = applyRelativeDirectory(currentDir, dirName);
            if (!newDir.exists()) {
                newDir.mkdirs();
            }
        }
    }

    public String applyRelativeDirectory(String path, String relativeDirectory) {
        path = path.replace("\\", "/");
        boolean isEnd = path.endsWith("/");
        String newDirectory = path;
        if (isEnd) {
            newDirectory = path.substring(0, path.length() - 1);
        }
        if (!relativeDirectory.startsWith("/")) {
            newDirectory += "/";
        }
        return newDirectory + relativeDirectory;
    }

}