| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| package org.apache.slider.common.tools; |
| |
| import java.io.Closeable; |
| |
| /** |
| * A duration in milliseconds. This class can be used |
| * to count time, and to be polled to see if a time limit has |
| * passed. |
| */ |
| public class Duration implements Closeable { |
| public long start, finish; |
| public final long limit; |
| |
| /** |
| * Create a duration instance with a limit of 0 |
| */ |
| public Duration() { |
| this(0); |
| } |
| |
| /** |
| * Create a duration with a limit specified in millis |
| * @param limit duration in milliseconds |
| */ |
| public Duration(long limit) { |
| this.limit = limit; |
| } |
| |
| /** |
| * Start |
| * @return self |
| */ |
| public Duration start() { |
| start = now(); |
| return this; |
| } |
| |
| /** |
| * The close operation relays to {@link #finish()}. |
| * Implementing it allows Duration instances to be automatically |
| * finish()'d in Java7 try blocks for when used in measuring durations. |
| */ |
| @Override |
| public final void close() { |
| finish(); |
| } |
| |
| public void finish() { |
| finish = now(); |
| } |
| |
| protected long now() { |
| return System.currentTimeMillis(); |
| } |
| |
| public long getInterval() { |
| return finish - start; |
| } |
| |
| /** |
| * return true if the limit has been exceeded |
| * @return true if a limit was set and the current time |
| * exceeds it. |
| */ |
| public boolean getLimitExceeded() { |
| return limit >= 0 && ((now() - start) > limit); |
| } |
| |
| @Override |
| public String toString() { |
| StringBuilder builder = new StringBuilder(); |
| builder.append("Duration"); |
| if (finish >= start) { |
| builder.append(" finished at ").append(getInterval()).append(" millis;"); |
| } else { |
| if (start > 0) { |
| builder.append(" started but not yet finished;"); |
| } else { |
| builder.append(" unstarted;"); |
| } |
| } |
| if (limit > 0) { |
| builder.append(" limit: ").append(limit).append(" millis"); |
| if (getLimitExceeded()) { |
| builder.append(" - exceeded"); |
| } |
| } |
| |
| return builder.toString(); |
| } |
| |
| |
| } |