// Path: src/main/java/com/lassekoskela/time/Clock.java
// public class Clock {
// 	private static TimeSource timesource = new SystemClock();
// 
// 	public static long now() {
// 		return timesource.now();
// 	}
// 
// 	public static void freeze() {
// 		FakeClock fakeClock = new FakeClock(now());
// 		timesource = fakeClock;
// 	}
// 
// 	public static void advance(long milliseconds) {
// 		timesource.advance(milliseconds);
// 	}
// 
// 	public static void reset() {
// 		timesource = new SystemClock();
// 	}
// 
// 	private static abstract class TimeSource {
// 		public abstract long now();
// 
// 		public void advance(long milliseconds)
// 				throws UnsupportedOperationException {
// 			String msg = "Advancing time is not supported by "
// 					+ getClass().getName();
// 			throw new UnsupportedOperationException(msg);
// 		}
// 	}
// 
// 	private static class SystemClock extends TimeSource {
// 		@Override
// 		public long now() {
// 			return System.currentTimeMillis();
// 		}
// 	}
// 
// 	private static class FakeClock extends TimeSource {
// 		private long now;
// 
// 		public FakeClock(long now) {
// 			this.now = now;
// 		}
// 
// 		@Override
// 		public long now() {
// 			return now;
// 		}
// 
// 		public void advance(long milliseconds)
// 				throws UnsupportedOperationException {
// 			now += milliseconds;
// 		}
// 	}
// }
// 
// Path: src/main/java/com/lassekoskela/time/Duration.java
// public class Duration {
// 	private static final int MILLIS_IN_HOUR = 60 * 60 * 1000;
// 	private static final int MILLIS_IN_MINUTE = 60 * 1000;
// 	private static final int MILLIS_IN_SECOND = 1000;
// 
// 	private long hours;
// 	private long minutes;
// 	private long seconds;
// 	private long millis;
// 	private final long inMilliseconds;
// 
// 	public Duration(long milliseconds) {
// 		inMilliseconds = milliseconds;
// 		calculateTimeUnitsFrom(milliseconds);
// 	}
// 
// 	@Override
// 	public int hashCode(){
// 		return Objects.hashCode(inMilliseconds);
// 	}
// 	
// 	@Override
// 	public boolean equals(Object obj) {
// 		if (!obj.getClass().equals(getClass())) {
// 			return false;
// 		}
// 		return this.inMilliseconds == ((Duration) obj).inMilliseconds;
// 	}
// 
// 	private void calculateTimeUnitsFrom(long remainingMillis) {
// 		// hours
// 		hours = remainingMillis / MILLIS_IN_HOUR;
// 		remainingMillis -= (hours * MILLIS_IN_HOUR);
// 		// minutes
// 		minutes = remainingMillis / MILLIS_IN_MINUTE;
// 		remainingMillis -= (minutes * MILLIS_IN_MINUTE);
// 		// seconds
// 		seconds = remainingMillis / MILLIS_IN_SECOND;
// 		remainingMillis -= (seconds * MILLIS_IN_SECOND);
// 		// milliseconds
// 		millis = remainingMillis;
// 	}
// 
// 	@Override
// 	public String toString() {
// 		StringBuilder s = new StringBuilder();
// 		if (hours > 0) {
// 			s.append(" ").append(hours).append("h");
// 		}
// 		if (minutes > 0) {
// 			s.append(" ").append(minutes).append("m");
// 		}
// 		if (seconds > 0) {
// 			s.append(" ").append(seconds).append("s");
// 		}
// 		if (millis > 0) {
// 			s.append(" ").append(millis).append("ms");
// 		}
// 		return s.toString().trim();
// 	}
// 
// 	public long inMillis() {
// 		return inMilliseconds;
// 	}
// 
// 	public double inSeconds() {
// 		return inMillis() / 1000.0;
// 	}
// 
// 	public double percentageOf(long milliseconds) {
// 		return (inMillis() * 100.0) / milliseconds;
// 	}
// 
// 	public double percentageOf(Duration duration) {
// 		return percentageOf(duration.inMillis());
// 	}
// }


import com.lassekoskela.time.Clock;
import com.lassekoskela.time.Duration;
package com.lassekoskela.maven.buildevents;


public class BuildStep {
	public final String project, phase, groupId, artifactId, goal;
	private long startedAt, endedAt;

	public BuildStep(String project, String phase, String groupId, String artifactId,
			String goal) {
		this.project = project;
		this.phase = phase;
		this.groupId = groupId;
		this.artifactId = artifactId;
		this.goal = goal;
	}

	public Duration duration() {
		return new Duration(endedAt - startedAt);
	}

	public void end() {
		this.endedAt = Clock.now();
	}

