Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Grouping: Added the option to display the job name without the leading folders. #81

Open
wants to merge 10 commits into
base: master
Choose a base branch
from
Open
5 changes: 4 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,10 @@
.project
.settings/

#JEnv
.java-version

target
work*

node_modules
node_modules
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,7 @@ If you'd like to get hold of the latest and greatest build of the Build Monitor
before it's available in the Jenkins Update Centre, you can [download it](http://bit.ly/JBMLatestBuild) from the [SmartCode Open-Source](http://bit.ly/SmartCodeOSCI) Jenkins CI server,
kindly hosted by [CloudBees](http://bit.ly/JBMFOSS).

[![built on dev@cloud](http://cloudbees.prod.acquia-sites.com/sites/default/files/styles/large/public/Button-Built-on-CB-1.png?itok=3Tnkun-C)](http://bit.ly/JBMFOSS)
[![built on dev@cloud](https://www.cloudbees.com/sites/default/files/styles/large/public/Button-Built-on-CB-1.png?itok=3Tnkun-C)](http://bit.ly/JBMFOSS)

## (A)TDD

Expand Down
2 changes: 1 addition & 1 deletion pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@

<groupId>org.jenkins-ci.plugins</groupId>
<artifactId>build-monitor-plugin</artifactId>
<version>1.6-SNAPSHOT</version>
<version>1.6+build.140</version>
<packaging>hpi</packaging>

<name>Build Monitor View</name>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,8 +35,10 @@ public void init(FilterConfig filterConfig) throws ServletException {

@Override
public void doFilter(final ServletRequest request, final ServletResponse response, FilterChain chain) throws IOException, ServletException {
String path = ((HttpServletRequest) request).getPathInfo();
if (path == null) path = ((HttpServletRequest) request).getServletPath()
String path = ((HttpServletRequest) request).getPathInfo();
if (path == null) {
path = ((HttpServletRequest) request).getServletPath();
}

if (path != null && path.matches(pathToCSS)) {
sendCSS(response);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,12 @@
*/
public class BuildMonitorView extends ListView {

private boolean displayRelativeName = true;

public boolean isDisplayRelativeName() {
return displayRelativeName;
}

/**
* @param name Name of the view
*/
Expand Down Expand Up @@ -105,6 +111,13 @@ protected void submit(StaplerRequest req) throws ServletException, IOException,
} catch (Exception e) {
throw new FormException("Can't order projects by " + requestedOrdering, "order");
}

String requestedNameWithFolders = req.getParameter("displayRelativeName");
if (requestedNameWithFolders != null && requestedNameWithFolders.equals("on")) {
displayRelativeName = true;
} else {
displayRelativeName = false;
}
}

// defensive coding to avoid issues when Jenkins instantiates the plugin without populating its fields
Expand Down Expand Up @@ -157,7 +170,7 @@ private List<JobView> jobViews() {
Collections.sort(projects, currentOrderOrDefault());

for (AbstractProject project : projects) {
jobs.add(JobView.of(project, withAugmentationsIfTheyArePresent()));
jobs.add(JobView.of(project, withAugmentationsIfTheyArePresent(), displayRelativeName));
}

return jobs;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package com.smartcodeltd.jenkinsci.plugins.buildmonitor.order;

import hudson.model.AbstractProject;

import java.util.Comparator;

public class ByFullName implements Comparator<AbstractProject> {
@Override
public int compare(AbstractProject a, AbstractProject b) {
return a.getFullName().compareToIgnoreCase(b.getFullName());
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
package com.smartcodeltd.jenkinsci.plugins.buildmonitor.viewmodel;

import com.smartcodeltd.jenkinsci.plugins.buildmonitor.facade.RelativeLocation;
import com.smartcodeltd.jenkinsci.plugins.buildmonitor.viewmodel.duration.Duration;
import com.smartcodeltd.jenkinsci.plugins.buildmonitor.viewmodel.duration.HumanReadableDuration;
import com.smartcodeltd.jenkinsci.plugins.buildmonitor.viewmodel.duration.DurationInMilliseconds;
import com.smartcodeltd.jenkinsci.plugins.buildmonitor.viewmodel.plugins.BuildAugmentor;
import com.smartcodeltd.jenkinsci.plugins.buildmonitor.viewmodel.plugins.bfa.Analysis;
import com.smartcodeltd.jenkinsci.plugins.buildmonitor.viewmodel.plugins.claim.Claim;
Expand Down Expand Up @@ -60,17 +63,22 @@ private boolean isRunning(Run<?, ?> build) {

@Override
public Duration elapsedTime() {
return new Duration(now() - whenTheBuildStarted());
return new HumanReadableDuration(now() - whenTheBuildStarted());
}

@Override
public Duration timeElapsedSince() {
return new DurationInMilliseconds(now() - (whenTheBuildStarted() + build.getDuration()));
}

@Override
public Duration duration() {
return new Duration(build.getDuration());
return new HumanReadableDuration(build.getDuration());
}

@Override
public Duration estimatedDuration() {
return new Duration(build.getEstimatedDuration());
return new HumanReadableDuration(build.getEstimatedDuration());
}

@Override
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.smartcodeltd.jenkinsci.plugins.buildmonitor.viewmodel;

import com.smartcodeltd.jenkinsci.plugins.buildmonitor.viewmodel.duration.Duration;
import hudson.model.Result;

import java.util.List;
Expand All @@ -12,6 +13,7 @@ public interface BuildViewModel {

public boolean isRunning();
public Duration elapsedTime();
public Duration timeElapsedSince();
public Duration duration();
public Duration estimatedDuration();
public int progress();
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.smartcodeltd.jenkinsci.plugins.buildmonitor.viewmodel;

import com.smartcodeltd.jenkinsci.plugins.buildmonitor.facade.RelativeLocation;
import com.smartcodeltd.jenkinsci.plugins.buildmonitor.viewmodel.duration.Duration;
import com.smartcodeltd.jenkinsci.plugins.buildmonitor.viewmodel.plugins.BuildAugmentor;
import hudson.model.Job;
import hudson.model.Result;
Expand All @@ -19,6 +20,7 @@ public class JobView {
private final Job<?, ?> job;
private final BuildAugmentor augmentor;
private final RelativeLocation relative;
private final boolean displayRelativeName;

private final static Map<Result, String> statuses = new HashMap<Result, String>() {{
put(SUCCESS, "successful");
Expand All @@ -28,24 +30,32 @@ public class JobView {
}};

public static JobView of(Job<?, ?> job) {
return new JobView(job, new BuildAugmentor(), RelativeLocation.of(job), new Date());
return new JobView(job, new BuildAugmentor(), RelativeLocation.of(job), new Date(), true);
}

public static JobView of(Job<?, ?> job, BuildAugmentor augmentor) {
return new JobView(job, augmentor, RelativeLocation.of(job), new Date());
return new JobView(job, augmentor, RelativeLocation.of(job), new Date(), true);
}

public static JobView of(Job<?, ?> job, BuildAugmentor augmentor, boolean displayRelativeName) {
return new JobView(job, augmentor, RelativeLocation.of(job), new Date(), displayRelativeName);
}

public static JobView of(Job<?, ?> job, RelativeLocation location) {
return new JobView(job, new BuildAugmentor(), location, new Date());
return new JobView(job, new BuildAugmentor(), location, new Date(), true);
}

public static JobView of(Job<?, ?> job, Date systemTime) {
return new JobView(job, new BuildAugmentor(), RelativeLocation.of(job), systemTime);
return new JobView(job, new BuildAugmentor(), RelativeLocation.of(job), systemTime, true);
}

@JsonProperty
public String name() {
return relative.name();
if (displayRelativeName){
return relative.name();
} else {
return job.getDisplayName();
}
}

@JsonProperty
Expand Down Expand Up @@ -96,6 +106,11 @@ public String estimatedDuration() {
return formatted(lastBuild().estimatedDuration());
}

@JsonProperty
public String timeElapsedSinceLastBuild() {
return formatted(lastCompletedBuild().timeElapsedSince());
}

private String formatted(Duration duration) {
return null != duration
? duration.toString()
Expand Down Expand Up @@ -161,11 +176,12 @@ public String toString() {
}


private JobView(Job<?, ?> job, BuildAugmentor augmentor, RelativeLocation relative, Date systemTime) {
private JobView(Job<?, ?> job, BuildAugmentor augmentor, RelativeLocation relative, Date systemTime, Boolean displayRelativeName) {
this.job = job;
this.augmentor = augmentor;
this.systemTime = systemTime;
this.relative = relative;
this.displayRelativeName = displayRelativeName;
}

private BuildViewModel lastBuild() {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.smartcodeltd.jenkinsci.plugins.buildmonitor.viewmodel;

import com.smartcodeltd.jenkinsci.plugins.buildmonitor.viewmodel.duration.Duration;
import hudson.model.Result;

import java.util.HashSet;
Expand Down Expand Up @@ -33,6 +34,11 @@ public Duration elapsedTime() {
return null;
}

@Override
public Duration timeElapsedSince() {
return null;
}

@Override
public Duration duration() {
return null;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package com.smartcodeltd.jenkinsci.plugins.buildmonitor.viewmodel.duration;

abstract public class Duration {

protected final long duration;

public Duration(long milliseconds) {
this.duration = milliseconds;
}

abstract public String toString();

public boolean greaterThan(Duration otherDuration) {
return duration > otherDuration.toLong();
}

private long toLong() {
return duration;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package com.smartcodeltd.jenkinsci.plugins.buildmonitor.viewmodel.duration;

public class DurationInMilliseconds extends Duration {

public DurationInMilliseconds(long milliseconds) {
super(milliseconds);
}

@Override
public String toString() {
return String.valueOf(duration);
}
}
Original file line number Diff line number Diff line change
@@ -1,34 +1,29 @@
package com.smartcodeltd.jenkinsci.plugins.buildmonitor.viewmodel;

class Duration {//todo: extract the Duration class, or move it to a BuildView class

private final long duration;
package com.smartcodeltd.jenkinsci.plugins.buildmonitor.viewmodel.duration;

// todo: is this still needed? backend could pass the duration in milliseconds to the frontend, which in turn could make it human-readable
public class HumanReadableDuration extends Duration {
private final static long MILLISECOND = 1;
private final static long SECONDS = 1000 * MILLISECOND;
private final static long MINUTES = 60 * SECONDS;
private final static long HOURS = 60 * MINUTES;

public Duration(long milliseconds) {
this.duration = milliseconds;
public HumanReadableDuration(long milliseconds) {
super(milliseconds);
}

public long hours() {
private long hours() {
return duration / HOURS;
}

public long minutes() {
private long minutes() {
return (duration - (hours() * HOURS)) / MINUTES;
}

public long seconds() {
private long seconds() {
return (duration - (hours() * HOURS) - (minutes() * MINUTES)) / SECONDS;
}

public boolean greaterThan(Duration otherDuration) {
return duration > otherDuration.toLong();
}

@Override
public String toString() {
String formatted;

Expand All @@ -38,9 +33,4 @@ public String toString() {

return formatted;
}


private long toLong() {
return duration;
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -56,8 +56,13 @@
<select name="order" class="setting-input">
<f:option value="ByName" selected='${it.currentOrder()=="ByName"}'>${%Name}</f:option>
<f:option value="ByDisplayName" selected="${it.currentOrder()=='ByDisplayName'}">${%Display name}</f:option>
<f:option value="ByFullName" selected="${it.currentOrder()=='ByFullName'}">${%Full name}</f:option>
</select>
</f:entry>

<f:entry title="${%Display relative Job Name?}" field="displayRelativeName">
<f:checkbox name="displayRelativeName" default="true"/>
</f:entry>

</f:section>

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,7 @@

<script src="${resourcesURL}/scripts/app.js"></script>
<script src="${resourcesURL}/scripts/cron.js"></script>
<script src="${resourcesURL}/scripts/filters.js"></script>
<script src="${resourcesURL}/scripts/services.js"></script>
<script src="${resourcesURL}/scripts/jenkins.js"></script>
<script src="${resourcesURL}/scripts/controllers.js"></script>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,10 +29,14 @@
title="Details of {{job.name}}, build {{job.lastBuildName}}"
href="{{job.lastBuildUrl}}">{{job.lastBuildName}}</a>

<div data-ng-show="!!job.estimatedDuration" class="build-time">
<span class="elapsed" data-ng-show="job.progress > 0">{{job.lastBuildDuration}}</span>
<div data-ng-show="!!job.estimatedDuration &amp;&amp; job.progress > 0" class="build-time">
<span class="elapsed">{{job.lastBuildDuration}}</span>
<span class="estimated">{{job.estimatedDuration}}</span>
</div>

<div data-ng-show="!!job.timeElapsedSinceLastBuild &amp;&amp; job.progress == 0" class="build-time">
<span class="estimated">{{job.timeElapsedSinceLastBuild | estimatedTimeElapsedSince}}</span>
</div>
</div>
</li>
</ul>
7 changes: 6 additions & 1 deletion src/main/webapp/scripts/app.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,12 @@
'use strict';

angular.
module('buildMonitor', [ 'buildMonitor.controllers', 'buildMonitor.settings', 'slugifier' ]).
module('buildMonitor', [
'buildMonitor.controllers',
'buildMonitor.filters',
'buildMonitor.settings',
'slugifier'
]).
run(['$rootScope', 'notifyUser', function($rootScope, notifyUser) {
$rootScope.settings = { };

Expand Down
Loading