/* * Copyright 2008 the original author or authors. * Copyright 2005 Sun Microsystems, Inc. * * Licensed 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.rioproject.impl.watch; import net.jini.config.Configuration; import org.rioproject.watch.Calculable; import org.rioproject.watch.StopWatchCalculable; import org.rioproject.watch.WatchDataSource; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; /** * A Watch for capturing elapsed time */ public class StopWatch extends ThresholdWatch implements StopWatchMBean { public static final String VIEW = "org.rioproject.watch.ResponseTimeCalculableView"; /** Table of thread ids, and recorded start time.*/ private final ConcurrentMap <Long, Long> startTimeTable = new ConcurrentHashMap<Long, Long>(); /** * Creates new Stop Watch * * @param id the identifier for this watch */ public StopWatch(String id) { super(id); setView(VIEW); } /** * Creates new StopWatch, creates and exports a * WatchDataSourceImpl if the WatchDataSource is null using the * Configuration object provided * * @param id The identifier for this watch * @param config Configuration object used for constructing a WatchDataSource */ public StopWatch(String id, Configuration config) { super(id, config); setView(VIEW); } /** * Creates new Stop Watch * * @param watchDataSource the watch data source associated with this watch * @param id the identifier for this watch */ @SuppressWarnings("unused") public StopWatch(WatchDataSource watchDataSource, String id) { super(watchDataSource, id); setView(VIEW); } /** * @see StopWatchMBean#startTiming */ public void startTiming() { setStartTime(System.currentTimeMillis()); } /** * @see StopWatchMBean#stopTiming */ public void stopTiming() { long now = System.currentTimeMillis(); long startTime = getStartTime(); long elapsed = now - startTime; setElapsedTime(elapsed, now); } /** * @see StopWatchMBean#stopTiming */ public void stopTiming(String detail) { long now = System.currentTimeMillis(); long startTime = getStartTime(); long elapsed = now - startTime; setElapsedTime(elapsed, now, detail); } /** * @see StopWatchMBean#setElapsedTime(long) */ public void setElapsedTime(long elapsed) { setElapsedTime(elapsed, System.currentTimeMillis()); } public void setElapsedTime(long elapsed, String detail) { setElapsedTime(elapsed, System.currentTimeMillis(), detail); } /** * @see StopWatchMBean#setElapsedTime(long, long) */ public void setElapsedTime(long elapsed, long now) { addWatchRecord(new StopWatchCalculable(id, elapsed, now)); } public void setElapsedTime(long elapsed, long now, String detail) { Calculable calculable = new StopWatchCalculable(id, elapsed, now); calculable.setDetail(detail); addWatchRecord(calculable); } /** * @see StopWatchMBean#getStartTime */ public long getStartTime() { Long startTime = startTimeTable.get(Thread.currentThread().getId()); return startTime==null?0:startTime; } /** * @see StopWatchMBean#setStartTime(long) */ public void setStartTime(long startTime) { Long key = Thread.currentThread().getId(); if(startTimeTable.containsKey(key)) { startTimeTable.replace(key, startTime); } else { startTimeTable.put(key, startTime); } } }