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.socketadapter; 28 29 import java.util.HashMap; 30 import java.util.Map; 31 import java.util.Set; 32 33 import org.perfidix.element.BenchmarkMethod; 34 import org.perfidix.exceptions.AbstractPerfidixMethodException; 35 import org.perfidix.exceptions.SocketViewException; 36 import org.perfidix.meter.AbstractMeter; 37 38 /** 39 * This class creates the connection to the eclipse view via {@link SocketViewStub}. It contains the methods 40 * which update the view to 41 * inform about the bench process progress. 42 * 43 * @author Lewandowski Lukas, University of Konstanz 44 */ 45 public final class SocketViewProgressUpdater implements IUpdater { 46 47 private final transient SocketViewStub viewStub; 48 private transient int meterHash = 0; 49 private transient boolean regMeterHash = false; 50 51 /** 52 * The constructor initializes the host and port for creation a client 53 * socket. 54 * 55 * @param host 56 * Host is the host name of the view provider. 57 * @param port 58 * Port represent the port number of the eclipse view. 59 * @throws SocketViewException 60 */ 61 public SocketViewProgressUpdater(final String host, final int port) throws SocketViewException { 62 String strubParam = host; 63 if (host == null || host.equals("")) { 64 strubParam = "localhost"; 65 } 66 viewStub = new SocketViewStub(strubParam, port); 67 68 } 69 70 /** 71 * This method initializes the values of the eclipse view and resets the 72 * progress bar. 73 * 74 * @param mapping 75 * a mapping with all methods to benchmark and the related runs 76 * @throws SocketViewException 77 */ 78 public boolean initProgressView(final Map<BenchmarkMethod, Integer> mapping) throws SocketViewException { 79 if (mapping != null) { 80 final Set<BenchmarkMethod> methodSet = mapping.keySet(); 81 82 final Map<String, Integer> finalMap = new HashMap<String, Integer>(); 83 for (BenchmarkMethod benchmarkMethod : methodSet) { 84 85 finalMap.put(benchmarkMethod.getMethodWithClassName(), mapping.get(benchmarkMethod)); 86 } 87 88 viewStub.initTotalBenchProgress(finalMap); 89 } 90 return true; 91 } 92 93 /** 94 * This method notifies the eclipse view which element is currently benched. 95 * 96 * @param meter 97 * The current meter. 98 * @param name 99 * This param represents the java element which is currently 100 * benched and which is fully qualified. 101 * @throws SocketViewException 102 */ 103 public boolean updateCurrentElement(final AbstractMeter meter, final String name) 104 throws SocketViewException { 105 if (meter != null && !regMeterHash) { 106 registerFirstMeterHash(meter); 107 } 108 if (name != null && meter.hashCode() == (getRegMeter())) { 109 viewStub.updateCurrentRun(name); 110 } 111 return true; 112 } 113 114 /** 115 * This method informs the view that an error occurred while benching the 116 * current element. 117 * 118 * @param name 119 * Element represents the java element which has not been 120 * executed successfully. 121 * @param exception 122 * The exception caused by the element. 123 * @throws SocketViewException 124 */ 125 public boolean updateErrorInElement(final String name, final Exception exception) 126 throws SocketViewException { 127 if (name != null && exception != null) { 128 if (exception instanceof AbstractPerfidixMethodException) { 129 final AbstractPerfidixMethodException exc = (AbstractPerfidixMethodException)exception; 130 viewStub.updateError(name, exc.getExec().getClass().getSimpleName()); 131 } 132 if (exception instanceof SocketViewException) { 133 final SocketViewException viewException = (SocketViewException)exception; 134 viewStub.updateError(name, viewException.getExc().getClass().getSimpleName()); 135 } 136 } 137 return true; 138 } 139 140 /** 141 * This method notifies the view that all benches have been executed and the 142 * bench progress is finished. 143 * 144 * @throws SocketViewException 145 */ 146 public void finished() throws SocketViewException { 147 viewStub.finishedBenchRuns(); 148 regMeterHash = false; 149 } 150 151 /** 152 * Register the meter hash for update the view, so only one time the current 153 * view element will be updated and not for every meter. 154 * 155 * @param meterHash 156 * The hash of the meter. 157 */ 158 private void registerFirstMeterHash(final AbstractMeter meterHash) { 159 this.meterHash = meterHash.hashCode(); 160 regMeterHash = true; 161 } 162 163 /** 164 * The meter hash. 165 * 166 * @return The meter hash of the registered hash; 167 */ 168 private int getRegMeter() { 169 return meterHash; 170 } 171 172 }