/*
*
* Copyright (c) void.fm
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification,
* are permitted provided that the following conditions are met:
*
* Redistributions of source code must retain the above copyright notice, this list
* of conditions and the following disclaimer.
*
* Redistributions in binary form must reproduce the above copyright notice, this
* list of conditions and the following disclaimer in the documentation and/or
* other materials provided with the distribution.
*
* Neither the name void.fm nor the names of its contributors may be
* used to endorse or promote products derived from this software without specific
* prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
* OF THE POSSIBILITY OF SUCH DAMAGE.
*
*/
package etm.core;
import etm.core.aggregation.Aggregator;
import etm.core.aggregation.RootAggregator;
import etm.core.configuration.EtmMonitorFactory;
import etm.core.metadata.AggregatorMetaData;
import etm.core.monitor.EtmMonitor;
import etm.core.monitor.EtmMonitorContext;
import etm.core.monitor.EtmPoint;
import etm.core.monitor.NestedMonitor;
import etm.core.renderer.MeasurementRenderer;
import etm.core.timer.DefaultTimer;
import etm.core.timer.ExecutionTimer;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
/**
* Test class for test point generation
*
* @author void.fm
* @version $Revision$
*/
public class TestPointGenerator {
ExecutionTimer timer = EtmMonitorFactory.bestAvailableTimer();
CollectingAggregator aggregator = new CollectingAggregator(new RootAggregator());
EtmMonitor monitor = new NestedMonitor(timer, aggregator);
boolean autoStart = true;
public TestPointGenerator() {
}
public TestPointGenerator(EtmMonitor aMonitor) {
monitor = aMonitor;
}
public TestPointGenerator(EtmMonitor aMonitor, boolean aAutoStart) {
monitor = aMonitor;
autoStart = aAutoStart;
}
public EtmPoint getEtmPoint() {
if (autoStart) {
monitor.start();
}
try {
EtmPoint point = monitor.createPoint("Testpoint");
try {
Thread.sleep((long) (10d * Math.random()));
} catch (InterruptedException e) {
// ignored
} finally {
point.collect();
}
return point;
} finally {
if (autoStart) {
monitor.stop();
}
}
}
public List getEtmPoints(int topLevel, int nestedSize) {
if (autoStart) {
monitor.start();
}
try {
for (int i = 0; i < topLevel; i++) {
EtmPoint parent = monitor.createPoint("Parent::" + i);
try {
Thread.sleep((long) (10d * Math.random()));
if (nestedSize > 1) {
doNested(i, 0, nestedSize);
}
} catch (InterruptedException e) {
// ignored
} finally {
parent.collect();
}
}
//monitor.render(new SimpleTextRenderer());
return aggregator.getPoints();
} finally {
if (autoStart) {
monitor.stop();
}
}
}
public Map getAggregates(int topLevel, int nestedSize) {
for (int i = 0; i < topLevel; i++) {
EtmPoint parent = monitor.createPoint("Testpoint" + i);
try {
Thread.sleep((long) (10d * Math.random()));
if (nestedSize > 1) {
doNested(i, 0, nestedSize);
}
} catch (InterruptedException e) {
// ignored
} finally {
parent.collect();
}
}
DummyRenderer renderer = new DummyRenderer();
monitor.render(renderer);
//monitor.render(new SimpleTextRenderer());
return renderer.getPoints();
}
private void doNested(final int parentId, final int currentLevel, final int maxLevel) {
int flatCounter = 0;
doFlat(parentId, currentLevel, maxLevel, flatCounter);
while (Math.random() < 0.2) {
flatCounter++;
doFlat(parentId, currentLevel, maxLevel, flatCounter);
}
}
private void doFlat(final int parentId, final int currentLevel, final int maxLevel, final int flatCounter) {
EtmPoint point = monitor.createPoint( "N" + parentId + "-L" + currentLevel + "-C" + flatCounter);
try {
Thread.sleep((long) (10d * Math.random()));
if (currentLevel < maxLevel) {
doNested(parentId, currentLevel + 1, maxLevel);
}
} catch (InterruptedException e) {
// ignored
} finally {
point.collect();
}
}
class DummyRenderer implements MeasurementRenderer {
private Map points;
public Map getPoints() {
return points;
}
public void render(Map somePoints) {
points = somePoints;
}
}
class CollectingAggregator implements Aggregator {
private List points = new ArrayList();
private Aggregator delegate;
public List getPoints() {
return points;
}
public CollectingAggregator(Aggregator aDelegate) {
delegate = aDelegate;
}
public void add(EtmPoint point) {
points.add(point);
delegate.add(point);
}
public void flush() {
}
public void reset() {
}
public void reset(String symbolicName) {
}
public void render(MeasurementRenderer renderer) {
delegate.render(renderer);
}
public AggregatorMetaData getMetaData() {
return new AggregatorMetaData(CollectingAggregator.class, "Helper aggregator", false, delegate.getMetaData());
}
public void start() {
}
public void stop() {
}
public void init(EtmMonitorContext ctx) {
delegate.init(ctx);
}
}
}