diff --git a/src/main/java/org/jvnet/hudson/plugins/collapsingconsolesections/CollapsingSectionAnnotator.java b/src/main/java/org/jvnet/hudson/plugins/collapsingconsolesections/CollapsingSectionAnnotator.java index 6eb44f6..19b4e3d 100644 --- a/src/main/java/org/jvnet/hudson/plugins/collapsingconsolesections/CollapsingSectionAnnotator.java +++ b/src/main/java/org/jvnet/hudson/plugins/collapsingconsolesections/CollapsingSectionAnnotator.java @@ -23,17 +23,19 @@ */ package org.jvnet.hudson.plugins.collapsingconsolesections; -import hudson.MarkupText; -import hudson.Util; -import hudson.console.ConsoleAnnotator; -import hudson.model.Run; import java.io.Serializable; import java.util.Arrays; import java.util.List; import java.util.Stack; import java.util.regex.Matcher; + import javax.annotation.Nonnull; +import hudson.MarkupText; +import hudson.Util; +import hudson.console.ConsoleAnnotator; +import hudson.model.Run; + public class CollapsingSectionAnnotator extends ConsoleAnnotator { @Nonnull @@ -63,7 +65,7 @@ public ConsoleAnnotator annotate(Object context, MarkupText text) { } while (!currentSections.empty()) { - SectionDefinition currentSection = currentSections.peek(); + SectionDefinition currentSection = currentSections.peek(); if (currentSection.getSectionEndPattern().matcher(text.getText().trim()).matches()) { popSection(text); if (currentSection.isCollapseOnlyOneLevel()) { @@ -75,6 +77,11 @@ public ConsoleAnnotator annotate(Object context, MarkupText text) { } for (SectionDefinition section : sections) { + if(!currentSections.empty() + && currentSections.peek().getSectionDisplayName().equals(section.getSectionDisplayName()) + && !section.isAllowNesting()) { + continue; + } Matcher m = section.getSectionStartPattern().matcher(text.getText().trim()); if (m.matches()) { pushSection(text, m, section); diff --git a/src/main/java/org/jvnet/hudson/plugins/collapsingconsolesections/CollapsingSectionNote.java b/src/main/java/org/jvnet/hudson/plugins/collapsingconsolesections/CollapsingSectionNote.java index 0abd1c8..582fe24 100644 --- a/src/main/java/org/jvnet/hudson/plugins/collapsingconsolesections/CollapsingSectionNote.java +++ b/src/main/java/org/jvnet/hudson/plugins/collapsingconsolesections/CollapsingSectionNote.java @@ -23,25 +23,29 @@ */ package org.jvnet.hudson.plugins.collapsingconsolesections; -import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; -import hudson.Extension; -import hudson.MarkupText; -import hudson.console.ConsoleAnnotationDescriptor; -import hudson.console.ConsoleAnnotator; -import hudson.console.ConsoleNote; -import hudson.util.FormValidation; import java.lang.reflect.Array; import java.util.regex.Pattern; import java.util.regex.PatternSyntaxException; + import javax.annotation.CheckForNull; import javax.annotation.Nonnull; + import net.sf.json.JSONObject; + import org.kohsuke.accmod.Restricted; import org.kohsuke.accmod.restrictions.NoExternalUse; import org.kohsuke.stapler.DataBoundConstructor; import org.kohsuke.stapler.QueryParameter; import org.kohsuke.stapler.StaplerRequest; +import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; +import hudson.Extension; +import hudson.MarkupText; +import hudson.console.ConsoleAnnotationDescriptor; +import hudson.console.ConsoleAnnotator; +import hudson.console.ConsoleNote; +import hudson.util.FormValidation; + /** * * @author dty @@ -56,19 +60,21 @@ public class CollapsingSectionNote extends ConsoleNote { private String sectionEndPattern; private boolean collapseOnlyOneLevel; private boolean collapseSection; + private boolean allowNesting; @DataBoundConstructor - public CollapsingSectionNote(@Nonnull String sectionDisplayName, @Nonnull String sectionStartPattern, @Nonnull String sectionEndPattern, boolean collapseOnlyOneLevel, boolean collapseSection) { + public CollapsingSectionNote(@Nonnull String sectionDisplayName, @Nonnull String sectionStartPattern, @Nonnull String sectionEndPattern, boolean collapseOnlyOneLevel, boolean collapseSection, boolean allowNesting) { this.sectionDisplayName = sectionDisplayName; this.sectionStartPattern = sectionStartPattern; this.sectionEndPattern = sectionEndPattern; this.collapseOnlyOneLevel = collapseOnlyOneLevel; this.collapseSection = collapseSection; + this.allowNesting = allowNesting; } @Deprecated public CollapsingSectionNote(String sectionDisplayName, String sectionStartPattern, String sectionEndPattern, boolean collapseOnlyOneLevel) { - this(sectionDisplayName, sectionStartPattern, sectionEndPattern, collapseOnlyOneLevel, false); + this(sectionDisplayName, sectionStartPattern, sectionEndPattern, collapseOnlyOneLevel, false, false); } @Nonnull @@ -101,7 +107,7 @@ public boolean isCollapseOnlyOneLevel() { @Nonnull public SectionDefinition getDefinition() { - return new SectionDefinition(sectionDisplayName, sectionStartPattern, sectionEndPattern, collapseOnlyOneLevel, collapseSection); + return new SectionDefinition(sectionDisplayName, sectionStartPattern, sectionEndPattern, collapseOnlyOneLevel, collapseSection, allowNesting); } @Override diff --git a/src/main/java/org/jvnet/hudson/plugins/collapsingconsolesections/SectionDefinition.java b/src/main/java/org/jvnet/hudson/plugins/collapsingconsolesections/SectionDefinition.java index 11eff86..9ed9aba 100644 --- a/src/main/java/org/jvnet/hudson/plugins/collapsingconsolesections/SectionDefinition.java +++ b/src/main/java/org/jvnet/hudson/plugins/collapsingconsolesections/SectionDefinition.java @@ -27,6 +27,7 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.regex.PatternSyntaxException; + import javax.annotation.Nonnull; /** @@ -39,21 +40,30 @@ public class SectionDefinition implements Serializable { private Pattern end; private boolean collapseOnlyOneLevel; private boolean collapseSection; + private boolean allowNesting; /** - * @deprecated Use {@link #SectionDefinition(java.lang.String, java.lang.String, java.lang.String, boolean, boolean)} instead. + * @deprecated Use {@link #SectionDefinition(java.lang.String, java.lang.String, java.lang.String, boolean, boolean, boolean)} instead. */ @Deprecated public SectionDefinition(String sectionName, String sectionStartPattern, String sectionEndPattern) { - this(sectionName, sectionStartPattern, sectionEndPattern, false, false); + this(sectionName, sectionStartPattern, sectionEndPattern, false, false, false); } /** - * @deprecated Use {@link #SectionDefinition(java.lang.String, java.lang.String, java.lang.String, boolean, boolean)} instead. + * @deprecated Use {@link #SectionDefinition(java.lang.String, java.lang.String, java.lang.String, boolean, boolean, boolean)} instead. */ @Deprecated public SectionDefinition(String sectionName, String sectionStartPattern, String sectionEndPattern, boolean collapseOnlyOneLevel) { - this(sectionName, sectionStartPattern, sectionEndPattern, collapseOnlyOneLevel, false); + this(sectionName, sectionStartPattern, sectionEndPattern, collapseOnlyOneLevel, false, false); + } + + /** + * @deprecated Use {@link #SectionDefinition(java.lang.String, java.lang.String, java.lang.String, boolean, boolean, boolean)} instead. + */ + @Deprecated + public SectionDefinition(String sectionName, String sectionStartPattern, String sectionEndPattern, boolean collapseOnlyOneLevel, boolean collapseSection) { + this(sectionName, sectionStartPattern, sectionEndPattern, collapseOnlyOneLevel, collapseSection, false); } /** @@ -65,12 +75,13 @@ public SectionDefinition(String sectionName, String sectionStartPattern, String * @param collapseSection If {@code true}, the section should be collapsed by default * @throws PatternSyntaxException One of the patterns is invalid */ - public SectionDefinition(@Nonnull String sectionName, @Nonnull String sectionStartPattern, @Nonnull String sectionEndPattern, boolean collapseOnlyOneLevel, boolean collapseSection) throws PatternSyntaxException { + public SectionDefinition(@Nonnull String sectionName, @Nonnull String sectionStartPattern, @Nonnull String sectionEndPattern, boolean collapseOnlyOneLevel, boolean collapseSection, boolean allowNesting) throws PatternSyntaxException { name = sectionName; start = Pattern.compile(sectionStartPattern); end = Pattern.compile(sectionEndPattern); this.collapseOnlyOneLevel = collapseOnlyOneLevel; this.collapseSection = collapseSection; + this.allowNesting = allowNesting; } @Nonnull @@ -111,4 +122,7 @@ public boolean isCollapseSection() { public boolean isCollapseOnlyOneLevel() { return collapseOnlyOneLevel; } + public boolean isAllowNesting() { + return allowNesting; + } } diff --git a/src/main/resources/org/jvnet/hudson/plugins/collapsingconsolesections/CollapsingSectionNote/global.jelly b/src/main/resources/org/jvnet/hudson/plugins/collapsingconsolesections/CollapsingSectionNote/global.jelly index 2a4a1ce..da0ff90 100644 --- a/src/main/resources/org/jvnet/hudson/plugins/collapsingconsolesections/CollapsingSectionNote/global.jelly +++ b/src/main/resources/org/jvnet/hudson/plugins/collapsingconsolesections/CollapsingSectionNote/global.jelly @@ -48,6 +48,9 @@ THE SOFTWARE. + + +
diff --git a/src/main/resources/org/jvnet/hudson/plugins/collapsingconsolesections/CollapsingSectionNote/help-allowNesting.html b/src/main/resources/org/jvnet/hudson/plugins/collapsingconsolesections/CollapsingSectionNote/help-allowNesting.html new file mode 100644 index 0000000..e39f6b9 --- /dev/null +++ b/src/main/resources/org/jvnet/hudson/plugins/collapsingconsolesections/CollapsingSectionNote/help-allowNesting.html @@ -0,0 +1,3 @@ +
+ Determines whether nesting of the same section should be allowed. +
\ No newline at end of file