	public void start() {
// Path: src/main/java/com/lassekoskela/time/Clock.java
// public class Clock {
// 	private static TimeSource timesource = new SystemClock();
// 
// 	public static long now() {
// 		return timesource.now();
// 	}
// 
// 	public static void freeze() {
// 		FakeClock fakeClock = new FakeClock(now());
// 		timesource = fakeClock;
// 	}
// 
// 	public static void advance(long milliseconds) {
// 		timesource.advance(milliseconds);
// 	}
// 
// 	public static void reset() {
// 		timesource = new SystemClock();
// 	}
// 
// 	private static abstract class TimeSource {
// 		public abstract long now();
// 
// 		public void advance(long milliseconds)
// 				throws UnsupportedOperationException {
// 			String msg = "Advancing time is not supported by "
// 					+ getClass().getName();
// 			throw new UnsupportedOperationException(msg);
// 		}
// 	}
// 
// 	private static class SystemClock extends TimeSource {
// 		@Override
// 		public long now() {
// 			return System.currentTimeMillis();
// 		}
// 	}
// 
// 	private static class FakeClock extends TimeSource {
// 		private long now;
// 
// 		public FakeClock(long now) {
// 			this.now = now;
// 		}
// 
// 		@Override
// 		public long now() {
// 			return now;
// 		}
// 
// 		public void advance(long milliseconds)
// 				throws UnsupportedOperationException {
// 			now += milliseconds;
// 		}
// 	}
// }
// 
// Path: src/main/java/com/lassekoskela/time/Duration.java
// public class Duration {
// 	private static final int MILLIS_IN_HOUR = 60 * 60 * 1000;
// 	private static final int MILLIS_IN_MINUTE = 60 * 1000;
// 	private static final int MILLIS_IN_SECOND = 1000;
// 
// 	private long hours;
// 	private long minutes;
// 	private long seconds;
// 	private long millis;
// 	private final long inMilliseconds;
// 
// 	public Duration(long milliseconds) {
// 		inMilliseconds = milliseconds;
// 		calculateTimeUnitsFrom(milliseconds);
// 	}
// 
// 	@Override
// 	public int hashCode(){
// 		return Objects.hashCode(inMilliseconds);
// 	}
// 	
// 	@Override
// 	public boolean equals(Object obj) {
// 		if (!obj.getClass().equals(getClass())) {
// 			return false;
// 		}
// 		return this.inMilliseconds == ((Duration) obj).inMilliseconds;
// 	}
// 
// 	private void calculateTimeUnitsFrom(long remainingMillis) {
// 		// hours
// 		hours = remainingMillis / MILLIS_IN_HOUR;
// 		remainingMillis -= (hours * MILLIS_IN_HOUR);
// 		// minutes
// 		minutes = remainingMillis / MILLIS_IN_MINUTE;
// 		remainingMillis -= (minutes * MILLIS_IN_MINUTE);
// 		// seconds
// 		seconds = remainingMillis / MILLIS_IN_SECOND;
// 		remainingMillis -= (seconds * MILLIS_IN_SECOND);
// 		// milliseconds
// 		millis = remainingMillis;
// 	}
// 
// 	@Override
// 	public String toString() {
// 		StringBuilder s = new StringBuilder();
// 		if (hours > 0) {
// 			s.append(" ").append(hours).append("h");
// 		}
// 		if (minutes > 0) {
// 			s.append(" ").append(minutes).append("m");
// 		}
// 		if (seconds > 0) {
// 			s.append(" ").append(seconds).append("s");
// 		}
// 		if (millis > 0) {
// 			s.append(" ").append(millis).append("ms");
// 		}
// 		return s.toString().trim();
// 	}
// 
// 	public long inMillis() {
// 		return inMilliseconds;
// 	}
// 
// 	public double inSeconds() {
// 		return inMillis() / 1000.0;
// 	}
// 
// 	public double percentageOf(long milliseconds) {
// 		return (inMillis() * 100.0) / milliseconds;
// 	}
// 
// 	public double percentageOf(Duration duration) {
// 		return percentageOf(duration.inMillis());
// 	}
// }


// Path: src/main/java/com/lassekoskela/maven/buildevents/BuildStep.java
import com.lassekoskela.time.Clock;
import com.lassekoskela.time.Duration;

package com.lassekoskela.maven.buildevents;


public class BuildStep {
	public final String project, phase, groupId, artifactId, goal;
	private long startedAt, endedAt;

	public BuildStep(String project, String phase, String groupId, String artifactId,
			String goal) {
		this.project = project;
		this.phase = phase;
		this.groupId = groupId;
		this.artifactId = artifactId;
		this.goal = goal;
	}

	public Duration duration() {
		return new Duration(endedAt - startedAt);
	}

	public void end() {
		this.endedAt = Clock.now();
	}

	public void start() {
		startedAt = Clock.now();