1e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov/******************************************************************************* 2398ee59bebad6835dab57b60157eff16d511709eMarc R. Hoffmann * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors 3e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov * All rights reserved. This program and the accompanying materials 4e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov * are made available under the terms of the Eclipse Public License v1.0 5e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov * which accompanies this distribution, and is available at 6e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov * http://www.eclipse.org/legal/epl-v10.html 7e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov * 8e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov * Contributors: 9e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov * Marc R. Hoffmann - initial API and implementation 10e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov * 11e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov *******************************************************************************/ 12e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikovpackage org.jacoco.core.runtime; 13e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov 14e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikovimport java.io.IOException; 15e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikovimport java.io.InputStream; 16e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov 17e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikovimport org.jacoco.core.data.ExecutionDataReader; 18e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov 19e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov/** 20e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov * {@link ExecutionDataReader} with commands added for runtime remote control. 21e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov */ 22e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikovpublic class RemoteControlReader extends ExecutionDataReader { 23e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov 24e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov private IRemoteCommandVisitor remoteCommandVisitor; 25e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov 26e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov /** 27e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov * Create a new read based on the given input stream. 28e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov * 29e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov * @param input 30e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov * input stream to read commands from 31e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov * @throws IOException 32e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov * if the stream does not have a valid header 33e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov */ 34e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov public RemoteControlReader(final InputStream input) throws IOException { 35e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov super(input); 36e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov } 37e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov 38e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov @Override 39e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov protected boolean readBlock(final byte blockid) throws IOException { 40e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov switch (blockid) { 41e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov case RemoteControlWriter.BLOCK_CMDDUMP: 42e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov readDumpCommand(); 43e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov return true; 44e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov case RemoteControlWriter.BLOCK_CMDOK: 45e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov return false; 46e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov default: 47e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov return super.readBlock(blockid); 48e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov } 49e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov } 50e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov 51e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov /** 52e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov * Sets an listener for agent commands. 53e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov * 54e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov * @param visitor 5557f7cf06888f1e34f9ab2e3129c3d433826ecbe1Marc R. Hoffmann * visitor to retrieve agent commands 56e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov */ 57e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov public void setRemoteCommandVisitor(final IRemoteCommandVisitor visitor) { 58e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov this.remoteCommandVisitor = visitor; 59e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov } 60e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov 61e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov private void readDumpCommand() throws IOException { 62e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov if (remoteCommandVisitor == null) { 63e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov throw new IOException("No remote command visitor."); 64e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov } 65e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov final boolean dump = in.readBoolean(); 66e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov final boolean reset = in.readBoolean(); 67e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov remoteCommandVisitor.visitDumpCommand(dump, reset); 68e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov } 69e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov 70e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov} 71