Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Merge pull request #14 from jenkinsci/plugin-facelift
[JENKINS-23121] - Regex validation + parent POM update
  • Loading branch information
oleg-nenashev committed Jun 11, 2017
2 parents b310029 + 35a3781 commit 71e88fa
Show file tree
Hide file tree
Showing 8 changed files with 135 additions and 42 deletions.
36 changes: 16 additions & 20 deletions pom.xml
Expand Up @@ -28,16 +28,15 @@ THE SOFTWARE.
<parent>
<groupId>org.jenkins-ci.plugins</groupId>
<artifactId>plugin</artifactId>
<version>2.10</version>
<version>2.29</version>
</parent>

<artifactId>collapsing-console-sections</artifactId>
<version>1.5.1-SNAPSHOT</version>
<version>1.6.0-SNAPSHOT</version>
<packaging>hpi</packaging>

<properties>
<jenkins.version>1.532.3</jenkins.version>
<jenkins-test-harness.version>1.532.3</jenkins-test-harness.version>
<jenkins.version>1.609.3</jenkins.version>
<java.level>6</java.level>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.license>mit</project.license>
Expand Down Expand Up @@ -72,22 +71,6 @@ THE SOFTWARE.
</developers>

<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.${java.level}</source>
<target>1.${java.level}</target>
<testSource>1.${java.level.test}</testSource>
<testTarget>1.${java.level.test}</testTarget>
<showDeprecation>true</showDeprecation>
<showWarnings>true</showWarnings>
<optimize>true</optimize>
<encoding>${project.build.sourceEncoding}</encoding>
</configuration>
</plugin>
</plugins>
<pluginManagement>
<plugins>
<plugin>
Expand Down Expand Up @@ -127,6 +110,19 @@ THE SOFTWARE.
<url>https://github.com/jenkinsci/${project.artifactId}-plugin</url>
<tag>HEAD</tag>
</scm>

<repositories>
<repository>
<id>repo.jenkins-ci.org</id>
<url>https://repo.jenkins-ci.org/public/</url>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>repo.jenkins-ci.org</id>
<url>https://repo.jenkins-ci.org/public/</url>
</pluginRepository>
</pluginRepositories>

</project>

Expand Down
Expand Up @@ -32,14 +32,23 @@
import java.util.List;
import java.util.Stack;
import java.util.regex.Matcher;
import javax.annotation.Nonnull;

