You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by dk...@apache.org on 2019/07/02 18:43:53 UTC

[sling-org-apache-sling-app-cms] 02/02: Adding a number of Sonar fixes and improvements

This is an automated email from the ASF dual-hosted git repository.

dklco pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-app-cms.git

commit 860c28e1cabd8f65b21765b4fe6fed0124407191
Author: Dan Klco <dk...@apache.org>
AuthorDate: Tue Jul 2 14:43:45 2019 -0400

    Adding a number of Sonar fixes and improvements
---
 .../providers/HTMLValdiatorInsightProvider.java    |  54 ++++++-----
 .../impl/providers/ReadabilityInsightProvider.java |  97 ++++++++++---------
 .../core/internal/filters/EditIncludeFilter.java   | 107 ++++++++++++---------
 .../internal/operations/BulkReplaceOperation.java  |   2 +
 .../operations/UpdateReferencesPostOperation.java  |  81 ++++++++--------
 .../core/internal/rewriter/HTML5Serializer.java    |  56 +++++------
 6 files changed, 214 insertions(+), 183 deletions(-)

diff --git a/core/src/main/java/org/apache/sling/cms/core/insights/impl/providers/HTMLValdiatorInsightProvider.java b/core/src/main/java/org/apache/sling/cms/core/insights/impl/providers/HTMLValdiatorInsightProvider.java
index 53c72ec..cbc541e 100644
--- a/core/src/main/java/org/apache/sling/cms/core/insights/impl/providers/HTMLValdiatorInsightProvider.java
+++ b/core/src/main/java/org/apache/sling/cms/core/insights/impl/providers/HTMLValdiatorInsightProvider.java
@@ -19,6 +19,7 @@
 package org.apache.sling.cms.core.insights.impl.providers;
 
 import java.io.StringReader;
+import java.io.UnsupportedEncodingException;
 import java.net.URLEncoder;
 import java.nio.charset.StandardCharsets;
 import java.util.HashSet;
@@ -126,30 +127,7 @@ public class HTMLValdiatorInsightProvider extends BaseInsightProvider {
                     }
                 }
             }
