1 /**
2 * Copyright (c) 2012, University of Konstanz, Distributed Systems Group
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 * * Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * * Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 * * Neither the name of the University of Konstanz nor the
13 * names of its contributors may be used to endorse or promote products
14 * derived from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
17 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19 * DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY
20 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
27 package org.perfidix.result;
28
29 import java.lang.reflect.Method;
30 import java.util.HashSet;
31 import java.util.Set;
32
33 import org.perfidix.exceptions.AbstractPerfidixMethodException;
34 import org.perfidix.meter.AbstractMeter;
35 import org.perfidix.ouput.AbstractOutput;
36
37 /**
38 * This class holds the data of a complete Benchmark. Only one <code>BenchmarkResult</code> is generated per
39 * Benchmark-Run. The different
40 * components are {@link ClassResult} objects. This class is the container for
41 * the results of a Benchmark and therefore the input for different Outputs.
42 *
43 * @see org.perfidix.Benchmark
44 * @see AbstractOutput
45 * @author Sebastian Graf, University of Konstanz
46 * @author Alexander Onea, neue Couch
47 */
48 public final class BenchmarkResult extends AbstractResultContainer<ClassResult> {
49
50 /** All occured exceptions. */
51 private transient final Set<AbstractPerfidixMethodException> exceptions;
52
53 /** Outputs for listeners. */
54 private transient final AbstractOutput[] outputs;
55
56 /**
57 * Constructor.
58 *
59 * @param paramOutputs
60 * {@link AbstractOutput} instances for listener
61 */
62 public BenchmarkResult(final AbstractOutput... paramOutputs) {
63 super(null);
64 this.exceptions = new HashSet<AbstractPerfidixMethodException>();
65 outputs = paramOutputs;
66 }
67
68 /** {@inheritDoc} */
69 @Override
70 public String getElementName() {
71 return "Benchmark";
72 }
73
74 /**
75 * Adding a dataset to a given meter and adapting the underlaying result
76 * model.
77 *
78 * @param meth
79 * where the result is corresponding to
80 * @param meter
81 * where the result is corresponding to
82 * @param data
83 * the data itself
84 */
85 public void addData(final Method meth, final AbstractMeter meter, final double data) {
86
87 final Class<?> clazz = meth.getDeclaringClass();
88 if (!elements.containsKey(clazz)) {
89 elements.put(clazz, new ClassResult(clazz));
90 }
91
92 final ClassResult clazzResult = elements.get(clazz);
93 if (!clazzResult.elements.containsKey(meth)) {
94 clazzResult.elements.put(meth, new MethodResult(meth));
95 }
96
97 final MethodResult methodResult = clazzResult.elements.get(meth);
98 methodResult.addData(meter, data);
99 clazzResult.addData(meter, data);
100 this.addData(meter, data);
101
102 for (final AbstractOutput output : outputs) {
103 output.listenToResultSet(meth, meter, data);
104 }
105
106 }
107
108 /**
109 * Adding an exception to this result.
110 *
111 * @param exec
112 * the exception stored to this result
113 */
114 public void addException(final AbstractPerfidixMethodException exec) {
115 this.getExceptions().add(exec);
116 for (final AbstractOutput output : outputs) {
117 output.listenToException(exec);
118 }
119 }
120
121 /**
122 * Getter for member exceptions.
123 *
124 * @return the exceptions
125 */
126 public Set<AbstractPerfidixMethodException> getExceptions() {
127 return exceptions;
128 }
129
130 /**
131 * {@inheritDoc}
132 */
133 @Override
134 public String toString() {
135 final StringBuilder builder = new StringBuilder(super.toString());
136 builder.append("\nexceptions: ").append(getExceptions());
137 return builder.toString();
138 }
139
140 }