Author: ghuber
Date: Fri Jan 27 16:38:03 2012
New Revision: 1236743

URL: http://svn.apache.org/viewvc?rev=1236743&view=rev
Log:
Theme reloading fixes for custom themes

Modified:
    
roller/trunk/weblogger-web/src/main/java/org/apache/roller/weblogger/ui/rendering/servlets/PageServlet.java
    
roller/trunk/weblogger-web/src/main/java/org/apache/roller/weblogger/ui/rendering/servlets/SearchServlet.java

Modified: 
roller/trunk/weblogger-web/src/main/java/org/apache/roller/weblogger/ui/rendering/servlets/PageServlet.java
URL: 
http://svn.apache.org/viewvc/roller/trunk/weblogger-web/src/main/java/org/apache/roller/weblogger/ui/rendering/servlets/PageServlet.java?rev=1236743&r1=1236742&r2=1236743&view=diff
==============================================================================
--- 
roller/trunk/weblogger-web/src/main/java/org/apache/roller/weblogger/ui/rendering/servlets/PageServlet.java
 (original)
+++ 
roller/trunk/weblogger-web/src/main/java/org/apache/roller/weblogger/ui/rendering/servlets/PageServlet.java
 Fri Jan 27 16:38:03 2012
@@ -34,6 +34,7 @@ import org.apache.roller.weblogger.pojos
 import org.apache.roller.weblogger.pojos.ThemeTemplate;
 import org.apache.roller.weblogger.pojos.Weblog;
 import org.apache.roller.weblogger.pojos.WeblogEntry;
+import org.apache.roller.weblogger.pojos.WeblogTemplate;
 import org.apache.roller.weblogger.ui.core.RollerContext;
 import org.apache.roller.weblogger.ui.rendering.Renderer;
 import org.apache.roller.weblogger.ui.rendering.RendererManager;
