Author: gmazza
Date: Tue Apr  1 01:32:35 2014
New Revision: 1583506

URL: http://svn.apache.org/r1583506
Log:
Minor Sonar issues fixed and some code reformatting (switching from tabs to 4 
spaces.)

Modified:
    roller/trunk/app/src/main/java/org/apache/roller/util/RollerConstants.java
    
roller/trunk/app/src/main/java/org/apache/roller/weblogger/business/jpa/JPABookmarkManagerImpl.java
    
roller/trunk/app/src/main/java/org/apache/roller/weblogger/pojos/WeblogEntry.java
    
roller/trunk/app/src/main/java/org/apache/roller/weblogger/pojos/WeblogReferrer.java
    
roller/trunk/app/src/main/java/org/apache/roller/weblogger/ui/core/filters/SchemeEnforcementFilter.java
    
roller/trunk/app/src/main/java/org/apache/roller/weblogger/ui/core/security/RollerUserDetailsService.java
    
roller/trunk/app/src/main/java/org/apache/roller/weblogger/ui/rendering/pagers/MediaFilesPager.java
    
roller/trunk/app/src/main/java/org/apache/roller/weblogger/ui/rendering/servlets/TrackbackServlet.java
    
roller/trunk/app/src/main/java/org/apache/roller/weblogger/ui/rendering/util/cache/PlanetCache.java
    
roller/trunk/app/src/main/java/org/apache/roller/weblogger/ui/rendering/velocity/RollerVelocity.java
    
roller/trunk/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/Entries.java
    
roller/trunk/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/Templates.java
    
roller/trunk/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/WeblogExport.java
    
roller/trunk/app/src/main/java/org/apache/roller/weblogger/util/HTMLSanitizer.java
    
roller/trunk/app/src/main/java/org/apache/roller/weblogger/util/Trackback.java