public class CollapsingSectionAnnotator extends ConsoleAnnotator<Object> {

@Nonnull
private List<SectionDefinition> sections;

@Nonnull
private Stack<SectionDefinition> currentSections;

@Nonnull
private Stack<StackLevel> numberingStack;

@Nonnull
private CollapsingSectionsConfiguration configs;

public CollapsingSectionAnnotator(CollapsingSectionsConfiguration configs) {
public CollapsingSectionAnnotator(@Nonnull CollapsingSectionsConfiguration configs) {
this.configs = configs;
this.sections = Arrays.asList(configs.getSectionDefinitions());
this.currentSections = new Stack<SectionDefinition>();
Expand Down Expand Up @@ -78,6 +87,7 @@ public ConsoleAnnotator annotate(Object context, MarkupText text) {
* Generates level prefix for further display.
* @return LEVEL_MARKER for each upper level
*/
@Nonnull
private String getCurrentLevelPrefix() {
StringBuilder str= new StringBuilder();
if (configs.isNumberingEnabled()) {
Expand All @@ -90,14 +100,14 @@ private String getCurrentLevelPrefix() {
return str.toString();
}

private void pushSection(MarkupText text, Matcher m, SectionDefinition section) {
private void pushSection(@Nonnull MarkupText text, @Nonnull Matcher m, @Nonnull SectionDefinition section) {
numberingStack.peek().increment();
text.addMarkup(0, "<div class=\"collapseHeader\">" + getCurrentLevelPrefix() + Util.escape(section.getSectionDisplayName(m)) + "<div class=\"collapseAction\"><p onClick=\"doToggle(this)\">" + ((section.isCollapseSection()) ? "Show Details" : "Hide Details") +"</p></div></div><div class=\"" + ((section.isCollapseSection()) ? "collapsed" : "expanded") + "\">");
numberingStack.add(new StackLevel());
currentSections.push(section);
}

private void popSection(MarkupText text) {
private void popSection(@Nonnull MarkupText text) {
text.addMarkup(text.getText().length(), "</div>");
currentSections.pop();
numberingStack.pop();
Expand Down
Expand Up @@ -26,7 +26,7 @@
import hudson.Extension;
import hudson.console.ConsoleAnnotator;
import hudson.console.ConsoleAnnotatorFactory;
import hudson.model.Hudson;
import jenkins.model.Jenkins;

/**
*
Expand All @@ -36,7 +36,13 @@
public class CollapsingSectionAnnotatorFactory extends ConsoleAnnotatorFactory {
@Override
public ConsoleAnnotator newInstance(Object context) {
CollapsingSectionNote.DescriptorImpl descr = Hudson.getInstance().getDescriptorByType(CollapsingSectionNote.DescriptorImpl.class);
final Jenkins jenkins = Jenkins.getInstance();
if (jenkins == null) {
// Should never happen
return null;
}

CollapsingSectionNote.DescriptorImpl descr = jenkins.getDescriptorByType(CollapsingSectionNote.DescriptorImpl.class);
if (descr.getSectionDefinitions().length == 0) {
return null;
}
Expand Down
Expand Up @@ -23,52 +23,74 @@
*/
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;

/**
*
* @author dty
*/
public class CollapsingSectionNote extends ConsoleNote {

@Nonnull
private String sectionDisplayName;
@Nonnull
private String sectionStartPattern;
@Nonnull
private String sectionEndPattern;
private boolean collapseOnlyOneLevel;
private boolean collapseSection;

@DataBoundConstructor
public CollapsingSectionNote(String sectionDisplayName, String sectionStartPattern, String sectionEndPattern, boolean collapseOnlyOneLevel, boolean collapseSection) {
public CollapsingSectionNote(@Nonnull String sectionDisplayName, @Nonnull String sectionStartPattern, @Nonnull String sectionEndPattern, boolean collapseOnlyOneLevel, boolean collapseSection) {
this.sectionDisplayName = sectionDisplayName;
this.sectionStartPattern = sectionStartPattern;
this.sectionEndPattern = sectionEndPattern;
this.collapseOnlyOneLevel = collapseOnlyOneLevel;
this.collapseSection = collapseSection;
}

@Deprecated
public CollapsingSectionNote(String sectionDisplayName, String sectionStartPattern, String sectionEndPattern, boolean collapseOnlyOneLevel) {
this(sectionDisplayName, sectionStartPattern, sectionEndPattern, collapseOnlyOneLevel, false);
}

@Nonnull
public String getSectionDisplayName() {
return sectionDisplayName;
}

@Nonnull
public String getSectionStartPattern() {
return sectionStartPattern;
}

@Nonnull
public String getSectionEndPattern() {
return sectionEndPattern;
}

/**
* Check if the section should be collapsed by default.
* @return {@code} true if the section should be collapsed.
* @since 1.6.0
*/
public boolean isCollapseSection() {
return collapseSection;
}
Expand All @@ -77,6 +99,7 @@ public boolean isCollapseOnlyOneLevel() {
return collapseOnlyOneLevel;
}

@Nonnull
public SectionDefinition getDefinition() {
return new SectionDefinition(sectionDisplayName, sectionStartPattern, sectionEndPattern, collapseOnlyOneLevel, collapseSection);
}
Expand All @@ -89,26 +112,33 @@ public ConsoleAnnotator annotate(Object context, MarkupText text, int charPos) {

@Extension
public static final class DescriptorImpl extends ConsoleAnnotationDescriptor {

@CheckForNull
private CollapsingSectionNote[] sections;
private boolean numberingEnabled;
@Nonnull
private transient CollapsingSectionsConfiguration configuration;

@SuppressFBWarnings(value = "NP_NONNULL_FIELD_NOT_INITIALIZED_IN_CONSTRUCTOR", justification = "configuration is always initialized in load()")
public DescriptorImpl() {
load();
}

@Override
public String getDisplayName() {
return "Console Section";
}

@Nonnull
public CollapsingSectionNote[] getSections() {
if (sections != null) {
return sections.clone();
}

return (CollapsingSectionNote[]) Array.newInstance(CollapsingSectionNote.class, 0);
return new CollapsingSectionNote[0];
}

@Nonnull
public SectionDefinition[] getSectionDefinitions() {
return configuration.getSectionDefinitions();
}
Expand All @@ -121,6 +151,7 @@ public boolean isNumberingEnabled() {
return numberingEnabled;
}

@Nonnull
public CollapsingSectionsConfiguration getConfiguration() {
return configuration;
}
Expand All @@ -142,5 +173,20 @@ public boolean configure(StaplerRequest req, JSONObject json) throws FormExcepti

return true;
}

@Restricted(NoExternalUse.class)
public FormValidation doCheckSectionStartPattern(@QueryParameter String sectionStartPattern) {
try {
Pattern.compile(sectionStartPattern);
} catch (PatternSyntaxException exception) {
return FormValidation.error(exception.getDescription());
}
return FormValidation.ok();
}

@Restricted(NoExternalUse.class)
public FormValidation doCheckSectionEndPattern(@QueryParameter String sectionEndPattern) {
return doCheckSectionStartPattern(sectionEndPattern);
}
}
}
Expand Up @@ -23,33 +23,48 @@
*/
package org.jvnet.hudson.plugins.collapsingconsolesections;

import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import java.io.Serializable;
import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.Arrays;
import javax.annotation.CheckForNull;
import javax.annotation.Nonnull;

/**
* Provides a serializable instance of collapsing sections global configs.
* @author Oleg Nenashev
* @since 1.4.1
*/
public class CollapsingSectionsConfiguration implements Serializable {
private final CollapsingSectionNote[] sections;

@Nonnull
private CollapsingSectionNote[] sections;
private final boolean numberingEnabled;

public CollapsingSectionsConfiguration(CollapsingSectionNote[] sections, boolean numberingEnabled) {
public CollapsingSectionsConfiguration(@CheckForNull CollapsingSectionNote[] sections, boolean numberingEnabled) {
this.sections = sections != null ? Arrays.copyOf(sections, sections.length) : new CollapsingSectionNote[0];
this.numberingEnabled = numberingEnabled;
}

@SuppressFBWarnings(value = "RCN_REDUNDANT_NULLCHECK_OF_NONNULL_VALUE", justification = "Migration logic")
private Object readResolve() {
if (sections == null) {
sections = new CollapsingSectionNote[0];
}
return this;
}

public boolean isNumberingEnabled() {
return numberingEnabled;
}

@Nonnull
public CollapsingSectionNote[] getSections() {
return sections != null ? Arrays.copyOf(sections, sections.length) : new CollapsingSectionNote[0];
return Arrays.copyOf(sections, sections.length);
}

@Nonnull
public SectionDefinition[] getSectionDefinitions() {
CollapsingSectionNote[] configs = getSections();
ArrayList<SectionDefinition> defs = new ArrayList<SectionDefinition>();
Expand Down

0 comments on commit 71e88fa

Please sign in to comment.