-            double score = 0.0;
-            if (errors > 5) {
-                insight.setPrimaryMessage(Message
-                        .danger(dictionary.get(I18N_KEY_HTMLVALIDATOR_DANGER, new Object[] { errors, warnings })));
-                score = 0.2;
-            } else if (errors > 0) {
-                insight.setPrimaryMessage(Message
-                        .danger(dictionary.get(I18N_KEY_HTMLVALIDATOR_DANGER, new Object[] { errors, warnings })));
-                score = 0.4;
-            } else if (warnings > 5) {
-                insight.setPrimaryMessage(
-                        Message.danger(dictionary.get(I18N_KEY_HTMLVALIDATOR_WARN, new Object[] { warnings })));
-                score = 0.6;
-            } else if (warnings > 0) {
-                insight.setPrimaryMessage(
-                        Message.danger(dictionary.get(I18N_KEY_HTMLVALIDATOR_WARN, new Object[] { warnings })));
-                score = 0.8;
-            } else {
-                insight.setPrimaryMessage(Message.danger(dictionary.get(I18N_KEY_HTMLVALIDATOR_SUCCESS)));
-                score = 1.0;
-            }
-            insight.setScore(score);
-            insight.setMoreDetailsLink("https://validator.w3.org/nu/?doc="
-                    + URLEncoder.encode(pageRequest.getPage().getPublishedUrl(), StandardCharsets.UTF_8.toString()));
+            updateInsight(insight, pageRequest, dictionary, errors, warnings);
         } finally {
             if (reader != null) {
                 reader.close();
@@ -159,6 +137,34 @@ public class HTMLValdiatorInsightProvider extends BaseInsightProvider {
         return insight;
     }
 
+    private void updateInsight(Insight insight, PageInsightRequest pageRequest, I18NDictionary dictionary, int errors,
+            int warnings) throws UnsupportedEncodingException {
+        double score = 0.0;
+        if (errors > 5) {
+            insight.setPrimaryMessage(Message
+                    .danger(dictionary.get(I18N_KEY_HTMLVALIDATOR_DANGER, new Object[] { errors, warnings })));
+            score = 0.2;
+        } else if (errors > 0) {
+            insight.setPrimaryMessage(Message
+                    .danger(dictionary.get(I18N_KEY_HTMLVALIDATOR_DANGER, new Object[] { errors, warnings })));
+            score = 0.4;
+        } else if (warnings > 5) {
+            insight.setPrimaryMessage(
+                    Message.warn(dictionary.get(I18N_KEY_HTMLVALIDATOR_WARN, new Object[] { warnings })));
+            score = 0.6;
+        } else if (warnings > 0) {
+            insight.setPrimaryMessage(
+                    Message.warn(dictionary.get(I18N_KEY_HTMLVALIDATOR_WARN, new Object[] { warnings })));
+            score = 0.8;
+        } else {
+            insight.setPrimaryMessage(Message.success(dictionary.get(I18N_KEY_HTMLVALIDATOR_SUCCESS)));
+            score = 1.0;
+        }
+        insight.setScore(score);
+        insight.setMoreDetailsLink("https://validator.w3.org/nu/?doc="
+                + URLEncoder.encode(pageRequest.getPage().getPublishedUrl(), StandardCharsets.UTF_8.toString()));
+    }
+
     @Override
     public String getId() {
         return "htmlvalidator";
diff --git a/core/src/main/java/org/apache/sling/cms/core/insights/impl/providers/ReadabilityInsightProvider.java b/core/src/main/java/org/apache/sling/cms/core/insights/impl/providers/ReadabilityInsightProvider.java
index 72e8b86..b24dde4 100644
--- a/core/src/main/java/org/apache/sling/cms/core/insights/impl/providers/ReadabilityInsightProvider.java
+++ b/core/src/main/java/org/apache/sling/cms/core/insights/impl/providers/ReadabilityInsightProvider.java
@@ -97,52 +97,7 @@ public class ReadabilityInsightProvider extends BaseInsightProvider {
 
         I18NDictionary dictionary = i18nProvider.getDictionary(request.getResource().getResourceResolver());
         if (site != null && config != null) {
-            ReadabilityService svc = factory.getReadabilityService(site.getLocale());
-
-            double score = svc.calculateAverageGradeLevel(text);
-            String scoreStr = new DecimalFormat("##0.00").format(score);
-
-            insight.setScored(true);
-
-            log.debug("Calculating readability of page {}", pageRequest.getPage());
-
-            if (score > config.getMaxGradeLevel() || score < config.getMinGradeLevel()) {
-                log.debug("Retrieved out of bounds readability {} based on range {}-{}", score,
-                        config.getMinGradeLevel(), config.getMaxGradeLevel());
-
-                StandardDeviation sd = new StandardDeviation(false);
-                double stddev = sd.evaluate(new double[] { config.getMinGradeLevel(), config.getMaxGradeLevel() });
-                double dev;
-                if (score > config.getMaxGradeLevel()) {
-                    dev = score - config.getMaxGradeLevel();
-                } else {
-                    dev = config.getMinGradeLevel() - score;
-                }
-                double calcScore = 1 - (dev / stddev) * .5;
-                if (calcScore > 0) {
-                    insight.setScore(calcScore);
-                } else {
-                    insight.setScore(0.0);
-                }
-                insight.setPrimaryMessage(Message.warn(dictionary.get(I18N_KEY_READABILITY_RESULT_WARN,
-                        new Object[] { config.getMinGradeLevel(), config.getMaxGradeLevel(), scoreStr })));
-            } else {
-                log.debug("Retrieved in bounds readability {} based on range {}-{}", score, config.getMinGradeLevel(),
-                        config.getMaxGradeLevel());
-                insight.setScore(1.0);
-                insight.setPrimaryMessage(Message.success(dictionary.get(I18N_KEY_READABILITY_RESULT_SUCCESS,
-                        new Object[] { config.getMinGradeLevel(), config.getMaxGradeLevel(), scoreStr })));
-            }
-            Text t = svc.extractSentences(text);
-
-            insight.getScoreDetails().add(Message.defaultMsg(dictionary.get(I18N_KEY_READABILITY_STATS,
-                    new Object[] { t.getSentences().size(), t.getWordCount(), t.getComplexWordCount() })));
-            addDetail(insight, svc.calculateARI(t), "ARI");
-            addDetail(insight, svc.calculateColemanLiauIndex(t), "Coleman-Liau Index");
-            addDetail(insight, svc.calculateFleschKincaidGradeLevel(t), "Flesch-Kincaid Grade Level");
-            addDetail(insight, svc.calculateFleschReadingEase(t), "Flesch-Kincaid Reading Ease");
-            addDetail(insight, svc.calculateGunningFog(t), "Gunning Fog");
-            addDetail(insight, svc.calculateSMOG(t), "SMOG");
+            executeReadabilityCheck(insight, pageRequest, text, site, config, dictionary);
 
         } else {
             log.warn("Failed to get readability for resource {} site or config were null",
@@ -156,6 +111,56 @@ public class ReadabilityInsightProvider extends BaseInsightProvider {
         return insight;
     }
 
+    private void executeReadabilityCheck(Insight insight, PageInsightRequest pageRequest, String text, Site site,
+            ReadabilitySiteConfig config, I18NDictionary dictionary) {
+        ReadabilityService svc = factory.getReadabilityService(site.getLocale());
+
+        double score = svc.calculateAverageGradeLevel(text);
+        String scoreStr = new DecimalFormat("##0.00").format(score);
+
+        insight.setScored(true);
+
+        log.debug("Calculating readability of page {}", pageRequest.getPage());
+
+        if (score > config.getMaxGradeLevel() || score < config.getMinGradeLevel()) {
+            log.debug("Retrieved out of bounds readability {} based on range {}-{}", score,
+                    config.getMinGradeLevel(), config.getMaxGradeLevel());
+
+            StandardDeviation sd = new StandardDeviation(false);
+            double stddev = sd.evaluate(new double[] { config.getMinGradeLevel(), config.getMaxGradeLevel() });
+            double dev;
+            if (score > config.getMaxGradeLevel()) {
+                dev = score - config.getMaxGradeLevel();
+            } else {
+                dev = config.getMinGradeLevel() - score;
+            }
+            double calcScore = 1 - (dev / stddev) * .5;
+            if (calcScore > 0) {
+                insight.setScore(calcScore);
+            } else {
+                insight.setScore(0.0);
+            }
+            insight.setPrimaryMessage(Message.warn(dictionary.get(I18N_KEY_READABILITY_RESULT_WARN,
+                    new Object[] { config.getMinGradeLevel(), config.getMaxGradeLevel(), scoreStr })));
+        } else {
+            log.debug("Retrieved in bounds readability {} based on range {}-{}", score, config.getMinGradeLevel(),
+                    config.getMaxGradeLevel());
+            insight.setScore(1.0);
+            insight.setPrimaryMessage(Message.success(dictionary.get(I18N_KEY_READABILITY_RESULT_SUCCESS,
+                    new Object[] { config.getMinGradeLevel(), config.getMaxGradeLevel(), scoreStr })));
+        }
+        Text t = svc.extractSentences(text);
+
+        insight.getScoreDetails().add(Message.defaultMsg(dictionary.get(I18N_KEY_READABILITY_STATS,
+                new Object[] { t.getSentences().size(), t.getWordCount(), t.getComplexWordCount() })));
+        addDetail(insight, svc.calculateARI(t), "ARI");
+        addDetail(insight, svc.calculateColemanLiauIndex(t), "Coleman-Liau Index");
+        addDetail(insight, svc.calculateFleschKincaidGradeLevel(t), "Flesch-Kincaid Grade Level");
+        addDetail(insight, svc.calculateFleschReadingEase(t), "Flesch-Kincaid Reading Ease");
+        addDetail(insight, svc.calculateGunningFog(t), "Gunning Fog");
+        addDetail(insight, svc.calculateSMOG(t), "SMOG");
+    }
+
     @Override
     public String getId() {
         return READABILITY_CA_CONFIG;
diff --git a/core/src/main/java/org/apache/sling/cms/core/internal/filters/EditIncludeFilter.java b/core/src/main/java/org/apache/sling/cms/core/internal/filters/EditIncludeFilter.java
index b8e9993..2527f10 100644
--- a/core/src/main/java/org/apache/sling/cms/core/internal/filters/EditIncludeFilter.java
+++ b/core/src/main/java/org/apache/sling/cms/core/internal/filters/EditIncludeFilter.java
@@ -18,7 +18,9 @@ package org.apache.sling.cms.core.internal.filters;
 
 import java.io.IOException;
 import java.io.PrintWriter;
+import java.util.Collections;
 import java.util.Iterator;
+import java.util.Optional;
 
 import javax.servlet.Filter;
 import javax.servlet.FilterChain;
@@ -47,7 +49,7 @@ public class EditIncludeFilter implements Filter {
     public static final String ENABLED_ATTR_NAME = "cmsEditEnabled";
 
     @Override
-    public void init(FilterConfig filterConfig) throws ServletException {
+    public void destroy() {
         // Nothing required
     }
 
@@ -59,33 +61,8 @@ public class EditIncludeFilter implements Filter {
         boolean includeEnd = false;
 
         if (enabled) {
-
-            String editPath = null;
-            Resource resource = ((SlingHttpServletRequest) request).getResource();
-
-            EditableResource editableResource = new EditableResourceImpl(resource);
-            Component component = editableResource.getComponent();
-            if (component != null && !component.isType(CMSConstants.COMPONENT_TYPE_PAGE)) {
-                editPath = component.getEditPath();
-            }
-
             writer = response.getWriter();
-
-            if (StringUtils.isNotEmpty(editPath)) {
-                includeEnd = true;
-                writeEditorMarkup(resource, writer);
-            } else if (component != null && !component.isEditable()) {
-                includeEnd = true;
-                EditableResource er = resource.adaptTo(EditableResource.class);
-                if (er != null) {
-                    component = er.getComponent();
-                }
-                writer = response.getWriter();
-                writer.write("<div class=\"sling-cms-component\" data-sling-cms-title=\""
-                        + (component != null ? component.getTitle() : "") + "\" data-sling-cms-resource-path=\""
-                        + resource.getPath() + "\" data-sling-cms-resource-type=\"" + resource.getResourceType()
-                        + "\">");
-            }
+            includeEnd = writeHeader(request, writer, includeEnd);
         }
         chain.doFilter(request, response);
         if (enabled && writer != null && includeEnd) {
@@ -93,15 +70,30 @@ public class EditIncludeFilter implements Filter {
         }
     }
 
-    private void writeEditorMarkup(Resource resource, PrintWriter writer) {
+    private Iterator<Resource> getSiblings(Resource resource) {
+        return Optional.ofNullable(resource.getParent()).map(p -> p.listChildren()).orElse(Collections.emptyIterator());
+    }
 
-        boolean last = false;
+    @Override
+    public void init(FilterConfig filterConfig) throws ServletException {
+        // Nothing required
+    }
+
+    private boolean isFirst(Resource resource) {
         boolean first = false;
         if (resource != null && resource.getParent() != null) {
-            Iterator<Resource> children = resource.getParent().listChildren();
+            Iterator<Resource> children = getSiblings(resource);
             if (!children.hasNext() || children.next().getPath().equals(resource.getPath())) {
                 first = true;
             }
+        }
+        return first;
+    }
+
+    private boolean isLast(Resource resource) {
+        boolean last = false;
+        if (resource != null && resource.getParent() != null) {
+            Iterator<Resource> children = getSiblings(resource);
             if (children.hasNext()) {
                 while (children.hasNext()) {
                     if (children.next().getPath().equals(resource.getPath()) && !children.hasNext()) {
@@ -112,19 +104,22 @@ public class EditIncludeFilter implements Filter {
                 last = true;
             }
         }
+        return last;
+    }
+
+    private void writeEditorMarkup(Resource resource, PrintWriter writer) {
+
         boolean exists = resource.getResourceResolver().getResource(resource.getPath()) != null;
+        boolean last = isFirst(resource);
+        boolean first = isLast(resource);
 
-        Component component = null;
         EditableResource er = new EditableResourceImpl(resource);
-        String editPath = "";
-        if (er != null) {
-            component = er.getComponent();
-            editPath = component.getEditPath();
-        }
-        String title = component != null ? component.getTitle()
+        Component component = er.getComponent();
+        String editPath = component.getEditPath();
+        String title = StringUtils.isNotEmpty(component.getTitle()) ? component.getTitle()
                 : StringUtils.substringAfterLast(resource.getResourceType(), "/");
-        writer.write("<div class=\"sling-cms-component\" data-component=\"" + component.getResource().getPath() + "\" data-sling-cms-title=\""
-                + title + "\" data-sling-cms-resource-path=\"" + resource.getPath()
+        writer.write("<div class=\"sling-cms-component\" data-component=\"" + component.getResource().getPath()
+                + "\" data-sling-cms-title=\"" + title + "\" data-sling-cms-resource-path=\"" + resource.getPath()
                 + "\" data-sling-cms-resource-type=\"" + resource.getResourceType() + "\" data-sling-cms-edit=\""
                 + editPath + "\"><div class=\"sling-cms-editor\">");
         writer.write(
@@ -147,16 +142,36 @@ public class EditIncludeFilter implements Filter {
         }
 
         writer.write("</div></div>");
-        if (component != null) {
-            writer.write(
-                    "<div class=\"level-right\"><div class=\"level-item has-text-light\">" + title + "</div></div>");
-        }
+        writer.write("<div class=\"level-right\"><div class=\"level-item has-text-light\">" + title + "</div></div>");
         writer.write("</div></div>");
     }
 
-    @Override
-    public void destroy() {
-        // Nothing required
+    private boolean writeHeader(ServletRequest request, PrintWriter writer, boolean includeEnd) {
+        String editPath = null;
+        Resource resource = ((SlingHttpServletRequest) request).getResource();
+
+        EditableResource editableResource = new EditableResourceImpl(resource);
+        Component component = editableResource.getComponent();
+        if (component != null && !component.isType(CMSConstants.COMPONENT_TYPE_PAGE)) {
+            editPath = component.getEditPath();
+        }
+
+
+        if (StringUtils.isNotEmpty(editPath)) {
+            includeEnd = true;
+            writeEditorMarkup(resource, writer);
+        } else if (component != null && !component.isEditable()) {
+            includeEnd = true;
+            EditableResource er = resource.adaptTo(EditableResource.class);
+            if (er != null) {
+                component = er.getComponent();
+            }
+            writer.write("<div class=\"sling-cms-component\" data-sling-cms-title=\""
+                    + (component != null ? component.getTitle() : "") + "\" data-sling-cms-resource-path=\""
+                    + resource.getPath() + "\" data-sling-cms-resource-type=\"" + resource.getResourceType()
+                    + "\">");
+        }
+        return includeEnd;
     }
 
 }
diff --git a/core/src/main/java/org/apache/sling/cms/core/internal/operations/BulkReplaceOperation.java b/core/src/main/java/org/apache/sling/cms/core/internal/operations/BulkReplaceOperation.java
index 2e40792..ca1f708 100644
--- a/core/src/main/java/org/apache/sling/cms/core/internal/operations/BulkReplaceOperation.java
+++ b/core/src/main/java/org/apache/sling/cms/core/internal/operations/BulkReplaceOperation.java
@@ -56,6 +56,7 @@ public class BulkReplaceOperation implements PostOperation {
     public static final String PN_REPLACE = "replace";
     public static final String PN_MODE = "mode";
 
+    @SuppressWarnings("javasecurity:S2631") // ignoring warning since this servlet can only be executed by privileged users
     @Override
     public void run(SlingHttpServletRequest request, PostResponse response, SlingPostProcessor[] processors) {
 
@@ -73,6 +74,7 @@ public class BulkReplaceOperation implements PostOperation {
             String find = request.getParameter(PN_FIND);
             if (MODE_REGEX.equals(request.getParameter(PN_MODE))) {
                 log.debug("Using regular expressions to search for {}", find);
+                
                 rfind = Pattern.compile(find);
             } else {
                 log.debug("Searching for {}", find);
diff --git a/core/src/main/java/org/apache/sling/cms/core/internal/operations/UpdateReferencesPostOperation.java b/core/src/main/java/org/apache/sling/cms/core/internal/operations/UpdateReferencesPostOperation.java
index 5684973..fd330a8 100644
--- a/core/src/main/java/org/apache/sling/cms/core/internal/operations/UpdateReferencesPostOperation.java
+++ b/core/src/main/java/org/apache/sling/cms/core/internal/operations/UpdateReferencesPostOperation.java
@@ -39,46 +39,49 @@ import org.slf4j.LoggerFactory;
 @Component(immediate = true, service = { SlingPostProcessor.class }, property = Constants.SERVICE_RANKING + "=-1")
 public class UpdateReferencesPostOperation implements SlingPostProcessor {
 
-	public static final String RP_UPDATE_REFERENCES = SlingPostConstants.RP_PREFIX + "updateReferences";
+    public static final String RP_UPDATE_REFERENCES = SlingPostConstants.RP_PREFIX + "updateReferences";
 
-	private static final Logger log = LoggerFactory.getLogger(UpdateReferencesPostOperation.class);
+    private static final Logger log = LoggerFactory.getLogger(UpdateReferencesPostOperation.class);
 
-	@Override
-	public void process(SlingHttpServletRequest request, final List<Modification> changes) throws Exception {
-		if ((SlingPostConstants.OPERATION_DELETE.equals(request.getParameter(SlingPostConstants.RP_OPERATION))
-				|| SlingPostConstants.OPERATION_MOVE.equals(request.getParameter(SlingPostConstants.RP_OPERATION)))
-				&& "true".equalsIgnoreCase(request.getParameter(RP_UPDATE_REFERENCES))) {
+    @Override
+    public void process(SlingHttpServletRequest request, final List<Modification> changes) throws Exception {
+        if ((SlingPostConstants.OPERATION_DELETE.equals(request.getParameter(SlingPostConstants.RP_OPERATION))
+                || SlingPostConstants.OPERATION_MOVE.equals(request.getParameter(SlingPostConstants.RP_OPERATION)))
+                && "true".equalsIgnoreCase(request.getParameter(RP_UPDATE_REFERENCES))) {
+            updateReferences(request, changes);
+        }
+    }
 
-			final String find = request.getResource().getPath();
-			final String destination = request.getParameter(SlingPostConstants.RP_DEST);
-			log.debug("Using destination: {}", destination);
-			ReferenceOperation ro = new ReferenceOperation(request.getResource()) {
-				@Override
-				public void doProcess(Resource resource, String matchingKey) {
-					ModifiableValueMap properties = resource.adaptTo(ModifiableValueMap.class);
-					log.trace("Updating references in property {}@{}", resource.getPath(), matchingKey);
-					if (properties != null) {
-						if (properties.get(matchingKey) instanceof String) {
-							String value = properties.get(matchingKey, "").replace(find, destination);
-							properties.put(matchingKey, value);
-							log.trace("Updated value {}", value);
-						} else if (properties.get(matchingKey) instanceof String[]) {
-							String[] values = properties.get(matchingKey, new String[0]);
-							for (int i = 0; i < values.length; i++) {
-								values[i] = values[i].replace(find, destination);
-							}
-							properties.put(matchingKey, values);
-							if (log.isTraceEnabled()) {
-								log.trace("Updated values {}", Arrays.toString(values));
-							}
-						}
-					} else {
-						log.warn("Unable to update references in {}, unable to edit", resource);
-					}
-					changes.add(Modification.onModified(resource.getPath()));
-				}
-			};
-			ro.init();
-		}
-	}
+    private void updateReferences(SlingHttpServletRequest request, final List<Modification> changes) {
+        final String find = request.getResource().getPath();
+        final String destination = request.getParameter(SlingPostConstants.RP_DEST);
+        log.debug("Using destination: {}", destination);
+        ReferenceOperation ro = new ReferenceOperation(request.getResource()) {
+            @Override
+            public void doProcess(Resource resource, String matchingKey) {
+                ModifiableValueMap properties = resource.adaptTo(ModifiableValueMap.class);
+                log.trace("Updating references in property {}@{}", resource.getPath(), matchingKey);
+                if (properties != null) {
+                    if (properties.get(matchingKey) instanceof String) {
+                        String value = properties.get(matchingKey, "").replace(find, destination);
+                        properties.put(matchingKey, value);
+                        log.trace("Updated value {}", value);
+                    } else if (properties.get(matchingKey) instanceof String[]) {
+                        String[] values = properties.get(matchingKey, new String[0]);
+                        for (int i = 0; i < values.length; i++) {
+                            values[i] = values[i].replace(find, destination);
+                        }
+                        properties.put(matchingKey, values);
+                        if (log.isTraceEnabled()) {
+                            log.trace("Updated values {}", Arrays.toString(values));
+                        }
+                    }
+                } else {
+                    log.warn("Unable to update references in {}, unable to edit", resource);
+                }
+                changes.add(Modification.onModified(resource.getPath()));
+            }
+        };
+        ro.init();
+    }
 }
diff --git a/core/src/main/java/org/apache/sling/cms/core/internal/rewriter/HTML5Serializer.java b/core/src/main/java/org/apache/sling/cms/core/internal/rewriter/HTML5Serializer.java
index 0331542..35976a4 100644
--- a/core/src/main/java/org/apache/sling/cms/core/internal/rewriter/HTML5Serializer.java
+++ b/core/src/main/java/org/apache/sling/cms/core/internal/rewriter/HTML5Serializer.java
@@ -18,6 +18,7 @@ package org.apache.sling.cms.core.internal.rewriter;
 
 import java.io.IOException;
 import java.io.PrintWriter;
+import java.util.Arrays;
 import java.util.HashSet;
 import java.util.Set;
 
@@ -43,22 +44,11 @@ public class HTML5Serializer implements Serializer {
 
     private static final int CHAR_LT = 60;
 
-    private final Set<String> emptyTags = new HashSet<String>() {
-        private static final long serialVersionUID = 1L;
-        {
-            add("br");
-            add("area");
-            add("link");
-            add("img");
-            add("param");
-            add("hr");
-            add("input");
-            add("col");
-            add("base");
-            add("meta");
-        }
-    };
+    private static final Set<String> emptyTags = new HashSet<>();
+    static {
+        emptyTags.addAll(Arrays.asList("br", "area", "link", "img", "param", "hr", "input", "col", "base", "meta"));
 
+    };
     private PrintWriter writer;
 
     private ConfigurationResourceResolver resolver;
@@ -146,24 +136,14 @@ public class HTML5Serializer implements Serializer {
         for (int i = 0; i < atts.getLength(); i++) {
             if ("endSlash".equals(atts.getQName(i))) {
                 endSlash = true;
-                continue;
-            }
-            if ("a".equals(localName) && "shape".equals(atts.getLocalName(i))) {
-                continue;
-            }
-            if ("iframe".equals(localName)
-                    && ("frameborder".equals(atts.getLocalName(i)) || "scrolling".equals(atts.getLocalName(i)))) {
-                continue;
             }
-            if ("br".equals(localName) && ("clear".equals(atts.getLocalName(i)))) {
+            String value = atts.getValue(i);
+            if (shouldContinue(localName, atts, i)) {
                 continue;
             }
             writer.write(CHAR_SP);
             writer.write(atts.getLocalName(i));
-            String value = atts.getValue(i);
-            if (value == null) {
-                continue;
-            }
+
             writer.write(CHAR_EQ);
             writer.write('"');
             writer.write(value);
@@ -176,6 +156,26 @@ public class HTML5Serializer implements Serializer {
         writer.write(CHAR_GT);
     }
 
+    private boolean shouldContinue(String localName, Attributes atts, int i) {
+        if ("endSlash".equals(atts.getQName(i))) {
+            return true;
+        }
+        if ("a".equals(localName) && "shape".equals(atts.getLocalName(i))) {
+            return true;
+        }
+        if ("iframe".equals(localName)
+                && ("frameborder".equals(atts.getLocalName(i)) || "scrolling".equals(atts.getLocalName(i)))) {
+            return true;
+        }
+        if ("br".equals(localName) && ("clear".equals(atts.getLocalName(i)))) {
+            return true;
+        }
+        if (atts.getValue(i) == null) {
+            return true;
+        }
+        return false;
+    }
+
     @Override
     public void startPrefixMapping(String s, String s1) throws SAXException {
         // Nothing required