/** * Copyright (c) 2009 - 2010 AppWork UG(haftungsbeschränkt) <e-mail@appwork.org> * * This file is part of org.appwork.utils.net.throttledconnection * * This software is licensed under the Artistic License 2.0, * see the LICENSE file or http://www.opensource.org/licenses/artistic-license-2.0.php * for details */ package org.appwork.utils.net.throttledconnection; import java.io.OutputStream; import org.appwork.utils.speedmeter.SpeedMeterInterface; /** * @author daniel * */ public class MeteredThrottledOutputStream extends ThrottledOutputStream implements SpeedMeterInterface { private SpeedMeterInterface speedmeter = null; private long time = 0; private long speed = 0; private long lastTime; private long lastTrans; private long transferedCounter3; private final Object LOCK = new Object(); /** * @param out */ public MeteredThrottledOutputStream(OutputStream out) { super(out); } public MeteredThrottledOutputStream(OutputStream out, SpeedMeterInterface speedmeter) { super(out); this.speedmeter = speedmeter; } /* * (non-Javadoc) * * @see org.appwork.utils.SpeedMeterInterface#getSpeedMeter() */ public long getSpeedMeter() { synchronized (LOCK) { if (time == 0) { time = System.currentTimeMillis(); transferedCounter3 = transferedCounter; return 0; } if (System.currentTimeMillis() - time < 1000) { if (speedmeter != null) return speedmeter.getSpeedMeter(); return speed; } lastTime = System.currentTimeMillis() - time; time = System.currentTimeMillis(); lastTrans = transferedCounter - transferedCounter3; transferedCounter3 = transferedCounter; if (speedmeter != null) { speedmeter.putSpeedMeter(lastTrans, lastTime); speed = speedmeter.getSpeedMeter(); return speed; } else { speed = (lastTrans / lastTime) * 1000; return speed; } } } /* * (non-Javadoc) * * @see org.appwork.utils.SpeedMeterInterface#putSpeedMeter(long, long) */ public void putSpeedMeter(long bytes, long time) { } /* * (non-Javadoc) * * @see org.appwork.utils.SpeedMeterInterface#resetSpeedMeter() */ public void resetSpeedMeter() { synchronized (LOCK) { if (speedmeter != null) speedmeter.resetSpeedMeter(); time = System.currentTimeMillis(); speed = 0; transferedCounter3 = transferedCounter; } } }