1 /*
2 * FCKeditor - The text editor for Internet - http://www.fckeditor.net
3 * Copyright (C) 2004-2010 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.connector.impl;
22
23 import javax.servlet.ServletContext;
24
25 import net.fckeditor.handlers.PropertiesLoader;
26 import net.fckeditor.requestcycle.impl.ContextPathBuilder;
27
28 import org.slf4j.Logger;
29 import org.slf4j.LoggerFactory;
30
31 /**
32 * Context filesystem backend connector. The file access will be restricted to
33 * the real context root of the currently deployed webapp.
34 * <p>
35 * Though, this connector has some drawbacks:
36 * <ul>
37 * <li>Stored files and folders will be gone if the context is undeployed,
38 * unless you have saved them before.</li>
39 * <li>Some servers are unable to write to the real context root (like
40 * WebSphere), see {@link #init(ServletContext)} for more details.</li>
41 * <li>Some containers (like Jetty) unpack the war file to a different directory
42 * at server start which means that files are gone in temp.</li>
43 * </ul>
44 * </p>
45 * Use the {@link ContextPathBuilder} in conjunction with this class.
46 *
47 * @version $Id: ContextConnector.java 4785 2009-12-21 20:10:28Z mosipov $
48 */
49 public class ContextConnector extends AbstractLocalFileSystemConnector {
50
51 private final Logger logger = LoggerFactory.getLogger(ContextConnector.class);
52
53 /**
54 * {@inheritDoc}
55 * This method will prepare the connector for further usage, additionally it
56 * will check if the aforementioned drawback exists. It will try to resolve
57 * the default {@link PropertiesLoader#getUserFilesPath() UserFilesPath}
58 * with
59 * <code><a href="http://tomcat.apache.org/tomcat-5.5-doc/servletapi/javax/servlet/ServletContext.html#getRealPath(java.lang.String)"
60 * target="_blank">ServletContext.getRealPath(String)</a></code> against the
61 * local filesystem (real path). If it fails, it will emit helpful log
62 * messages and will throw an exception too.
63 */
64 public void init(final ServletContext servletContext) throws Exception {
65 this.servletContext = servletContext;
66 String defaultAbsolutePath = getRealUserFilesAbsolutePath(PropertiesLoader
67 .getUserFilesPath());
68
69 if (defaultAbsolutePath == null) {
70 logger.error("The context root cannot be resolved against the local filesystem");
71 logger.info("Your servlet container/application server does not expand deployed war files");
72 logger.debug("Use another Connector implementation (e.g. LocalConnector) and consult http://www.fckeditor.net/forums/viewtopic.php?f=6&t=11568");
73 throw new NullPointerException(
74 "The real context root cannot be resolved against the local filesystem");
75 }
76 }
77
78 /**
79 * Resolves the userfiles absolute path against the current context real
80 * path.
81 */
82 @Override
83 protected String getRealUserFilesAbsolutePath(String userFilesAbsolutePath) {
84 return servletContext.getRealPath(userFilesAbsolutePath);
85 }
86
87 }