Class LiveWallView

All Implemented Interfaces:
ExtensionPoint, Describable<View>, DescriptorByNameOwner, DirectlyModifiableView, ModelObject, Saveable, SearchableModelObject, SearchItem, AccessControlled, Badgeable, ModelObjectWithChildren, HasWidgets

public class LiveWallView extends ListView
A view that renders its jobs as a wall of coloured tiles, meant to be left on a television.

It extends ListView so that job selection, folder recursion, the include regex and job filters all behave exactly as people already expect; everything this class adds is about how the result is drawn. The rendering itself lives in the browser: the page ships a static shell and then polls wallData for a small JSON document, so a wall can sit open for weeks without leaking DOM or hammering the controller with full page loads.

Three deliberate departures from the older build-monitor style of wall:

  • No pagination. Tiles are scaled to fit the screen, so nothing is ever on the page you are not looking at. Walls too large to shrink can scroll continuously instead.
  • No per-tile detail. A tile carries the job name and a colour. Anything else is off by default, because at four metres you cannot read a commit message anyway.
  • Palettes designed for large panels. Saturated fills and automatically contrasting ink, rather than the washed-out pastels that disappear under office lighting.
  • Constructor Details

    • LiveWallView

      @DataBoundConstructor public LiveWallView(String name)
    • LiveWallView

      public LiveWallView(String name, ViewGroup owner)
  • Method Details

    • readResolve

      protected Object readResolve()
      Overrides:
      readResolve in class ListView
    • getPalette

      @NonNull public Palette getPalette()
    • setPalette

      @DataBoundSetter public void setPalette(@CheckForNull String palette)
    • getShape

      @NonNull public TileShape getShape()
    • setShape

      @DataBoundSetter public void setShape(@CheckForNull String shape)
    • getAnimation

      @NonNull public TileAnimation getAnimation()
    • setAnimation

      @DataBoundSetter public void setAnimation(@CheckForNull String animation)
    • getSizing

      @NonNull public Sizing getSizing()
    • setSizing

      @DataBoundSetter public void setSizing(@CheckForNull String sizing)
    • getSortBy

      @NonNull public SortBy getSortBy()
    • setSortBy

      @DataBoundSetter public void setSortBy(@CheckForNull String sortBy)
    • getStatusScope

      @NonNull public StatusScope getStatusScope()
    • setStatusScope

      @DataBoundSetter public void setStatusScope(@CheckForNull String statusScope)
    • getPacking

      @NonNull public Packing getPacking()
    • setPacking

      @DataBoundSetter public void setPacking(@CheckForNull String packing)
    • getTileGap

      public int getTileGap()
      Space between tiles in pixels. Zero by design: a wall, not a set of cards.
    • setTileGap

      @DataBoundSetter public void setTileGap(int tileGap)
    • getSeamWidth

      public int getSeamWidth()
      Width of the hairline of background colour drawn inside each tile's outline.
    • setSeamWidth

      @DataBoundSetter public void setSeamWidth(int seamWidth)
    • getRefreshSeconds

      public int getRefreshSeconds()
    • setRefreshSeconds

      @DataBoundSetter public void setRefreshSeconds(int refreshSeconds)
    • getMinTileHeight

      public int getMinTileHeight()
    • setMinTileHeight

      @DataBoundSetter public void setMinTileHeight(int minTileHeight)
    • isShowHeader

      public boolean isShowHeader()
    • setShowHeader

      @DataBoundSetter public void setShowHeader(boolean showHeader)
    • isShowFolderPath

      public boolean isShowFolderPath()
    • setShowFolderPath

      @DataBoundSetter public void setShowFolderPath(boolean showFolderPath)
    • isShowBuildNumber

      public boolean isShowBuildNumber()
    • setShowBuildNumber

      @DataBoundSetter public void setShowBuildNumber(boolean showBuildNumber)
    • isHideDisabled

      public boolean isHideDisabled()
    • setHideDisabled

      @DataBoundSetter public void setHideDisabled(boolean hideDisabled)
    • isBurnInProtection

      public boolean isBurnInProtection()
    • setBurnInProtection

      @DataBoundSetter public void setBurnInProtection(boolean burnInProtection)
    • getIncludeNames

      @CheckForNull public String getIncludeNames()
    • setIncludeNames

      @DataBoundSetter public void setIncludeNames(@CheckForNull String includeNames)
    • getExcludeNames

      @CheckForNull public String getExcludeNames()
    • setExcludeNames

      @DataBoundSetter public void setExcludeNames(@CheckForNull String excludeNames)
    • getNameReplaceRegex

      @CheckForNull public String getNameReplaceRegex()
    • setNameReplaceRegex

      @DataBoundSetter public void setNameReplaceRegex(@CheckForNull String nameReplaceRegex)
    • getCustomBackground

      @CheckForNull public String getCustomBackground()
    • setCustomBackground

      @DataBoundSetter public void setCustomBackground(@CheckForNull String customBackground)
    • getCustomSuccess

      @CheckForNull public String getCustomSuccess()
    • setCustomSuccess

      @DataBoundSetter public void setCustomSuccess(@CheckForNull String customSuccess)
    • getCustomFailure

      @CheckForNull public String getCustomFailure()
    • setCustomFailure

      @DataBoundSetter public void setCustomFailure(@CheckForNull String customFailure)
    • getCustomUnstable

      @CheckForNull public String getCustomUnstable()
    • setCustomUnstable

      @DataBoundSetter public void setCustomUnstable(@CheckForNull String customUnstable)
    • getCustomAborted

      @CheckForNull public String getCustomAborted()
    • setCustomAborted

      @DataBoundSetter public void setCustomAborted(@CheckForNull String customAborted)
    • getCustomIdle

      @CheckForNull public String getCustomIdle()
    • setCustomIdle

      @DataBoundSetter public void setCustomIdle(@CheckForNull String customIdle)
    • getCustomColors

      @NonNull public Map<String,String> getCustomColors()
      The custom colours that survived validation, keyed by background, success, failure, unstable, aborted and idle. Emitted as data-color-* attributes and applied by the browser as CSS custom properties, so an unset colour simply falls through to the built-in palette.
    • getEmptyMessage

      @NonNull public String getEmptyMessage()
      What to say when the wall has nothing on it. A problems-only wall being empty is the good outcome, and should read like one rather than like a misconfigured view.
    • getPaletteOptions

      public Palette[] getPaletteOptions()
    • getShapeOptions

      public TileShape[] getShapeOptions()
    • getAnimationOptions

      public TileAnimation[] getAnimationOptions()
    • getPackingOptions

      public Packing[] getPackingOptions()
    • getSortByOptions

      public SortBy[] getSortByOptions()
    • getTiles

      @NonNull public List<Tile> getTiles()
      Snapshots every job in the view that the current user may see, in the configured order.

      Cheap by design: for a job that is not building this touches nothing beyond the last build that rendering any Jenkins page would touch anyway, which is what makes a two second refresh across several hundred jobs affordable.

    • getTiles

      @NonNull public List<Tile> getTiles(@NonNull SortBy sort)
      Snapshots the wall in a given order. The order is a parameter rather than always the saved one so that the preview controls, and a kiosk URL, can try an ordering without anyone having to save it first.
    • getTiles

      @NonNull public List<Tile> getTiles(@NonNull SortBy sort, @NonNull io.jenkins.plugins.livewall.NameFilter filter)
      Snapshots the wall in a given order, keeping only the jobs a filter accepts.

      Order and filter are parameters rather than always the saved ones so that one view can feed several screens: the office TV shows everything, the team's monitor adds ?exclude=dev-*, and nobody has to maintain three views that drift apart.

    • doWall

      @GET public void doWall(org.kohsuke.stapler.StaplerRequest2 req, org.kohsuke.stapler.StaplerResponse2 rsp) throws IOException, jakarta.servlet.ServletException
      The standalone full-screen page, at <view>/wall. This is the URL a television points at: no Jenkins header, no side panel, nothing but the wall.
      Throws:
      IOException
      jakarta.servlet.ServletException
    • doWallData

      @GET public void doWallData(org.kohsuke.stapler.StaplerResponse2 rsp, @QueryParameter String sortBy, @QueryParameter String include, @QueryParameter String exclude) throws IOException
      Serves the wall contents. Polled by wall.js; also a perfectly usable API.
      Parameters:
      sortBy - optional ordering for this request only, so that the preview controls and a kiosk URL can try one without changing what is saved. Anything unrecognised falls back to the view's own setting.
      Throws:
      IOException
    • doSaveLook

      public void doSaveLook(org.kohsuke.stapler.StaplerResponse2 rsp, @QueryParameter String palette, @QueryParameter String shape, @QueryParameter String animation, @QueryParameter String packing, @QueryParameter String sortBy, @QueryParameter String gap, @QueryParameter String seam) throws IOException
      Persists the settings the preview bar can reach, so that a look arrived at by eye becomes the look the television gets.

      The preview controls deliberately change nothing on the server: you can try a palette on a wall of real jobs without committing to it. That leaves a gap, though — having found the right one, the only way to keep it was to reproduce the same choices in Configure from memory. This closes that gap without making the preview itself destructive.

      Only the seven settings the bar exposes are touched. Everything else the view carries is left exactly as it was, so this can never quietly undo something set in Configure.

      Throws:
      IOException
    • isLookSavable

      public boolean isLookSavable()
    • submit

      protected void submit(org.kohsuke.stapler.StaplerRequest2 req) throws IOException, jakarta.servlet.ServletException, Descriptor.FormException
      Overrides:
      submit in class ListView
      Throws:
      IOException
      jakarta.servlet.ServletException
      Descriptor.FormException