Modified: 
roller/trunk/app/src/main/java/org/apache/roller/util/RollerConstants.java
URL: 
http://svn.apache.org/viewvc/roller/trunk/app/src/main/java/org/apache/roller/util/RollerConstants.java?rev=1583506&r1=1583505&r2=1583506&view=diff
==============================================================================
--- roller/trunk/app/src/main/java/org/apache/roller/util/RollerConstants.java 
(original)
+++ roller/trunk/app/src/main/java/org/apache/roller/util/RollerConstants.java 
Tue Apr  1 01:32:35 2014
@@ -32,6 +32,8 @@ public final class RollerConstants {
     public static final int SEC_IN_MS = 1000;
     public static final int MIN_IN_MS = 60 * SEC_IN_MS;
 
+    public static final int TEXTWIDTH_255 = 255;
+
     private RollerConstants() {
         // never instantiable
         throw new AssertionError();

Modified: 
roller/trunk/app/src/main/java/org/apache/roller/weblogger/business/jpa/JPABookmarkManagerImpl.java
URL: 
http://svn.apache.org/viewvc/roller/trunk/app/src/main/java/org/apache/roller/weblogger/business/jpa/JPABookmarkManagerImpl.java?rev=1583506&r1=1583505&r2=1583506&view=diff
==============================================================================
--- 
roller/trunk/app/src/main/java/org/apache/roller/weblogger/business/jpa/JPABookmarkManagerImpl.java
 (original)
+++ 
roller/trunk/app/src/main/java/org/apache/roller/weblogger/business/jpa/JPABookmarkManagerImpl.java
 Tue Apr  1 01:32:35 2014
@@ -25,6 +25,7 @@ import javax.persistence.Query;
 
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
+import org.apache.roller.util.RollerConstants;
 import org.apache.roller.weblogger.WebloggerException;
 import org.apache.roller.weblogger.business.BookmarkManager;
 import org.apache.roller.weblogger.business.Weblogger;
@@ -172,17 +173,19 @@ public class JPABookmarkManagerImpl impl
         
         // better to truncate imported OPML fields than to fail import or drop 
whole bookmark
         // TODO: add way to notify user that fields were truncated
-        if (title != null && title.length() > 254) {
-            title = title.substring(0,  254);
+        int maxLength = RollerConstants.TEXTWIDTH_255;
+
+        if (title != null && title.length() > maxLength) {
+            title = title.substring(0,  maxLength);
         }
-        if (desc != null && desc.length() > 254) {
-            desc = desc.substring(0, 254);
+        if (desc != null && desc.length() > maxLength) {
+            desc = desc.substring(0, maxLength);
         }
-        if (url != null && url.length() > 254) {
-            url = url.substring(0, 254);
+        if (url != null && url.length() > maxLength) {
+            url = url.substring(0, maxLength);
         }
-        if (xmlUrl != null && xmlUrl.length() > 254) {
-            xmlUrl = xmlUrl.substring(0, 254);
+        if (xmlUrl != null && xmlUrl.length() > maxLength) {
+            xmlUrl = xmlUrl.substring(0, maxLength);
         }
 
         if (elem.getChildren().size()==0) {

Modified: 
roller/trunk/app/src/main/java/org/apache/roller/weblogger/pojos/WeblogEntry.java
URL: 
http://svn.apache.org/viewvc/roller/trunk/app/src/main/java/org/apache/roller/weblogger/pojos/WeblogEntry.java?rev=1583506&r1=1583505&r2=1583506&view=diff
==============================================================================
--- 
roller/trunk/app/src/main/java/org/apache/roller/weblogger/pojos/WeblogEntry.java
 (original)
+++ 
roller/trunk/app/src/main/java/org/apache/roller/weblogger/pojos/WeblogEntry.java
 Tue Apr  1 01:32:35 2014
@@ -43,6 +43,7 @@ import org.apache.commons.lang3.builder.
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.roller.util.DateUtil;
+import org.apache.roller.util.RollerConstants;
 import org.apache.roller.util.UUIDGenerator;
 import org.apache.roller.weblogger.WebloggerException;
 import org.apache.roller.weblogger.business.UserManager;
@@ -804,7 +805,7 @@ public class WeblogEntry implements Seri
      */
     public String getDisplayTitle() {
         if ( getTitle()==null || getTitle().trim().equals("") ) {
-            return StringUtils.left(Utilities.removeHTML(getText()),255);
+            return StringUtils.left(Utilities.removeHTML(getText()), 
RollerConstants.TEXTWIDTH_255);
         }
         return Utilities.removeHTML(getTitle());
     }

Modified: 
roller/trunk/app/src/main/java/org/apache/roller/weblogger/pojos/WeblogReferrer.java
URL: 
http://svn.apache.org/viewvc/roller/trunk/app/src/main/java/org/apache/roller/weblogger/pojos/WeblogReferrer.java?rev=1583506&r1=1583505&r2=1583506&view=diff
==============================================================================
--- 
roller/trunk/app/src/main/java/org/apache/roller/weblogger/pojos/WeblogReferrer.java
 (original)
+++ 
roller/trunk/app/src/main/java/org/apache/roller/weblogger/pojos/WeblogReferrer.java
 Tue Apr  1 01:32:35 2014
@@ -22,6 +22,7 @@ import java.io.Serializable;
 import org.apache.commons.lang3.StringEscapeUtils;
 import org.apache.commons.lang3.builder.EqualsBuilder;
 import org.apache.commons.lang3.builder.HashCodeBuilder;
+import org.apache.roller.util.RollerConstants;
 import org.apache.roller.util.UUIDGenerator;
 
 
@@ -75,8 +76,8 @@ public class WeblogReferrer implements S
         this.dayHits = dayHits;
         this.totalHits = totalHits;
 
-        if (this.refererUrl != null && this.refererUrl.length() > 255) {
-            this.refererUrl = this.refererUrl.substring(0, 254);
+        if (this.refererUrl != null && this.refererUrl.length() > 
RollerConstants.TEXTWIDTH_255) {
+            this.refererUrl = this.refererUrl.substring(0, 
RollerConstants.TEXTWIDTH_255);
         }
     }
     
@@ -135,8 +136,8 @@ public class WeblogReferrer implements S
     }
     
     public void setRefererUrl(String refererUrl) {
-        if (refererUrl != null && refererUrl.length() > 255) {
-            refererUrl = refererUrl.substring(0, 255);
+        if (refererUrl != null && refererUrl.length() > 
RollerConstants.TEXTWIDTH_255) {
+            refererUrl = refererUrl.substring(0, 
RollerConstants.TEXTWIDTH_255);
         }
         this.refererUrl = refererUrl;
     }

Modified: 
roller/trunk/app/src/main/java/org/apache/roller/weblogger/ui/core/filters/SchemeEnforcementFilter.java
URL: 
http://svn.apache.org/viewvc/roller/trunk/app/src/main/java/org/apache/roller/weblogger/ui/core/filters/SchemeEnforcementFilter.java?rev=1583506&r1=1583505&r2=1583506&view=diff
==============================================================================
--- 
roller/trunk/app/src/main/java/org/apache/roller/weblogger/ui/core/filters/SchemeEnforcementFilter.java
 (original)
+++ 
roller/trunk/app/src/main/java/org/apache/roller/weblogger/ui/core/filters/SchemeEnforcementFilter.java
 Tue Apr  1 01:32:35 2014
@@ -24,7 +24,6 @@
 package org.apache.roller.weblogger.ui.core.filters;
 
 import java.io.IOException;
-import java.util.Arrays;
 import java.util.Collections;
 import java.util.HashSet;
 import java.util.Set;

Modified: 
roller/trunk/app/src/main/java/org/apache/roller/weblogger/ui/core/security/RollerUserDetailsService.java
URL: 
http://svn.apache.org/viewvc/roller/trunk/app/src/main/java/org/apache/roller/weblogger/ui/core/security/RollerUserDetailsService.java?rev=1583506&r1=1583505&r2=1583506&view=diff
==============================================================================
--- 
roller/trunk/app/src/main/java/org/apache/roller/weblogger/ui/core/security/RollerUserDetailsService.java
 (original)
+++ 
roller/trunk/app/src/main/java/org/apache/roller/weblogger/ui/core/security/RollerUserDetailsService.java
 Tue Apr  1 01:32:35 2014
@@ -14,7 +14,6 @@ import org.apache.roller.weblogger.busin
 import org.apache.roller.weblogger.business.UserManager;
 import org.apache.roller.weblogger.pojos.User;
 import org.apache.roller.weblogger.pojos.UserAttribute;
-import org.springframework.dao.DataAccessException;
 import org.springframework.dao.DataAccessResourceFailureException;
 import org.springframework.dao.DataRetrievalFailureException;
 

Modified: 
roller/trunk/app/src/main/java/org/apache/roller/weblogger/ui/rendering/pagers/MediaFilesPager.java
URL: 
http://svn.apache.org/viewvc/roller/trunk/app/src/main/java/org/apache/roller/weblogger/ui/rendering/pagers/MediaFilesPager.java?rev=1583506&r1=1583505&r2=1583506&view=diff
==============================================================================
--- 
roller/trunk/app/src/main/java/org/apache/roller/weblogger/ui/rendering/pagers/MediaFilesPager.java
 (original)
+++ 
roller/trunk/app/src/main/java/org/apache/roller/weblogger/ui/rendering/pagers/MediaFilesPager.java
 Tue Apr  1 01:32:35 2014
@@ -29,7 +29,6 @@ import org.apache.roller.weblogger.busin
 import org.apache.roller.weblogger.business.URLStrategy;
 import org.apache.roller.weblogger.business.WebloggerFactory;
 import org.apache.roller.weblogger.pojos.MediaFile;
-import org.apache.roller.weblogger.pojos.Weblog;
 
 
 /**

Modified: 
roller/trunk/app/src/main/java/org/apache/roller/weblogger/ui/rendering/servlets/TrackbackServlet.java
URL: 
http://svn.apache.org/viewvc/roller/trunk/app/src/main/java/org/apache/roller/weblogger/ui/rendering/servlets/TrackbackServlet.java?rev=1583506&r1=1583505&r2=1583506&view=diff
==============================================================================
--- 
roller/trunk/app/src/main/java/org/apache/roller/weblogger/ui/rendering/servlets/TrackbackServlet.java
 (original)
+++ 
roller/trunk/app/src/main/java/org/apache/roller/weblogger/ui/rendering/servlets/TrackbackServlet.java
 Tue Apr  1 01:32:35 2014
@@ -110,8 +110,9 @@ public class TrackbackServlet extends Ht
                 
                 if (trackbackRequest.getExcerpt() == null) {
                     trackbackRequest.setExcerpt("");
-                } else if (trackbackRequest.getExcerpt().length() >= 255) {
-                    
trackbackRequest.setExcerpt(trackbackRequest.getExcerpt().substring(0, 
252)+"...");
+                } else if (trackbackRequest.getExcerpt().length() >= 
RollerConstants.TEXTWIDTH_255) {
+                    
trackbackRequest.setExcerpt(trackbackRequest.getExcerpt().substring(0,
+                            RollerConstants.TEXTWIDTH_255 - 3)+"...");
                 }
                 
                 // lookup weblog specified by comment request

Modified: 
roller/trunk/app/src/main/java/org/apache/roller/weblogger/ui/rendering/util/cache/PlanetCache.java
URL: 
http://svn.apache.org/viewvc/roller/trunk/app/src/main/java/org/apache/roller/weblogger/ui/rendering/util/cache/PlanetCache.java?rev=1583506&r1=1583505&r2=1583506&view=diff
==============================================================================
--- 
roller/trunk/app/src/main/java/org/apache/roller/weblogger/ui/rendering/util/cache/PlanetCache.java
 (original)
+++ 
roller/trunk/app/src/main/java/org/apache/roller/weblogger/ui/rendering/util/cache/PlanetCache.java
 Tue Apr  1 01:32:35 2014
@@ -160,8 +160,8 @@ public final class PlanetCache {
         // still null, we need to get a fresh value
         if(lastModified == null) {
             
-            // TODO: get last updated for planet
-            lastModified = null; // 
WebloggerFactory.getWeblogger().getWeblogManager().getLastUpdated();
+            // TODO: create a WeblogManager.getLastUpdated() method to use 
below
+            lastModified = null;
             
             if (lastModified == null) {
                 lastModified = new Date();

Modified: 
roller/trunk/app/src/main/java/org/apache/roller/weblogger/ui/rendering/velocity/RollerVelocity.java
URL: 
http://svn.apache.org/viewvc/roller/trunk/app/src/main/java/org/apache/roller/weblogger/ui/rendering/velocity/RollerVelocity.java?rev=1583506&r1=1583505&r2=1583506&view=diff
==============================================================================
--- 
roller/trunk/app/src/main/java/org/apache/roller/weblogger/ui/rendering/velocity/RollerVelocity.java
 (original)
+++ 
roller/trunk/app/src/main/java/org/apache/roller/weblogger/ui/rendering/velocity/RollerVelocity.java
 Tue Apr  1 01:32:35 2014
@@ -28,8 +28,6 @@ import org.apache.roller.weblogger.ui.co
 import org.apache.roller.weblogger.ui.rendering.mobile.MobileDeviceRepository;
 import org.apache.velocity.Template;
 import org.apache.velocity.app.VelocityEngine;
-import org.apache.velocity.exception.ParseErrorException;
-import org.apache.velocity.exception.ResourceNotFoundException;
 
 
 /**
@@ -97,7 +95,8 @@ public class RollerVelocity {
     
     /**
      * Convenience static method for looking up a template.
-     * @throws ResourceNotFoundException, ParseErrorException
+     * @throws org.apache.velocity.exception.ResourceNotFoundException,
+     *       org.apache.velocity.exception.ParseErrorException
      */
     public static Template getTemplate(String name) {
         return velocityEngine.getTemplate(name + "|standard");
@@ -105,7 +104,8 @@ public class RollerVelocity {
 
     /**
      * Convenience static method for looking up a template.
-     * @throws ResourceNotFoundException, ParseErrorException
+     * @throws org.apache.velocity.exception.ResourceNotFoundException,
+     *       org.apache.velocity.exception.ParseErrorException
      */
     public static Template getTemplate(String name, 
                        MobileDeviceRepository.DeviceType deviceType) {
@@ -114,7 +114,8 @@ public class RollerVelocity {
     
     /**
      * Convenience static method for looking up a template.
-     * @throws ResourceNotFoundException, ParseErrorException
+     * @throws org.apache.velocity.exception.ResourceNotFoundException,
+     *       org.apache.velocity.exception.ParseErrorException
      */
     public static Template getTemplate(String name, String encoding) {
         return velocityEngine.getTemplate(name + "|standard", encoding);
@@ -122,7 +123,8 @@ public class RollerVelocity {
        
     /**
      * Convenience static method for looking up a template.
-     * @throws ResourceNotFoundException, ParseErrorException
+     * @throws org.apache.velocity.exception.ResourceNotFoundException,
+     *       org.apache.velocity.exception.ParseErrorException
      */
     public static Template getTemplate(String name, 
                        MobileDeviceRepository.DeviceType deviceType, String 
encoding) {

Modified: 
roller/trunk/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/Entries.java
URL: 
http://svn.apache.org/viewvc/roller/trunk/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/Entries.java?rev=1583506&r1=1583505&r2=1583506&view=diff
==============================================================================
--- 
roller/trunk/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/Entries.java
 (original)
+++ 
roller/trunk/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/Entries.java
 Tue Apr  1 01:32:35 2014
@@ -20,7 +20,6 @@ package org.apache.roller.weblogger.ui.s
 
 import java.util.ArrayList;
 import java.util.Collections;
-import java.util.Date;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;

Modified: 
roller/trunk/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/Templates.java
URL: 
http://svn.apache.org/viewvc/roller/trunk/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/Templates.java?rev=1583506&r1=1583505&r2=1583506&view=diff
==============================================================================
--- 
roller/trunk/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/Templates.java
 (original)
+++ 
roller/trunk/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/Templates.java
 Tue Apr  1 01:32:35 2014
@@ -21,6 +21,7 @@ package org.apache.roller.weblogger.ui.s
 import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
+import org.apache.roller.util.RollerConstants;
 import org.apache.roller.weblogger.WebloggerException;
 import org.apache.roller.weblogger.business.WebloggerFactory;
 import org.apache.roller.weblogger.pojos.WeblogPermission;
@@ -222,7 +223,7 @@ public class Templates extends UIAction 
                // make sure name is non-null and within proper size
                if (StringUtils.isEmpty(getNewTmplName())) {
                        addError("Template.error.nameNull");
-               } else if (getNewTmplName().length() > 255) {
+               } else if (getNewTmplName().length() > 
RollerConstants.TEXTWIDTH_255) {
                        addError("Template.error.nameSize");
                }
 

Modified: 
roller/trunk/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/WeblogExport.java
URL: 
http://svn.apache.org/viewvc/roller/trunk/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/WeblogExport.java?rev=1583506&r1=1583505&r2=1583506&view=diff
==============================================================================
--- 
roller/trunk/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/WeblogExport.java
 (original)
+++ 
roller/trunk/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/WeblogExport.java
 Tue Apr  1 01:32:35 2014
@@ -22,7 +22,6 @@ import java.io.InputStream;
 import java.text.SimpleDateFormat;
 import java.util.ArrayList;
 import java.util.Collections;
-import java.util.Date;
 import java.util.List;
 import java.util.Map;
 import java.util.LinkedHashMap;

Modified: 
roller/trunk/app/src/main/java/org/apache/roller/weblogger/util/HTMLSanitizer.java
URL: 
http://svn.apache.org/viewvc/roller/trunk/app/src/main/java/org/apache/roller/weblogger/util/HTMLSanitizer.java?rev=1583506&r1=1583505&r2=1583506&view=diff
==============================================================================
--- 
roller/trunk/app/src/main/java/org/apache/roller/weblogger/util/HTMLSanitizer.java
 (original)
+++ 
roller/trunk/app/src/main/java/org/apache/roller/weblogger/util/HTMLSanitizer.java
 Tue Apr  1 01:32:35 2014
@@ -1,6 +1,6 @@
 /*
  * Licensed to the Apache Software Foundation (ASF) under one or more
- *  contributor license agreements.  The ASF licenses this file to You
+ * contributor license agreements.  The ASF licenses this file to You
  * under the Apache License, Version 2.0 (the "License"); you may not
  * use this file except in compliance with the License.
  * You may obtain a copy of the License at
@@ -17,26 +17,26 @@
  */
 
 /**
-Copyright (c) 2009 Open Lab, http://www.open-lab.com/
-Permission is hereby granted, free of charge, to any person obtaining
-a copy of this software and associated documentation files (the
-"Software"), to deal in the Software without restriction, including
-without limitation the rights to use, copy, modify, merge, publish,
-distribute, sublicense, and/or sell copies of the Software, and to
-permit persons to whom the Software is furnished to do so, subject to
-the following conditions:
-
-The above copyright notice and this permission notice shall be
-included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
+ Copyright (c) 2009 Open Lab, http://www.open-lab.com/
+ Permission is hereby granted, free of charge, to any person obtaining
+ a copy of this software and associated documentation files (the
+ "Software"), to deal in the Software without restriction, including
+ without limitation the rights to use, copy, modify, merge, publish,
+ distribute, sublicense, and/or sell copies of the Software, and to
+ permit persons to whom the Software is furnished to do so, subject to
+ the following conditions:
+
+ The above copyright notice and this permission notice shall be
+ included in all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
 
 package org.apache.roller.weblogger.util;
 
@@ -45,23 +45,24 @@ import java.util.List;
 import java.util.Stack;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
+
 import org.apache.commons.validator.UrlValidator;
 import org.apache.roller.weblogger.config.WebloggerConfig;
 
 public class HTMLSanitizer {
-       public static Boolean xssEnabled = 
WebloggerConfig.getBooleanProperty("weblogAdminsUntrusted", Boolean.FALSE);  
+    public static Boolean xssEnabled = 
WebloggerConfig.getBooleanProperty("weblogAdminsUntrusted", Boolean.FALSE);
 
-       public static Pattern forbiddenTags = 
Pattern.compile("^(script|object|embed|link|style|form|input)$");
-       public static Pattern allowedTags = 
Pattern.compile("^(b|p|i|s|a|img|table|thead|tbody|tfoot|tr|th|td|dd|dl|dt|em|h1|h2|h3|h4|h5|h6|li|ul|ol|span|div|strike|strong|"
-                       + 
"sub|sup|pre|del|code|blockquote|strike|kbd|br|hr|area|map|object|embed|param|link|form|small|big)$");
+    public static Pattern forbiddenTags = 
Pattern.compile("^(script|object|embed|link|style|form|input)$");
+    public static Pattern allowedTags = 
Pattern.compile("^(b|p|i|s|a|img|table|thead|tbody|tfoot|tr|th|td|dd|dl|dt|em|h1|h2|h3|h4|h5|h6|li|ul|ol|span|div|strike|strong|"
+            + 
"sub|sup|pre|del|code|blockquote|strike|kbd|br|hr|area|map|object|embed|param|link|form|small|big)$");
     // <!--.........>
     private static Pattern commentPattern = Pattern.compile("<!--.*");
     // <tag ....props.....>
     private static Pattern tagStartPattern = 
Pattern.compile("<(?i)(\\w+\\b)\\s*(.*)/?>$");
     // </tag .........>
     private static Pattern tagClosePattern = 
Pattern.compile("</(?i)(\\w+\\b)\\s*>$");
-       private static Pattern standAloneTags = 
Pattern.compile("^(img|br|hr)$");
-       private static Pattern selfClosed = Pattern.compile("<.+/>");
+    private static Pattern standAloneTags = Pattern.compile("^(img|br|hr)$");
+    private static Pattern selfClosed = Pattern.compile("<.+/>");
     // prop="...."
     private static Pattern attributesPattern = 
Pattern.compile("(\\w*)\\s*=\\s*\"([^\"]*)\"");
     // color:red;
@@ -71,453 +72,458 @@ public class HTMLSanitizer {
     // expression(....)"   thanks to Ben Summer
     private static Pattern forbiddenStylePattern = 
Pattern.compile("(?:(expression|eval|javascript))\\s*\\(");
 
-       /**
-        *  This method should be used to test input.
-        *
-        * @param html
-        * @return true if the input is "valid"
-        */
-       public static boolean isSanitized(String html) {
-               return sanitizer(html).isValid;
-       }
-
-       /**
-        * Used to clean every html before to output it in any html page
-        *
-        * @param html
-        * @return sanitized html
-        */
-       public static String sanitize(String html) {
-               return sanitizer(html).html;
-       }
-
-       public static String conditionallySanitize(String ret) {
-               // if XSS is enabled then sanitize HTML
-               if (xssEnabled && ret != null) {
-                       ret = HTMLSanitizer.sanitize(ret);
-               }
-               return ret;
-       }
-
-       /**
-        * Used to get the text,  tags removed or encoded
-        *
-        * @param html
-        * @return sanitized text
-        */
-       public static String getText(String html) {
-               return sanitizer(html).text;
-       }
-
-       /**
-        * This is the main method of sanitizing. It will be used both for 
validation and cleaning
-        *
-        * @param html
-        * @return a SanitizeResult object
-        */
-       public static SanitizeResult sanitizer(String html) {
-               return sanitizer(html, allowedTags, forbiddenTags);
-       }
-
-       public static SanitizeResult sanitizer(String html, Pattern 
allowedTags, Pattern forbiddenTags) {
-               SanitizeResult ret = new SanitizeResult();
-               Stack<String> openTags = new Stack<String>();
-
-
-               List<String> tokens = tokenize(html);
-
-               // -------------------   LOOP for every token 
--------------------------
-               for (String token : tokens) {
-                       boolean isAcceptedToken = false;
-
-                       Matcher startMatcher = tagStartPattern.matcher(token);
-                       Matcher endMatcher = tagClosePattern.matcher(token);
-
-
-                       
//--------------------------------------------------------------------------------
  COMMENT    <!-- ......... -->
-                       if (commentPattern.matcher(token).find()) {
-                               ret.val = ret.val + token + 
(token.endsWith("-->") ? "" : "-->");
-                               ret.invalidTags.add(token + 
(token.endsWith("-->") ? "" : "-->"));
-                               continue;
-
-
-                               
//--------------------------------------------------------------------------------
  OPEN TAG    <tag .........>
-                       } else if (startMatcher.find()) {
-
-                               //tag name extraction
-                               String tag = 
startMatcher.group(1).toLowerCase();
-
-
-                               
//-----------------------------------------------------  FORBIDDEN TAG   
<script .........>
-                               if (forbiddenTags.matcher(tag).find()) {
-                                       ret.invalidTags.add("<" + tag + ">");
-                                       continue;
-
-
-                                       // 
--------------------------------------------------  WELL KNOWN TAG
-                               } else if (allowedTags.matcher(tag).find()) {
-
-
-                                       String cleanToken = "<" + tag;
-                                       String tokenBody = 
startMatcher.group(2);
-
-
-                                       //first test table consistency
-                                       //table tbody tfoot thead th tr td
-                                       if ("thead".equals(tag) || 
"tbody".equals(tag) || "tfoot".equals(tag) || "tr".equals(tag)) {
-                                               if (openTags.search("table") < 
1) {
-                                                       ret.invalidTags.add("<" 
+ tag + ">");
-                                                       continue;
-                                               }
-                                       } else if (("td".equals(tag) || 
"th".equals(tag)) && openTags.search("tr") < 1) {
+    /**
+     * This method should be used to test input.
+     *
+     * @param html
+     * @return true if the input is "valid"
+     */
+    public static boolean isSanitized(String html) {
+        return sanitizer(html).isValid;
+    }
+
+    /**
+     * Used to clean every html before to output it in any html page
+     *
+     * @param html
+     * @return sanitized html
+     */
+    public static String sanitize(String html) {
+        return sanitizer(html).html;
+    }
+
+    public static String conditionallySanitize(String ret) {
+        // if XSS is enabled then sanitize HTML
+        if (xssEnabled && ret != null) {
+            ret = HTMLSanitizer.sanitize(ret);
+        }
+        return ret;
+    }
+
+    /**
+     * Used to get the text,  tags removed or encoded
+     *
+     * @param html
+     * @return sanitized text
+     */
+    public static String getText(String html) {
+        return sanitizer(html).text;
+    }
+
+    /**
+     * This is the main method of sanitizing. It will be used both for 
validation and cleaning
+     *
+     * @param html
+     * @return a SanitizeResult object
+     */
+    public static SanitizeResult sanitizer(String html) {
+        return sanitizer(html, allowedTags, forbiddenTags);
+    }
+
+    public static SanitizeResult sanitizer(String html, Pattern allowedTags, 
Pattern forbiddenTags) {
+        SanitizeResult ret = new SanitizeResult();
+        Stack<String> openTags = new Stack<String>();
+
+
+        List<String> tokens = tokenize(html);
+
+        // -------------------   LOOP for every token 
--------------------------
+        for (String token : tokens) {
+            boolean isAcceptedToken = false;
+
+            Matcher startMatcher = tagStartPattern.matcher(token);
+            Matcher endMatcher = tagClosePattern.matcher(token);
+
+
+            
//--------------------------------------------------------------------------------
  COMMENT    <!-- ......... -->
+            if (commentPattern.matcher(token).find()) {
+                ret.val = ret.val + token + (token.endsWith("-->") ? "" : 
"-->");
+                ret.invalidTags.add(token + (token.endsWith("-->") ? "" : 
"-->"));
+                continue;
+
+
+                
//--------------------------------------------------------------------------------
  OPEN TAG    <tag .........>
+            } else if (startMatcher.find()) {
+
+                //tag name extraction
+                String tag = startMatcher.group(1).toLowerCase();
+
+
+                //-----------------------------------------------------  
FORBIDDEN TAG   <script .........>
+                if (forbiddenTags.matcher(tag).find()) {
+                    ret.invalidTags.add("<" + tag + ">");
+                    continue;
+
+
+                    // --------------------------------------------------  
WELL KNOWN TAG
+                } else if (allowedTags.matcher(tag).find()) {
+
+
+                    String cleanToken = "<" + tag;
+                    String tokenBody = startMatcher.group(2);
+
+
+                    //first test table consistency
+                    //table tbody tfoot thead th tr td
+                    if ("thead".equals(tag) || "tbody".equals(tag) || 
"tfoot".equals(tag) || "tr".equals(tag)) {
+                        if (openTags.search("table") < 1) {
+                            ret.invalidTags.add("<" + tag + ">");
+                            continue;
+                        }
+                    } else if (("td".equals(tag) || "th".equals(tag)) && 
openTags.search("tr") < 1) {
                         ret.invalidTags.add("<" + tag + ">");
                         continue;
-                                       }
-
+                    }
 
-                                       // then test properties
-                                       Matcher attributes = 
attributesPattern.matcher(tokenBody);
 
-                                       boolean foundURL = false; // URL flag
-                                       while (attributes.find()) {
+                    // then test properties
+                    Matcher attributes = attributesPattern.matcher(tokenBody);
 
-                                               String attr = 
attributes.group(1).toLowerCase();
-                                               String val = 
attributes.group(2);
-
-                                               // we will accept href in case 
of <A>
-                                               if ("a".equals(tag) && 
"href".equals(attr)) {    // <a href="......">
-                                                       String[] customSchemes 
= {"http", "https"};
-                                                       if (new 
UrlValidator(customSchemes).isValid(val)) {
-                                                               foundURL = true;
-                                                       } else {
-                                                               // may be it is 
a mailto?
-                                                               //  case <a 
href="mailto:[email protected]?subject=....";
-                                                               if 
(val.toLowerCase().startsWith("mailto:";) && val.indexOf('@') >= 0) {
-                                                                       String 
val1 = "http://www."; + val.substring(val.indexOf('@') + 1);
-                                                                       if (new 
UrlValidator(customSchemes).isValid(val1)) {
-                                                                               
foundURL = true;
-                                                                       } else {
-                                                                               
ret.invalidTags.add(attr + " " + val);
-                                                                               
val = "";
-                                                                       }
-                                                               } else {
-                                                                       
ret.invalidTags.add(attr + " " + val);
-                                                                       val = 
"";
-                                                               }
-                                                       }
-
-                                               } else if 
(tag.matches("img|embed") && "src".equals(attr)) { // <img src="......">
-                                                       String[] customSchemes 
= {"http", "https"};
-                                                       if (new 
UrlValidator(customSchemes).isValid(val)) {
-                                                               foundURL = true;
-                                                       } else {
-                                                               
ret.invalidTags.add(attr + " " + val);
-                                                               val = "";
-                                                       }
-
-                                               } else if ("href".equals(attr) 
|| "src".equals(attr)) { // <tag src/href="......">   skipped
-                                                       ret.invalidTags.add(tag 
+ " " + attr + " " + val);
-                                                       continue;
-
-
-                                               } else if 
(attr.matches("width|height")) { // <tag width/height="......">
-                                                       if 
(!val.toLowerCase().matches("\\d+%|\\d+$")) { // test numeric values
-                                                               
ret.invalidTags.add(tag + " " + attr + " " + val);
-                                                               continue;
-                                                       }
-
-                                               } else if 
("style".equals(attr)) { // <tag style="......">
-
-
-                                                       // then test properties
-                                                       Matcher styles = 
stylePattern.matcher(val);
-                                                       String cleanStyle = "";
-
-                                                       while (styles.find()) {
-                                                               String 
styleName = styles.group(1).toLowerCase();
-                                                               String 
styleValue = styles.group(2);
-
-                                                               // suppress 
invalid styles values
-                                                               if 
(forbiddenStylePattern.matcher(styleValue).find()) {
-                                                                       
ret.invalidTags.add(tag + " " + attr + " " + styleValue);
-                                                                       
continue;
-                                                               }
-
-                                                               // check if 
valid url
-                                                               Matcher 
urlStyleMatcher = urlStylePattern.matcher(styleValue);
-                                                               if 
(urlStyleMatcher.find()) {
-                                                                       
String[] customSchemes = {"http", "https"};
-                                                                       String 
url = urlStyleMatcher.group(1);
-                                                                       if 
(!new UrlValidator(customSchemes).isValid(url)) {
-                                                                               
ret.invalidTags.add(tag + " " + attr + " " + styleValue);
-                                                                               
continue;
-                                                                       }
-                                                               }
-
-                                                               cleanStyle = 
cleanStyle + styleName + ":" + encode(styleValue) + ";";
-
-                                                       }
-                                                       val = cleanStyle;
-
-                                               } else if 
(attr.startsWith("on")) {  // skip all javascript events
-                                                       ret.invalidTags.add(tag 
+ " " + attr + " " + val);
-                                                       continue;
-
-                                               } else {  // by default encode 
all properies
-                                                       val = encode(val);
-                                               }
-
-                                               cleanToken = cleanToken + " " + 
attr + "=\"" + val + "\"";
-                                       }
-                                       cleanToken = cleanToken + ">";
-
-                                       isAcceptedToken = true;
-
-                                       // for <img> and <a>
-                                       if (tag.matches("a|img|embed") && 
!foundURL) {
-                                               isAcceptedToken = false;
-                                               cleanToken = "";
-                                       }
-
-                                       token = cleanToken;
-
-
-                                       // push the tag if require closure and 
it is accepted (otherwirse is encoded)
-                                       if (isAcceptedToken && 
!(standAloneTags.matcher(tag).find() || selfClosed.matcher(tag).find())) {
-                                               openTags.push(tag);
-                                       }
-
-                                       // 
--------------------------------------------------------------------------------
  UNKNOWN TAG
-                               } else {
-                                       ret.invalidTags.add(token);
-                                       ret.val = ret.val + token;
-                                       continue;
-
-
-                               }
-
-                               // 
--------------------------------------------------------------------------------
  CLOSE TAG </tag>
-                       } else if (endMatcher.find()) {
-                               String tag = endMatcher.group(1).toLowerCase();
-
-                               //is self closing
-                               if (selfClosed.matcher(tag).find()) {
-                                       ret.invalidTags.add(token);
-                                       continue;
-                               }
-                               if (forbiddenTags.matcher(tag).find()) {
-                                       ret.invalidTags.add("/" + tag);
-                                       continue;
-                               }
-                               if (!allowedTags.matcher(tag).find()) {
-                                       ret.invalidTags.add(token);
-                                       ret.val = ret.val + token;
-                                       continue;
-                               } else {
-
-
-                                       String cleanToken = "";
-
-                                       // check tag position in the stack
-                                       int pos = openTags.search(tag);
-                                       // if found on top ok
-                                       for (int i = 1; i <= pos; i++) {
-                                               //pop all elements before tag 
and close it
-                                               String poppedTag = 
openTags.pop();
-                                               cleanToken = cleanToken + "</" 
+ poppedTag + ">";
-                                               isAcceptedToken = true;
-                                       }
-
-                                       token = cleanToken;
-                               }
-
-                       }
-
-                       ret.val = ret.val + token;
-
-                       if (isAcceptedToken) {
-                               ret.html = ret.html + token;
-                               //ret.text = ret.text + " ";
-                       } else {
-                               String sanToken = 
htmlEncodeApexesAndTags(token);
-                               ret.html = ret.html + sanToken;
-                               ret.text = ret.text + 
htmlEncodeApexesAndTags(removeLineFeed(token));
-                       }
-
-
-               }
-
-               // must close remaining tags
-               while (openTags.size() > 0) {
-                       //pop all elements before tag and close it
-                       String poppedTag = openTags.pop();
-                       ret.html = ret.html + "</" + poppedTag + ">";
-                       ret.val = ret.val + "</" + poppedTag + ">";
-               }
-
-               //set boolean value
-               ret.isValid = ret.invalidTags.size() == 0;
-
-               return ret;
-       }
-
-       /**
-        * Splits html tag and tag content <......>.
-        *
-        * @param html
-        * @return a list of token
-        */
-       private static List<String> tokenize(String html) {
-               ArrayList tokens = new ArrayList();
-               int pos = 0;
-               String token = "";
-               int len = html.length();
-               while (pos < len) {
-                       char c = html.charAt(pos);
-
-                       String ahead = html.substring(pos, pos > len - 4 ? len 
: pos + 4);
-
-                       //a comment is starting
-                       if ("<!--".equals(ahead)) {
-                               //store the current token
-                               if (token.length() > 0) {
-                                       tokens.add(token);
-                               }
-
-                               //clear the token
-                               token = "";
-
-                               // serch the end of <......>
-                               int end = moveToMarkerEnd(pos, "-->", html);
-                               tokens.add(html.substring(pos, end));
-                               pos = end;
-
-
-                               // a new "<" token is starting
-                       } else if ('<' == c) {
-
-                               //store the current token
-                               if (token.length() > 0) {
-                                       tokens.add(token);
-                               }
-
-                               //clear the token
-                               token = "";
-
-                               // serch the end of <......>
-                               int end = moveToMarkerEnd(pos, ">", html);
-                               tokens.add(html.substring(pos, end));
-                               pos = end;
-
-                       } else {
-                               token = token + c;
-                               pos++;
-                       }
-
-               }
-
-               //store the last token
-               if (token.length() > 0) {
-                       tokens.add(token);
-               }
-
-               return tokens;
-       }
-
-       private static int moveToMarkerEnd(int pos, String marker, String s) {
-               int i = s.indexOf(marker, pos);
-               if (i > -1) {
-                       pos = i + marker.length();
-               } else {
-                       pos = s.length();
-               }
-               return pos;
-       }
-
-       /**
-        * Contains the sanitizing results.
-        * html is the sanitized html encoded  ready to be printed. Unaccepted 
tag are encode, text inside tag is always encoded    MUST BE USED WHEN PRINTING 
HTML
-        * text is the text inside valid tags. Contains invalid tags encoded    
                                                    SHOULD BE USED TO PRINT 
EXCERPTS
-        * val  is the html source cleaned from unaccepted tags. It is not 
encoded:                                                 SHOULD BE USED IN SAVE 
ACTIONS
-        * isValid is true when every tag is accepted without forcing encoding
-        * invalidTags is the list of encoded-killed tags
-        */
-       static class SanitizeResult {
-
-               public String html = "";
-               public String text = "";
-               public String val = "";
-               public boolean isValid = true;
-               public List<String> invalidTags = new ArrayList();
-       }
-
-       public static String encode(String s) {
-               return convertLineFeedToBR(htmlEncodeApexesAndTags(s == null ? 
"" : s));
-       }
-
-       public static final String htmlEncodeApexesAndTags(String source) {
-               return htmlEncodeTag(htmlEncodeApexes(source));
-       }
-
-       public static final String htmlEncodeApexes(String source) {
-               if (source != null) {
-                       String result = replaceAllNoRegex(source, new 
String[]{"\"", "'"}, new String[]{"&quot;", "&#39;"});
-                       return result;
-               } else {
-                       return null;
-               }
-       }
-
-       public static final String htmlEncodeTag(String source) {
-               if (source != null) {
-                       String result = replaceAllNoRegex(source, new 
String[]{"<", ">"}, new String[]{"&lt;", "&gt;"});
-                       return result;
-               } else {
-                       return null;
-               }
-       }
-
-       public static String convertLineFeedToBR(String text) {
-               if (text != null) {
-                       return replaceAllNoRegex(text, new String[]{"\n", "\f", 
"\r"}, new String[]{"<br>", "<br>", " "});
-               } else {
-                       return null;
-               }
-       }
-
-       public static String removeLineFeed(String text) {
-
-               if (text != null) {
-                       return replaceAllNoRegex(text, new String[]{"\n", "\f", 
"\r"}, new String[]{" ", " ", " "});
-               } else {
-                       return null;
-               }
-       }
-
-       public static final String replaceAllNoRegex(String source, String 
searches[], String replaces[]) {
-               int k;
-               String tmp = source;
-               for (k = 0; k < searches.length; k++) {
-                       tmp = replaceAllNoRegex(tmp, searches[k], replaces[k]);
-               }
-               return tmp;
-       }
-
-       public static final String replaceAllNoRegex(String source, String 
search, String replace) {
-               StringBuilder buffer = new StringBuilder();
-               if (source != null) {
-                       if (search.length() == 0) {
-                               return source;
-                       }
-                       int oldPos, pos;
-                       for (oldPos = 0, pos = source.indexOf(search, oldPos); 
pos != -1; oldPos = pos + search.length(), pos = source.indexOf(search, 
oldPos)) {
-                               buffer.append(source.substring(oldPos, pos));
-                               buffer.append(replace);
-                       }
-                       if (oldPos < source.length()) {
-                               buffer.append(source.substring(oldPos));
-                       }
-               }
-               return new String(buffer);
-       }
+                    // URL flag
+                    boolean foundURL = false;
+                    while (attributes.find()) {
+
+                        String attr = attributes.group(1).toLowerCase();
+                        String val = attributes.group(2);
+
+                        // we will accept href in case of <A>
+                        // <a href="......">
+                        if ("a".equals(tag) && "href".equals(attr)) {
+                            String[] customSchemes = {"http", "https"};
+                            if (new UrlValidator(customSchemes).isValid(val)) {
+                                foundURL = true;
+                            } else {
+                                // may be it is a mailto?
+                                // case <a 
href="mailto:[email protected]?subject=....";
+                                if (val.toLowerCase().startsWith("mailto:";) && 
val.indexOf('@') >= 0) {
+                                    String val1 = "http://www."; + 
val.substring(val.indexOf('@') + 1);
+                                    if (new 
UrlValidator(customSchemes).isValid(val1)) {
+                                        foundURL = true;
+                                    } else {
+                                        ret.invalidTags.add(attr + " " + val);
+                                        val = "";
+                                    }
+                                } else {
+                                    ret.invalidTags.add(attr + " " + val);
+                                    val = "";
+                                }
+                            }
+
+                        } else if (tag.matches("img|embed") && 
"src".equals(attr)) {
+                            // <img src="......">
+                            String[] customSchemes = {"http", "https"};
+                            if (new UrlValidator(customSchemes).isValid(val)) {
+                                foundURL = true;
+                            } else {
+                                ret.invalidTags.add(attr + " " + val);
+                                val = "";
+                            }
+                        } else if ("href".equals(attr) || "src".equals(attr)) {
+                            // <tag src/href="......">   skipped
+                            ret.invalidTags.add(tag + " " + attr + " " + val);
+                            continue;
+                        } else if (attr.matches("width|height")) {
+                            // <tag width/height="......">
+                            if (!val.toLowerCase().matches("\\d+%|\\d+$")) {
+                                // test numeric values
+                                ret.invalidTags.add(tag + " " + attr + " " + 
val);
+                                continue;
+                            }
+
+                        } else if ("style".equals(attr)) {
+                            // <tag style="......">
+                            // then test properties
+                            Matcher styles = stylePattern.matcher(val);
+                            String cleanStyle = "";
+
+                            while (styles.find()) {
+                                String styleName = 
styles.group(1).toLowerCase();
+                                String styleValue = styles.group(2);
+
+                                // suppress invalid styles values
+                                if 
(forbiddenStylePattern.matcher(styleValue).find()) {
+                                    ret.invalidTags.add(tag + " " + attr + " " 
+ styleValue);
+                                    continue;
+                                }
+
+                                // check if valid url
+                                Matcher urlStyleMatcher = 
urlStylePattern.matcher(styleValue);
+                                if (urlStyleMatcher.find()) {
+                                    String[] customSchemes = {"http", "https"};
+                                    String url = urlStyleMatcher.group(1);
+                                    if (!new 
UrlValidator(customSchemes).isValid(url)) {
+                                        ret.invalidTags.add(tag + " " + attr + 
" " + styleValue);
+                                        continue;
+                                    }
+                                }
+
+                                cleanStyle = cleanStyle + styleName + ":" + 
encode(styleValue) + ";";
+
+                            }
+                            val = cleanStyle;
+
+                        } else if (attr.startsWith("on")) {
+                            // skip all javascript events
+                            ret.invalidTags.add(tag + " " + attr + " " + val);
+                            continue;
+
+                        } else {
+                            // by default encode all properties
+                            val = encode(val);
+                        }
+
+                        cleanToken = cleanToken + " " + attr + "=\"" + val + 
"\"";
+                    }
+                    cleanToken = cleanToken + ">";
+
+                    isAcceptedToken = true;
+
+                    // for <img> and <a>
+                    if (tag.matches("a|img|embed") && !foundURL) {
+                        isAcceptedToken = false;
+                        cleanToken = "";
+                    }
+
+                    token = cleanToken;
+
+
+                    // push the tag if require closure and it is accepted 
(otherwise is encoded)
+                    if (isAcceptedToken && 
!(standAloneTags.matcher(tag).find() || selfClosed.matcher(tag).find())) {
+                        openTags.push(tag);
+                    }
+
+                    // 
--------------------------------------------------------------------------------
  UNKNOWN TAG
+                } else {
+                    ret.invalidTags.add(token);
+                    ret.val = ret.val + token;
+                    continue;
+
+
+                }
+
+                // 
--------------------------------------------------------------------------------
  CLOSE TAG </tag>
+            } else if (endMatcher.find()) {
+                String tag = endMatcher.group(1).toLowerCase();
+
+                //is self closing
+                if (selfClosed.matcher(tag).find()) {
+                    ret.invalidTags.add(token);
+                    continue;
+                }
+                if (forbiddenTags.matcher(tag).find()) {
+                    ret.invalidTags.add("/" + tag);
+                    continue;
+                }
+                if (!allowedTags.matcher(tag).find()) {
+                    ret.invalidTags.add(token);
+                    ret.val = ret.val + token;
+                    continue;
+                } else {
+
+
+                    String cleanToken = "";
+
+                    // check tag position in the stack
+                    int pos = openTags.search(tag);
+                    // if found on top ok
+                    for (int i = 1; i <= pos; i++) {
+                        //pop all elements before tag and close it
+                        String poppedTag = openTags.pop();
+                        cleanToken = cleanToken + "</" + poppedTag + ">";
+                        isAcceptedToken = true;
+                    }
+
+                    token = cleanToken;
+                }
+
+            }
+
+            ret.val = ret.val + token;
+
+            if (isAcceptedToken) {
+                ret.html = ret.html + token;
+                //ret.text = ret.text + " ";
+            } else {
+                String sanToken = htmlEncodeApexesAndTags(token);
+                ret.html = ret.html + sanToken;
+                ret.text = ret.text + 
htmlEncodeApexesAndTags(removeLineFeed(token));
+            }
+
+
+        }
+
+        // must close remaining tags
+        while (openTags.size() > 0) {
+            //pop all elements before tag and close it
+            String poppedTag = openTags.pop();
+            ret.html = ret.html + "</" + poppedTag + ">";
+            ret.val = ret.val + "</" + poppedTag + ">";
+        }
+
+        //set boolean value
+        ret.isValid = ret.invalidTags.size() == 0;
+
+        return ret;
+    }
+
+    /**
+     * Splits html tag and tag content <......>.
+     *
+     * @param html
+     * @return a list of token
+     */
+    private static List<String> tokenize(String html) {
+        ArrayList tokens = new ArrayList();
+        int pos = 0;
+        String token = "";
+        int len = html.length();
+        while (pos < len) {
+            char c = html.charAt(pos);
+
+            String ahead = html.substring(pos, pos > len - 4 ? len : pos + 4);
+
+            //a comment is starting
+            if ("<!--".equals(ahead)) {
+                //store the current token
+                if (token.length() > 0) {
+                    tokens.add(token);
+                }
+
+                //clear the token
+                token = "";
+
+                // search the end of <......>
+                int end = moveToMarkerEnd(pos, "-->", html);
+                tokens.add(html.substring(pos, end));
+                pos = end;
+
+
+                // a new "<" token is starting
+            } else if ('<' == c) {
+
+                //store the current token
+                if (token.length() > 0) {
+                    tokens.add(token);
+                }
+
+                //clear the token
+                token = "";
+
+                // serch the end of <......>
+                int end = moveToMarkerEnd(pos, ">", html);
+                tokens.add(html.substring(pos, end));
+                pos = end;
+
+            } else {
+                token = token + c;
+                pos++;
+            }
+
+        }
+
+        //store the last token
+        if (token.length() > 0) {
+            tokens.add(token);
+        }
+
+        return tokens;
+    }
+
+    private static int moveToMarkerEnd(int pos, String marker, String s) {
+        int i = s.indexOf(marker, pos);
+        if (i > -1) {
+            pos = i + marker.length();
+        } else {
+            pos = s.length();
+        }
+        return pos;
+    }
+
+    /**
+     * Contains the sanitizing results.
+     * html is the sanitized html encoded  ready to be printed. Unaccepted tag 
are encode, text inside tag is always encoded    MUST BE USED WHEN PRINTING HTML
+     * text is the text inside valid tags. Contains invalid tags encoded       
                                                 SHOULD BE USED TO PRINT 
EXCERPTS
+     * val  is the html source cleaned from unaccepted tags. It is not 
encoded:                                                 SHOULD BE USED IN SAVE 
ACTIONS
+     * isValid is true when every tag is accepted without forcing encoding
+     * invalidTags is the list of encoded-killed tags
+     */
+    static class SanitizeResult {
+
+        public String html = "";
+        public String text = "";
+        public String val = "";
+        public boolean isValid = true;
+        public List<String> invalidTags = new ArrayList();
+    }
+
+    public static String encode(String s) {
+        return convertLineFeedToBR(htmlEncodeApexesAndTags(s == null ? "" : 
s));
+    }
+
+    public static final String htmlEncodeApexesAndTags(String source) {
+        return htmlEncodeTag(htmlEncodeApexes(source));
+    }
+
+    public static final String htmlEncodeApexes(String source) {
+        if (source != null) {
+            String result = replaceAllNoRegex(source, new String[]{"\"", "'"}, 
new String[]{"&quot;", "&#39;"});
+            return result;
+        } else {
+            return null;
+        }
+    }
+
+    public static final String htmlEncodeTag(String source) {
+        if (source != null) {
+            String result = replaceAllNoRegex(source, new String[]{"<", ">"}, 
new String[]{"&lt;", "&gt;"});
+            return result;
+        } else {
+            return null;
+        }
+    }
+
+    public static String convertLineFeedToBR(String text) {
+        if (text != null) {
+            return replaceAllNoRegex(text, new String[]{"\n", "\f", "\r"}, new 
String[]{"<br>", "<br>", " "});
+        } else {
+            return null;
+        }
+    }
+
+    public static String removeLineFeed(String text) {
+
+        if (text != null) {
+            return replaceAllNoRegex(text, new String[]{"\n", "\f", "\r"}, new 
String[]{" ", " ", " "});
+        } else {
+            return null;
+        }
+    }
+
+    public static final String replaceAllNoRegex(String source, String 
searches[], String replaces[]) {
+        int k;
+        String tmp = source;
+        for (k = 0; k < searches.length; k++) {
+            tmp = replaceAllNoRegex(tmp, searches[k], replaces[k]);
+        }
+        return tmp;
+    }
+
+    public static final String replaceAllNoRegex(String source, String search, 
String replace) {
+        StringBuilder buffer = new StringBuilder();
+        if (source != null) {
+            if (search.length() == 0) {
+                return source;
+            }
+            int oldPos, pos;
+            for (oldPos = 0, pos = source.indexOf(search, oldPos); pos != -1; 
oldPos = pos + search.length(),
+                    pos = source.indexOf(search, oldPos)) {
+                buffer.append(source.substring(oldPos, pos));
+                buffer.append(replace);
+            }
+            if (oldPos < source.length()) {
+                buffer.append(source.substring(oldPos));
+            }
+        }
+        return new String(buffer);
+    }
 }

Modified: 
roller/trunk/app/src/main/java/org/apache/roller/weblogger/util/Trackback.java
URL: 
http://svn.apache.org/viewvc/roller/trunk/app/src/main/java/org/apache/roller/weblogger/util/Trackback.java?rev=1583506&r1=1583505&r2=1583506&view=diff
==============================================================================
--- 
roller/trunk/app/src/main/java/org/apache/roller/weblogger/util/Trackback.java 
(original)
+++ 
roller/trunk/app/src/main/java/org/apache/roller/weblogger/util/Trackback.java 
Tue Apr  1 01:32:35 2014
@@ -105,7 +105,8 @@ public class Trackback {
         
         // Construct data
         String title = entry.getTitle();
-        String excerpt = StringUtils.left( 
Utilities.removeHTML(entry.getDisplayContent()),255 );
+        String excerpt = StringUtils.left( 
Utilities.removeHTML(entry.getDisplayContent()),
+                RollerConstants.TEXTWIDTH_255);
         String url = entry.getPermalink();
         String blog_name = entry.getWebsite().getName();
         


Reply via email to