@@ -66,143 +67,157 @@ import java.util.regex.Pattern;
  */
 public class PageServlet extends HttpServlet {
 
-    private static Log log = LogFactory.getLog(PageServlet.class);
-    // for referrer processing
-    private boolean processReferrers = true;
-    private static Pattern robotPattern = null;
-    // for caching
-    private boolean excludeOwnerPages = false;
-    private WeblogPageCache weblogPageCache = null;
-    private SiteWideCache siteWideCache = null;
-    
-    // Development theme reloading
+       private static Log log = LogFactory.getLog(PageServlet.class);
+       // for referrer processing
+       private boolean processReferrers = true;
+       private static Pattern robotPattern = null;
+       // for caching
+       private boolean excludeOwnerPages = false;
+       private WeblogPageCache weblogPageCache = null;
+       private SiteWideCache siteWideCache = null;
+
+       // Development theme reloading
        Boolean themeReload = false;
 
-    /**
-     * Init method for this servlet
-     */
-    public void init(ServletConfig servletConfig) throws ServletException {
-
-        super.init(servletConfig);
-
-        log.info("Initializing PageServlet");
-
-        this.excludeOwnerPages = 
WebloggerConfig.getBooleanProperty("cache.excludeOwnerEditPages");
-
-        // get a reference to the weblog page cache
-        this.weblogPageCache = WeblogPageCache.getInstance();
-
-        // get a reference to the site wide cache
-        this.siteWideCache = SiteWideCache.getInstance();
-
-        // see if built-in referrer processing is enabled
-        this.processReferrers = 
WebloggerConfig.getBooleanProperty("referrers.processing.enabled");
-
-        log.info("Referrer processing enabled = " + this.processReferrers);
-
-        // check for possible robot pattern
-        String robotPatternStr = 
WebloggerConfig.getProperty("referrer.robotCheck.userAgentPattern");
-        if (robotPatternStr != null && robotPatternStr.length() > 0) {
-            // Parse the pattern, and store the compiled form.
-            try {
-                robotPattern = Pattern.compile(robotPatternStr);
-            } catch (Exception e) {
-                // Most likely a PatternSyntaxException; log and continue as 
if it is not set.
-                log.error("Error parsing referrer.robotCheck.userAgentPattern 
value '" + robotPatternStr + "'.  Robots will not be filtered. ", e);
-            }
-        }
-        
-        // Development theme reloading
+       /**
+        * Init method for this servlet
+        */
+       public void init(ServletConfig servletConfig) throws ServletException {
+
+               super.init(servletConfig);
+
+               log.info("Initializing PageServlet");
+
+               this.excludeOwnerPages = WebloggerConfig
+                               
.getBooleanProperty("cache.excludeOwnerEditPages");
+
+               // get a reference to the weblog page cache
+               this.weblogPageCache = WeblogPageCache.getInstance();
+
+               // get a reference to the site wide cache
+               this.siteWideCache = SiteWideCache.getInstance();
+
+               // see if built-in referrer processing is enabled
+               this.processReferrers = WebloggerConfig
+                               
.getBooleanProperty("referrers.processing.enabled");
+
+               log.info("Referrer processing enabled = " + 
this.processReferrers);
+
+               // check for possible robot pattern
+               String robotPatternStr = WebloggerConfig
+                               
.getProperty("referrer.robotCheck.userAgentPattern");
+               if (robotPatternStr != null && robotPatternStr.length() > 0) {
+                       // Parse the pattern, and store the compiled form.
+                       try {
+                               robotPattern = Pattern.compile(robotPatternStr);
+                       } catch (Exception e) {
+                               // Most likely a PatternSyntaxException; log 
and continue as if
+                               // it is not set.
+                               log.error(
+                                               "Error parsing 
referrer.robotCheck.userAgentPattern value '"
+                                                               + 
robotPatternStr
+                                                               + "'.  Robots 
will not be filtered. ", e);
+                       }
+               }
+
+               // Development theme reloading
                themeReload = 
WebloggerConfig.getBooleanProperty("themes.reload.mode");
-    }
+       }
+
+       /**
+        * Handle GET requests for weblog pages.
+        */
+       public void doGet(HttpServletRequest request, HttpServletResponse 
response)
+                       throws ServletException, IOException {
+
+               log.debug("Entering");
+
+               // do referrer processing, if it's enabled
+               // NOTE: this *must* be done first because it triggers a 
hibernate flush
+               // which will close the active session and cause lazy init 
exceptions
+               // otherwise
+               if (this.processReferrers) {
+                       boolean spam = this.processReferrer(request);
+                       if (spam) {
+                               log.debug("spammer, giving 'em a 403");
+                               if (!response.isCommitted()) {
+                                       response.reset();
+                               }
+                               
response.sendError(HttpServletResponse.SC_FORBIDDEN);
+                               return;
+                       }
+               }
 
-    /**
-     * Handle GET requests for weblog pages.
-     */
-    public void doGet(HttpServletRequest request, HttpServletResponse 
response) throws ServletException, IOException {
-
-        log.debug("Entering");
-
-
-
-        // do referrer processing, if it's enabled
-        // NOTE: this *must* be done first because it triggers a hibernate 
flush
-        // which will close the active session and cause lazy init exceptions 
otherwise
-        if (this.processReferrers) {
-            boolean spam = this.processReferrer(request);
-            if (spam) {
-                log.debug("spammer, giving 'em a 403");
-                if (!response.isCommitted()) {
-                    response.reset();
-                }
-                response.sendError(HttpServletResponse.SC_FORBIDDEN);
-                return;
-            }
-        }
-
-        Weblog weblog = null;
-        boolean isSiteWide = false;
-
-        WeblogPageRequest pageRequest = null;
-        try {
-            pageRequest = new WeblogPageRequest(request);
-
-            weblog = pageRequest.getWeblog();
-            if (weblog == null) {
-                throw new WebloggerException("unable to lookup weblog: " + 
pageRequest.getWeblogHandle());
-            }
-
-            // is this the site-wide weblog?
-            isSiteWide = 
WebloggerRuntimeConfig.isSiteWideWeblog(pageRequest.getWeblogHandle());
-        } catch (Exception e) {
-            // some kind of error parsing the request or looking up weblog
-            log.debug("error creating page request", e);
-            response.sendError(HttpServletResponse.SC_NOT_FOUND);
-            return;
-        }
-
-
-        // determine the lastModified date for this content
-        long lastModified = System.currentTimeMillis();
-        if (isSiteWide) {
-            lastModified = siteWideCache.getLastModified().getTime();
-        } else if (weblog.getLastModified() != null) {
-            lastModified = weblog.getLastModified().getTime();
-        }
-
-        // 304 Not Modified handling.
-        // We skip this for logged in users to avoid the scenerio where a user
-        // views their weblog, logs in, then gets a 304 without the 'edit' 
links
-        if (!pageRequest.isLoggedIn()) {
-            if (ModDateHeaderUtil.respondIfNotModified(request, response, 
lastModified)) {
-                return;
-            } else {
-                // set last-modified date
-                ModDateHeaderUtil.setLastModifiedHeader(response, 
lastModified);
-            }
-        }
-
-
-        // generate cache key
-        String cacheKey = null;
-        if (isSiteWide) {
-            cacheKey = siteWideCache.generateKey(pageRequest);
-        } else {
-            cacheKey = weblogPageCache.generateKey(pageRequest);
-        }
-        
-        // Development only. Reload if theme has been modified
-               if (themeReload) {
+               Weblog weblog = null;
+               boolean isSiteWide = false;
+
+               WeblogPageRequest pageRequest = null;
+               try {
+                       pageRequest = new WeblogPageRequest(request);
+
+                       weblog = pageRequest.getWeblog();
+                       if (weblog == null) {
+                               throw new WebloggerException("unable to lookup 
weblog: "
+                                               + 
pageRequest.getWeblogHandle());
+                       }
+
+                       // is this the site-wide weblog?
+                       isSiteWide = 
WebloggerRuntimeConfig.isSiteWideWeblog(pageRequest
+                                       .getWeblogHandle());
+               } catch (Exception e) {
+                       // some kind of error parsing the request or looking up 
weblog
+                       log.debug("error creating page request", e);
+                       response.sendError(HttpServletResponse.SC_NOT_FOUND);
+                       return;
+               }
+
+               // determine the lastModified date for this content
+               long lastModified = System.currentTimeMillis();
+               if (isSiteWide) {
+                       lastModified = 
siteWideCache.getLastModified().getTime();
+               } else if (weblog.getLastModified() != null) {
+                       lastModified = weblog.getLastModified().getTime();
+               }
+
+               // 304 Not Modified handling.
+               // We skip this for logged in users to avoid the scenerio where 
a user
+               // views their weblog, logs in, then gets a 304 without the 
'edit' links
+               if (!pageRequest.isLoggedIn()) {
+                       if (ModDateHeaderUtil.respondIfNotModified(request, 
response,
+                                       lastModified)) {
+                               return;
+                       } else {
+                               // set last-modified date
+                               
ModDateHeaderUtil.setLastModifiedHeader(response, lastModified);
+                       }
+               }
+
+               // generate cache key
+               String cacheKey = null;
+               if (isSiteWide) {
+                       cacheKey = siteWideCache.generateKey(pageRequest);
+               } else {
+                       cacheKey = weblogPageCache.generateKey(pageRequest);
+               }
+
+               // Development only. Reload if theme has been modified
+               if (themeReload
+                               && !weblog.getEditorTheme()
+                                               
.equals(WeblogTemplate.ACTION_CUSTOM)
+                               && (pageRequest.getPathInfo() == null || 
pageRequest
+                                               .getPathInfo() != null)) {
                        try {
-                               ThemeManager manager = 
WebloggerFactory.getWeblogger().getThemeManager();
-                               boolean reloaded = 
manager.reLoadThemeFromDisk(weblog.getEditorTheme());
+                               ThemeManager manager = 
WebloggerFactory.getWeblogger()
+                                               .getThemeManager();
+                               boolean reloaded = 
manager.reLoadThemeFromDisk(weblog
+                                               .getEditorTheme());
                                if (reloaded) {
                                        if (isSiteWide) {
                                                siteWideCache.clear();
                                        } else {
                                                weblogPageCache.clear();
                                        }
-                                       
I18nMessages.reloadBundle(weblog.getLocaleInstance()); 
+                                       
I18nMessages.reloadBundle(weblog.getLocaleInstance());
                                }
 
                        } catch (Exception ex) {
@@ -210,431 +225,462 @@ public class PageServlet extends HttpSer
                        }
                }
 
-        // cached content checking
-        if ((!this.excludeOwnerPages || !pageRequest.isLoggedIn()) && 
request.getAttribute("skipCache") == null) {
+               // cached content checking
+               if ((!this.excludeOwnerPages || !pageRequest.isLoggedIn())
+                               && request.getAttribute("skipCache") == null) {
+
+                       CachedContent cachedContent = null;
+                       if (isSiteWide) {
+                               cachedContent = (CachedContent) 
siteWideCache.get(cacheKey);
+                       } else {
+                               cachedContent = (CachedContent) 
weblogPageCache.get(cacheKey,
+                                               lastModified);
+                       }
+
+                       if (cachedContent != null) {
+                               log.debug("HIT " + cacheKey);
+
+                               // allow for hit counting
+                               if (!isSiteWide) {
+                                       this.processHit(weblog, 
request.getRequestURL().toString(),
+                                                       
request.getHeader("referer"));
+                               }
+
+                               
response.setContentLength(cachedContent.getContent().length);
+                               
response.setContentType(cachedContent.getContentType());
+                               
response.getOutputStream().write(cachedContent.getContent());
+                               return;
+                       } else {
+                               log.debug("MISS " + cacheKey);
+                       }
+               }
+
+               log.debug("Looking for template to use for rendering");
+
+               // figure out what template to use
+               ThemeTemplate page = null;
+
+               // If this is a popup request, then deal with it specially
+               // TODO: do we really need to keep supporting this?
+               if (request.getParameter("popup") != null) {
+                       try {
+                               // Does user have a popupcomments page?
+                               page = 
weblog.getTheme().getTemplateByName("_popupcomments");
+                       } catch (Exception e) {
+                               // ignored ... considered page not found
+                       }
+
+                       // User doesn't have one so return the default
+                       if (page == null) {
+                               page = new StaticThemeTemplate(
+                                               
"templates/weblog/popupcomments.vm", "velocity");
+                       }
+
+                       // If request specified the page, then go with that
+               } else if ("page".equals(pageRequest.getContext())) {
+                       page = pageRequest.getWeblogPage();
+
+                       // if we don't have this page then 404, we don't let
+                       // this one fall through to the default template
+                       if (page == null) {
+                               if (!response.isCommitted()) {
+                                       response.reset();
+                               }
+                               
response.sendError(HttpServletResponse.SC_NOT_FOUND);
+                               return;
+                       }
+
+                       // If request specified tags section index, then look 
for custom
+                       // template
+               } else if ("tags".equals(pageRequest.getContext())
+                               && pageRequest.getTags() != null) {
+                       try {
+                               page = weblog.getTheme().getTemplateByAction(
+                                               ThemeTemplate.ACTION_TAGSINDEX);
+                       } catch (Exception e) {
+                               log.error("Error getting weblog page for action 
'tagsIndex'", e);
+                       }
+
+                       // if we don't have a custom tags page then 404, we 
don't let
+                       // this one fall through to the default template
+                       if (page == null) {
+                               if (!response.isCommitted()) {
+                                       response.reset();
+                               }
+                               
response.sendError(HttpServletResponse.SC_NOT_FOUND);
+                               return;
+                       }
+
+                       // If this is a permalink then look for a permalink 
template
+               } else if (pageRequest.getWeblogAnchor() != null) {
+                       try {
+                               page = weblog.getTheme().getTemplateByAction(
+                                               ThemeTemplate.ACTION_PERMALINK);
+                       } catch (Exception e) {
+                               log.error("Error getting weblog page for action 
'permalink'", e);
+                       }
+               }
+
+               // if we haven't found a page yet then try our default page
+               if (page == null) {
+                       try {
+                               page = weblog.getTheme().getDefaultTemplate();
+                       } catch (Exception e) {
+                               log.error(
+                                               "Error getting default page for 
weblog = "
+                                                               + 
weblog.getHandle(), e);
+                       }
+               }
+
+               // Still no page? Then that is a 404
+               if (page == null) {
+                       if (!response.isCommitted()) {
+                               response.reset();
+                       }
+                       response.sendError(HttpServletResponse.SC_NOT_FOUND);
+                       return;
+               }
+
+               log.debug("page found, dealing with it");
+
+               // validation. make sure that request input makes sense.
+               boolean invalid = false;
+               if (pageRequest.getWeblogPageName() != null && page.isHidden()) 
{
+                       invalid = true;
+               }
+               if (pageRequest.getLocale() != null) {
 
-            CachedContent cachedContent = null;
-            if (isSiteWide) {
-                cachedContent = (CachedContent) siteWideCache.get(cacheKey);
-            } else {
-                cachedContent = (CachedContent) weblogPageCache.get(cacheKey, 
lastModified);
-            }
-
-            if (cachedContent != null) {
-                log.debug("HIT " + cacheKey);
-
-                // allow for hit counting
-                if (!isSiteWide) {
-                    this.processHit(weblog, 
request.getRequestURL().toString(), request.getHeader("referer"));
-                }
-
-                response.setContentLength(cachedContent.getContent().length);
-                response.setContentType(cachedContent.getContentType());
-                response.getOutputStream().write(cachedContent.getContent());
-                return;
-            } else {
-                log.debug("MISS " + cacheKey);
-            }
-        }
-
-        log.debug("Looking for template to use for rendering");
-
-        // figure out what template to use
-        ThemeTemplate page = null;
-
-        // If this is a popup request, then deal with it specially
-        // TODO: do we really need to keep supporting this?
-        if (request.getParameter("popup") != null) {
-            try {
-                // Does user have a popupcomments page?
-                page = weblog.getTheme().getTemplateByName("_popupcomments");
-            } catch (Exception e) {
-                // ignored ... considered page not found
-            }
-
-            // User doesn't have one so return the default
-            if (page == null) {
-                page = new 
StaticThemeTemplate("templates/weblog/popupcomments.vm", "velocity");
-            }
-
-            // If request specified the page, then go with that
-        } else if ("page".equals(pageRequest.getContext())) {
-            page = pageRequest.getWeblogPage();
-
-            // if we don't have this page then 404, we don't let
-            // this one fall through to the default template
-            if (page == null) {
-                if (!response.isCommitted()) {
-                    response.reset();
-                }
-                response.sendError(HttpServletResponse.SC_NOT_FOUND);
-                return;
-            }
-
-            // If request specified tags section index, then look for custom 
template
-        } else if ("tags".equals(pageRequest.getContext()) && 
pageRequest.getTags() != null) {
-            try {
-                page = 
weblog.getTheme().getTemplateByAction(ThemeTemplate.ACTION_TAGSINDEX);
-            } catch (Exception e) {
-                log.error("Error getting weblog page for action 'tagsIndex'", 
e);
-            }
-
-            // if we don't have a custom tags page then 404, we don't let
-            // this one fall through to the default template
-            if (page == null) {
-                if (!response.isCommitted()) {
-                    response.reset();
-                }
-                response.sendError(HttpServletResponse.SC_NOT_FOUND);
-                return;
-            }
-
-            // If this is a permalink then look for a permalink template
-        } else if (pageRequest.getWeblogAnchor() != null) {
-            try {
-                page = 
weblog.getTheme().getTemplateByAction(ThemeTemplate.ACTION_PERMALINK);
-            } catch (Exception e) {
-                log.error("Error getting weblog page for action 'permalink'", 
e);
-            }
-        }
-
-        // if we haven't found a page yet then try our default page
-        if (page == null) {
-            try {
-                page = weblog.getTheme().getDefaultTemplate();
-            } catch (Exception e) {
-                log.error("Error getting default page for weblog = " + 
weblog.getHandle(), e);
-            }
-        }
-
-        // Still no page?  Then that is a 404
-        if (page == null) {
-            if (!response.isCommitted()) {
-                response.reset();
-            }
-            response.sendError(HttpServletResponse.SC_NOT_FOUND);
-            return;
-        }
-
-        log.debug("page found, dealing with it");
-
-        // validation.  make sure that request input makes sense.
-        boolean invalid = false;
-        if (pageRequest.getWeblogPageName() != null && page.isHidden()) {
-            invalid = true;
-        }
-        if (pageRequest.getLocale() != null) {
-
-            // locale view only allowed if weblog has enabled it
-            if (!pageRequest.getWeblog().isEnableMultiLang()) {
-                invalid = true;
-            }
-        }
-        if (pageRequest.getWeblogAnchor() != null) {
-
-            // permalink specified.
-            // entry must exist, be published before current time, and locale 
must match
-            WeblogEntry entry = pageRequest.getWeblogEntry();
-            if (entry == null) {
-                invalid = true;
-            } else if (pageRequest.getLocale() != null && 
!entry.getLocale().startsWith(pageRequest.getLocale())) {
-                invalid = true;
-            } else if (!entry.isPublished()) {
-                invalid = true;
-            } else if (new Date().before(entry.getPubTime())) {
-                invalid = true;
-            }
-        } else if (pageRequest.getWeblogCategoryName() != null) {
-
-            // category specified.  category must exist.
-            if (pageRequest.getWeblogCategory() == null) {
-                invalid = true;
-            }
-        } else if (pageRequest.getTags() != null && 
pageRequest.getTags().size() > 0) {
-
-            try {
-                // tags specified.  make sure they exist.
-                WeblogEntryManager wmgr = 
WebloggerFactory.getWeblogger().getWeblogEntryManager();
-                invalid = !wmgr.getTagComboExists(pageRequest.getTags(), 
(isSiteWide) ? null : weblog);
-            } catch (WebloggerException ex) {
-                invalid = true;
-            }
-        }
-
-
-        if (invalid) {
-            log.debug("page failed validation, bailing out");
-            if (!response.isCommitted()) {
-                response.reset();
-            }
-            response.sendError(HttpServletResponse.SC_NOT_FOUND);
-            return;
-        }
-
-
-        // do we need to force a specific locale for the request?
-        if (pageRequest.getLocale() == null && !weblog.isShowAllLangs()) {
-            pageRequest.setLocale(weblog.getLocale());
-        }
-
-
-        // allow for hit counting
-        if (!isSiteWide) {
-            this.processHit(weblog, request.getRequestURL().toString(), 
request.getHeader("referer"));
-        }
-
-
-        // looks like we need to render content
-        // set the content deviceType
-        String contentType = "text/html; charset=utf-8";
-        if (StringUtils.isNotEmpty(page.getOutputContentType())) {
-            contentType = page.getOutputContentType() + "; charset=utf-8";
-        } else {
-            String mimeType = 
RollerContext.getServletContext().getMimeType(page.getLink());
-            if (mimeType != null) {
-                // we found a match ... set the content deviceType
-                contentType = mimeType + "; charset=utf-8";
-            } else {
-                contentType = "text/html; charset=utf-8";
-            }
-        }
-
-        HashMap model = new HashMap();
-        try {
-            PageContext pageContext = 
JspFactory.getDefaultFactory().getPageContext(this, request, response, "", 
false, 8192, true);
-
-            // special hack for menu tag
-            request.setAttribute("pageRequest", pageRequest);
-
-            // populate the rendering model
-            Map initData = new HashMap();
-            initData.put("requestParameters", request.getParameterMap());
-            initData.put("parsedRequest", pageRequest);
-            initData.put("pageContext", pageContext);
-
-            // define url strategy
-            initData.put("urlStrategy", 
WebloggerFactory.getWeblogger().getUrlStrategy());
-
-            // if this was a comment posting, check for comment form
-            WeblogEntryCommentForm commentForm = (WeblogEntryCommentForm) 
request.getAttribute("commentForm");
-            if (commentForm != null) {
-                initData.put("commentForm", commentForm);
-            }
-
-            // Load models for pages
-            String pageModels = 
WebloggerConfig.getProperty("rendering.pageModels");
-            ModelLoader.loadModels(pageModels, model, initData, true);
-            // Load special models for site-wide blog
-            if (WebloggerRuntimeConfig.isSiteWideWeblog(weblog.getHandle())) {
-                String siteModels = 
WebloggerConfig.getProperty("rendering.siteModels");
-                ModelLoader.loadModels(siteModels, model, initData, true);
-            }
-
-            // Load weblog custom models
-            ModelLoader.loadCustomModels(weblog, model, initData);
-
-            // ick, gotta load pre-3.0 model stuff as well :(
-            ModelLoader.loadOldModels(model, request, response, pageContext, 
pageRequest, WebloggerFactory.getWeblogger().getUrlStrategy());
-        } catch (WebloggerException ex) {
-            log.error("Error loading model objects for page", ex);
-
-            if (!response.isCommitted()) {
-                response.reset();
-            }
-            response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
-            return;
-        }
-
-
-        // lookup Renderer we are going to use
-        Renderer renderer = null;
-        try {
-            log.debug("Looking up renderer");
-            renderer = RendererManager.getRenderer(page, 
pageRequest.getDeviceType());
-        } catch (Exception e) {
-            // nobody wants to render my content :(
-            log.error("Couldn't find renderer for page " + page.getId(), e);
-
-            if (!response.isCommitted()) {
-                response.reset();
-            }
-            response.sendError(HttpServletResponse.SC_NOT_FOUND);
-            return;
-        }
-
-        // render content.  use size of about 24K for a standard page
-        CachedContent rendererOutput = new CachedContent(24567, contentType);
-        try {
-            log.debug("Doing rendering");
-            renderer.render(model, rendererOutput.getCachedWriter());
-
-            // flush rendered output and close
-            rendererOutput.flush();
-            rendererOutput.close();
-        } catch (Exception e) {
-            // bummer, error during rendering
-            log.error("Error during rendering for page " + page.getId(), e);
-
-            if (!response.isCommitted()) {
-                response.reset();
-            }
-            response.sendError(HttpServletResponse.SC_NOT_FOUND);
-            return;
-        }
-
-
-        // post rendering process
-        // flush rendered content to response
-        log.debug("Flushing response output");
-        response.setContentType(contentType);
-        response.setContentLength(rendererOutput.getContent().length);
-        response.getOutputStream().write(rendererOutput.getContent());
-
-        // cache rendered content.  only cache if user is not logged in?
-        if ((!this.excludeOwnerPages || !pageRequest.isLoggedIn()) && 
request.getAttribute("skipCache") == null) {
-            log.debug("PUT " + cacheKey);
-
-            // put it in the right cache
-            if (isSiteWide) {
-                siteWideCache.put(cacheKey, rendererOutput);
-            } else {
-                weblogPageCache.put(cacheKey, rendererOutput);
-            }
-        } else {
-            log.debug("SKIPPED " + cacheKey);
-        }
-
-        log.debug("Exiting");
-    }
-
-    /**
-     * Handle POST requests.
-     *
-     * We have this here because the comment servlet actually forwards some of
-     * its requests on to us to render some pages with cusom messaging.  We
-     * may want to revisit this approach in the future and see if we can do
-     * this in a different way, but for now this is the easy way.
-     */
-    public void doPost(HttpServletRequest request, HttpServletResponse 
response) throws ServletException, IOException {
-
-        // make sure caching is disabled
-        request.setAttribute("skipCache", "true");
-
-        // handle just like a GET request
-        this.doGet(request, response);
-    }
-
-    /**
-     * Notify the hit tracker that it has an incoming page hit.
-     */
-    private void processHit(Weblog weblog, String url, String referrer) {
-
-        HitCountQueue counter = HitCountQueue.getInstance();
-        counter.processHit(weblog, url, referrer);
-    }
-
-    /**
-     * Process the incoming request to extract referrer info and pass it on
-     * to the referrer processing queue for tracking.
-     *
-     * @return true if referrer was spam, false otherwise
-     */
-    private boolean processReferrer(HttpServletRequest request) {
-
-        log.debug("processing referrer for " + request.getRequestURI());
-
-        // bleh!  because ref processing does a flush it will close
-        // our hibernate session and cause lazy init exceptions on
-        // objects we have fetched, so we need to use a separate
-        // page request object for this
-        WeblogPageRequest pageRequest;
-        try {
-            pageRequest = new WeblogPageRequest(request);
-        } catch (InvalidRequestException ex) {
-            return false;
-        }
-
-        // if this came from site-wide frontpage then skip it
-        if 
(WebloggerRuntimeConfig.isSiteWideWeblog(pageRequest.getWeblogHandle())) {
-            return false;
-        }
-
-        // if this came from a robot then don't process it
-        if (robotPattern != null) {
-            String userAgent = request.getHeader("User-Agent");
-            if (userAgent != null && userAgent.length() > 0 && 
robotPattern.matcher(userAgent).matches()) {
-                log.debug("skipping referrer from robot");
-                return false;
-            }
-        }
-
-        String referrerUrl = request.getHeader("Referer");
-        StringBuffer reqsb = request.getRequestURL();
-        if (request.getQueryString() != null) {
-            reqsb.append("?");
-            reqsb.append(request.getQueryString());
-        }
-        String requestUrl = reqsb.toString();
-
-        log.debug("referrer = " + referrerUrl);
-
-        // if this came from persons own blog then don't process it
-        String selfSiteFragment = "/" + pageRequest.getWeblogHandle();
-        if (referrerUrl != null && referrerUrl.indexOf(selfSiteFragment) != 
-1) {
-            log.debug("skipping referrer from own blog");
-            return false;
-        }
-
-        // validate the referrer
-        if (pageRequest != null && pageRequest.getWeblogHandle() != null) {
-
-            // Base page URLs, with and without www.
-            String basePageUrlWWW = 
WebloggerRuntimeConfig.getAbsoluteContextURL() + "/" + 
pageRequest.getWeblogHandle();
-            String basePageUrl = basePageUrlWWW;
-            if (basePageUrlWWW.startsWith("http://www.";)) {
-                // chop off the http://www.
-                basePageUrl = "http://"; + basePageUrlWWW.substring(11);
-            }
-
-            // ignore referrers coming from users own blog
-            if (referrerUrl == null || (!referrerUrl.startsWith(basePageUrl) 
&& !referrerUrl.startsWith(basePageUrlWWW))) {
-
-                // validate the referrer
-                if (referrerUrl != null) {
-                    // treat editor referral as direct
-                    int lastSlash = requestUrl.indexOf("/", 8);
-                    if (lastSlash == -1) {
-                        lastSlash = requestUrl.length();
-                    }
-                    String requestSite = requestUrl.substring(0, lastSlash);
-
-                    if (referrerUrl.matches(requestSite + ".*\\.rol.*")) {
-                        referrerUrl = null;
-                    } else if 
(BlacklistChecker.checkReferrer(pageRequest.getWeblog(), referrerUrl)) {
-                        return true;
-                    }
-                }
-            } else {
-                log.debug("Ignoring referer = " + referrerUrl);
-                return false;
-            }
-        }
-
-        // referrer is valid, lets record it
-        try {
-            IncomingReferrer referrer = new IncomingReferrer();
-            referrer.setReferrerUrl(referrerUrl);
-            referrer.setRequestUrl(requestUrl);
-            referrer.setWeblogHandle(pageRequest.getWeblogHandle());
-            referrer.setWeblogAnchor(pageRequest.getWeblogAnchor());
-            referrer.setWeblogDateString(pageRequest.getWeblogDate());
-
-            ReferrerQueueManager refQueue = 
WebloggerFactory.getWeblogger().getReferrerQueueManager();
-            refQueue.processReferrer(referrer);
-        } catch (Exception e) {
-            log.error("Error processing referrer", e);
-        }
+                       // locale view only allowed if weblog has enabled it
+                       if (!pageRequest.getWeblog().isEnableMultiLang()) {
+                               invalid = true;
+                       }
+               }
+               if (pageRequest.getWeblogAnchor() != null) {
+
+                       // permalink specified.
+                       // entry must exist, be published before current time, 
and locale
+                       // must match
+                       WeblogEntry entry = pageRequest.getWeblogEntry();
+                       if (entry == null) {
+                               invalid = true;
+                       } else if (pageRequest.getLocale() != null
+                                       && 
!entry.getLocale().startsWith(pageRequest.getLocale())) {
+                               invalid = true;
+                       } else if (!entry.isPublished()) {
+                               invalid = true;
+                       } else if (new Date().before(entry.getPubTime())) {
+                               invalid = true;
+                       }
+               } else if (pageRequest.getWeblogCategoryName() != null) {
+
+                       // category specified. category must exist.
+                       if (pageRequest.getWeblogCategory() == null) {
+                               invalid = true;
+                       }
+               } else if (pageRequest.getTags() != null
+                               && pageRequest.getTags().size() > 0) {
+
+                       try {
+                               // tags specified. make sure they exist.
+                               WeblogEntryManager wmgr = 
WebloggerFactory.getWeblogger()
+                                               .getWeblogEntryManager();
+                               invalid = 
!wmgr.getTagComboExists(pageRequest.getTags(),
+                                               (isSiteWide) ? null : weblog);
+                       } catch (WebloggerException ex) {
+                               invalid = true;
+                       }
+               }
+
+               if (invalid) {
+                       log.debug("page failed validation, bailing out");
+                       if (!response.isCommitted()) {
+                               response.reset();
+                       }
+                       response.sendError(HttpServletResponse.SC_NOT_FOUND);
+                       return;
+               }
+
+               // do we need to force a specific locale for the request?
+               if (pageRequest.getLocale() == null && 
!weblog.isShowAllLangs()) {
+                       pageRequest.setLocale(weblog.getLocale());
+               }
+
+               // allow for hit counting
+               if (!isSiteWide) {
+                       this.processHit(weblog, 
request.getRequestURL().toString(),
+                                       request.getHeader("referer"));
+               }
+
+               // looks like we need to render content
+               // set the content deviceType
+               String contentType = "text/html; charset=utf-8";
+               if (StringUtils.isNotEmpty(page.getOutputContentType())) {
+                       contentType = page.getOutputContentType() + "; 
charset=utf-8";
+               } else {
+                       String mimeType = 
RollerContext.getServletContext().getMimeType(
+                                       page.getLink());
+                       if (mimeType != null) {
+                               // we found a match ... set the content 
deviceType
+                               contentType = mimeType + "; charset=utf-8";
+                       } else {
+                               contentType = "text/html; charset=utf-8";
+                       }
+               }
+
+               HashMap model = new HashMap();
+               try {
+                       PageContext pageContext = JspFactory.getDefaultFactory()
+                                       .getPageContext(this, request, 
response, "", false, 8192,
+                                                       true);
+
+                       // special hack for menu tag
+                       request.setAttribute("pageRequest", pageRequest);
+
+                       // populate the rendering model
+                       Map initData = new HashMap();
+                       initData.put("requestParameters", 
request.getParameterMap());
+                       initData.put("parsedRequest", pageRequest);
+                       initData.put("pageContext", pageContext);
+
+                       // define url strategy
+                       initData.put("urlStrategy", 
WebloggerFactory.getWeblogger()
+                                       .getUrlStrategy());
+
+                       // if this was a comment posting, check for comment form
+                       WeblogEntryCommentForm commentForm = 
(WeblogEntryCommentForm) request
+                                       .getAttribute("commentForm");
+                       if (commentForm != null) {
+                               initData.put("commentForm", commentForm);
+                       }
+
+                       // Load models for pages
+                       String pageModels = WebloggerConfig
+                                       .getProperty("rendering.pageModels");
+                       ModelLoader.loadModels(pageModels, model, initData, 
true);
+                       // Load special models for site-wide blog
+                       if 
(WebloggerRuntimeConfig.isSiteWideWeblog(weblog.getHandle())) {
+                               String siteModels = WebloggerConfig
+                                               
.getProperty("rendering.siteModels");
+                               ModelLoader.loadModels(siteModels, model, 
initData, true);
+                       }
+
+                       // Load weblog custom models
+                       ModelLoader.loadCustomModels(weblog, model, initData);
+
+                       // ick, gotta load pre-3.0 model stuff as well :(
+                       ModelLoader.loadOldModels(model, request, response, 
pageContext,
+                                       pageRequest, 
WebloggerFactory.getWeblogger()
+                                                       .getUrlStrategy());
+               } catch (WebloggerException ex) {
+                       log.error("Error loading model objects for page", ex);
+
+                       if (!response.isCommitted()) {
+                               response.reset();
+                       }
+                       
response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
+                       return;
+               }
+
+               // lookup Renderer we are going to use
+               Renderer renderer = null;
+               try {
+                       log.debug("Looking up renderer");
+                       renderer = RendererManager.getRenderer(page,
+                                       pageRequest.getDeviceType());
+               } catch (Exception e) {
+                       // nobody wants to render my content :(
+                       log.error("Couldn't find renderer for page " + 
page.getId(), e);
+
+                       if (!response.isCommitted()) {
+                               response.reset();
+                       }
+                       response.sendError(HttpServletResponse.SC_NOT_FOUND);
+                       return;
+               }
+
+               // render content. use size of about 24K for a standard page
+               CachedContent rendererOutput = new CachedContent(24567, 
contentType);
+               try {
+                       log.debug("Doing rendering");
+                       renderer.render(model, 
rendererOutput.getCachedWriter());
+
+                       // flush rendered output and close
+                       rendererOutput.flush();
+                       rendererOutput.close();
+               } catch (Exception e) {
+                       // bummer, error during rendering
+                       log.error("Error during rendering for page " + 
page.getId(), e);
+
+                       if (!response.isCommitted()) {
+                               response.reset();
+                       }
+                       response.sendError(HttpServletResponse.SC_NOT_FOUND);
+                       return;
+               }
+
+               // post rendering process
+               // flush rendered content to response
+               log.debug("Flushing response output");
+               response.setContentType(contentType);
+               response.setContentLength(rendererOutput.getContent().length);
+               response.getOutputStream().write(rendererOutput.getContent());
+
+               // cache rendered content. only cache if user is not logged in?
+               if ((!this.excludeOwnerPages || !pageRequest.isLoggedIn())
+                               && request.getAttribute("skipCache") == null) {
+                       log.debug("PUT " + cacheKey);
+
+                       // put it in the right cache
+                       if (isSiteWide) {
+                               siteWideCache.put(cacheKey, rendererOutput);
+                       } else {
+                               weblogPageCache.put(cacheKey, rendererOutput);
+                       }
+               } else {
+                       log.debug("SKIPPED " + cacheKey);
+               }
+
+               log.debug("Exiting");
+       }
+
+       /**
+        * Handle POST requests.
+        * 
+        * We have this here because the comment servlet actually forwards some 
of
+        * its requests on to us to render some pages with cusom messaging. We 
may
+        * want to revisit this approach in the future and see if we can do 
this in
+        * a different way, but for now this is the easy way.
+        */
+       public void doPost(HttpServletRequest request, HttpServletResponse 
response)
+                       throws ServletException, IOException {
+
+               // make sure caching is disabled
+               request.setAttribute("skipCache", "true");
+
+               // handle just like a GET request
+               this.doGet(request, response);
+       }
+
+       /**
+        * Notify the hit tracker that it has an incoming page hit.
+        */
+       private void processHit(Weblog weblog, String url, String referrer) {
+
+               HitCountQueue counter = HitCountQueue.getInstance();
+               counter.processHit(weblog, url, referrer);
+       }
+
+       /**
+        * Process the incoming request to extract referrer info and pass it on 
to
+        * the referrer processing queue for tracking.
+        * 
+        * @return true if referrer was spam, false otherwise
+        */
+       private boolean processReferrer(HttpServletRequest request) {
+
+               log.debug("processing referrer for " + request.getRequestURI());
+
+               // bleh! because ref processing does a flush it will close
+               // our hibernate session and cause lazy init exceptions on
+               // objects we have fetched, so we need to use a separate
+               // page request object for this
+               WeblogPageRequest pageRequest;
+               try {
+                       pageRequest = new WeblogPageRequest(request);
+               } catch (InvalidRequestException ex) {
+                       return false;
+               }
+
+               // if this came from site-wide frontpage then skip it
+               if (WebloggerRuntimeConfig.isSiteWideWeblog(pageRequest
+                               .getWeblogHandle())) {
+                       return false;
+               }
+
+               // if this came from a robot then don't process it
+               if (robotPattern != null) {
+                       String userAgent = request.getHeader("User-Agent");
+                       if (userAgent != null && userAgent.length() > 0
+                                       && 
robotPattern.matcher(userAgent).matches()) {
+                               log.debug("skipping referrer from robot");
+                               return false;
+                       }
+               }
+
+               String referrerUrl = request.getHeader("Referer");
+               StringBuffer reqsb = request.getRequestURL();
+               if (request.getQueryString() != null) {
+                       reqsb.append("?");
+                       reqsb.append(request.getQueryString());
+               }
+               String requestUrl = reqsb.toString();
+
+               log.debug("referrer = " + referrerUrl);
+
+               // if this came from persons own blog then don't process it
+               String selfSiteFragment = "/" + pageRequest.getWeblogHandle();
+               if (referrerUrl != null && 
referrerUrl.indexOf(selfSiteFragment) != -1) {
+                       log.debug("skipping referrer from own blog");
+                       return false;
+               }
+
+               // validate the referrer
+               if (pageRequest != null && pageRequest.getWeblogHandle() != 
null) {
+
+                       // Base page URLs, with and without www.
+                       String basePageUrlWWW = WebloggerRuntimeConfig
+                                       .getAbsoluteContextURL()
+                                       + "/"
+                                       + pageRequest.getWeblogHandle();
+                       String basePageUrl = basePageUrlWWW;
+                       if (basePageUrlWWW.startsWith("http://www.";)) {
+                               // chop off the http://www.
+                               basePageUrl = "http://"; + 
basePageUrlWWW.substring(11);
+                       }
+
+                       // ignore referrers coming from users own blog
+                       if (referrerUrl == null
+                                       || 
(!referrerUrl.startsWith(basePageUrl) && !referrerUrl
+                                                       
.startsWith(basePageUrlWWW))) {
+
+                               // validate the referrer
+                               if (referrerUrl != null) {
+                                       // treat editor referral as direct
+                                       int lastSlash = requestUrl.indexOf("/", 
8);
+                                       if (lastSlash == -1) {
+                                               lastSlash = requestUrl.length();
+                                       }
+                                       String requestSite = 
requestUrl.substring(0, lastSlash);
+
+                                       if (referrerUrl.matches(requestSite + 
".*\\.rol.*")) {
+                                               referrerUrl = null;
+                                       } else if 
(BlacklistChecker.checkReferrer(
+                                                       
pageRequest.getWeblog(), referrerUrl)) {
+                                               return true;
+                                       }
+                               }
+                       } else {
+                               log.debug("Ignoring referer = " + referrerUrl);
+                               return false;
+                       }
+               }
+
+               // referrer is valid, lets record it
+               try {
+                       IncomingReferrer referrer = new IncomingReferrer();
+                       referrer.setReferrerUrl(referrerUrl);
+                       referrer.setRequestUrl(requestUrl);
+                       referrer.setWeblogHandle(pageRequest.getWeblogHandle());
+                       referrer.setWeblogAnchor(pageRequest.getWeblogAnchor());
+                       
referrer.setWeblogDateString(pageRequest.getWeblogDate());
+
+                       ReferrerQueueManager refQueue = 
WebloggerFactory.getWeblogger()
+                                       .getReferrerQueueManager();
+                       refQueue.processReferrer(referrer);
+               } catch (Exception e) {
+                       log.error("Error processing referrer", e);
+               }
 
-        return false;
-    }
+               return false;
+       }
 }

Modified: 
roller/trunk/weblogger-web/src/main/java/org/apache/roller/weblogger/ui/rendering/servlets/SearchServlet.java
URL: 
http://svn.apache.org/viewvc/roller/trunk/weblogger-web/src/main/java/org/apache/roller/weblogger/ui/rendering/servlets/SearchServlet.java?rev=1236743&r1=1236742&r2=1236743&view=diff
==============================================================================
--- 
roller/trunk/weblogger-web/src/main/java/org/apache/roller/weblogger/ui/rendering/servlets/SearchServlet.java
 (original)
+++ 
roller/trunk/weblogger-web/src/main/java/org/apache/roller/weblogger/ui/rendering/servlets/SearchServlet.java
 Fri Jan 27 16:38:03 2012
@@ -18,6 +18,18 @@
 
 package org.apache.roller.weblogger.ui.rendering.servlets;
 
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.servlet.ServletConfig;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.servlet.jsp.JspFactory;
+import javax.servlet.jsp.PageContext;
+
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.roller.weblogger.WebloggerException;
@@ -27,9 +39,9 @@ import org.apache.roller.weblogger.confi
 import org.apache.roller.weblogger.config.WebloggerRuntimeConfig;
 import org.apache.roller.weblogger.pojos.ThemeTemplate;
 import org.apache.roller.weblogger.pojos.Weblog;
+import org.apache.roller.weblogger.pojos.WeblogTemplate;
 import org.apache.roller.weblogger.ui.rendering.Renderer;
 import org.apache.roller.weblogger.ui.rendering.RendererManager;
-import org.apache.roller.weblogger.ui.rendering.RenderingException;
 import org.apache.roller.weblogger.ui.rendering.mobile.MobileDeviceRepository;
 import org.apache.roller.weblogger.ui.rendering.model.Model;
 import org.apache.roller.weblogger.ui.rendering.model.ModelLoader;
@@ -41,17 +53,6 @@ import org.apache.roller.weblogger.ui.re
 import org.apache.roller.weblogger.util.I18nMessages;
 import org.apache.roller.weblogger.util.cache.CachedContent;
 
-import javax.servlet.ServletConfig;
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServlet;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import javax.servlet.jsp.JspFactory;
-import javax.servlet.jsp.PageContext;
-import java.io.IOException;
-import java.util.HashMap;
-import java.util.Map;
-
 
 /**
  * Handles search queries for weblogs.
@@ -194,7 +195,13 @@ public class SearchServlet extends HttpS
         }
 
         // Development only. Reload if theme has been modified
-               if (themeReload) {
+        if (themeReload
+                       && !weblog.getEditorTheme().equals(
+                                       WeblogTemplate.ACTION_CUSTOM)
+                                       && (searchRequest.getPathInfo() == null 
|| searchRequest
+                                       .getPathInfo() != null
+                                       && 
!searchRequest.getPathInfo().endsWith(".css"))) {
+                       
                        try {
                                ThemeManager manager = 
WebloggerFactory.getWeblogger().getThemeManager();
                                boolean reloaded = 
manager.reLoadThemeFromDisk(weblog.getEditorTheme());


Reply via email to