1 /** 2 * Logback: the reliable, generic, fast and flexible logging framework. 3 * Copyright (C) 1999-2015, QOS.ch. All rights reserved. 4 * 5 * This program and the accompanying materials are dual-licensed under 6 * either the terms of the Eclipse Public License v1.0 as published by 7 * the Eclipse Foundation 8 * 9 * or (per the licensee's choosing) 10 * 11 * under the terms of the GNU Lesser General Public License version 2.1 12 * as published by the Free Software Foundation. 13 */ 14 package ch.qos.logback.classic.net; 15 16 import ch.qos.logback.core.spi.ContextAwareBase; 17 import ch.qos.logback.core.spi.LifeCycle; 18 19 /** 20 * An abstract base for components that receive logging events from a remote 21 * peer and log according to local policy 22 * 23 * @author Carl Harris 24 */ 25 public abstract class ReceiverBase extends ContextAwareBase implements LifeCycle { 26 27 private boolean started; 28 29 /** 30 * {@inheritDoc} 31 */ 32 public final void start() { 33 if (isStarted()) 34 return; 35 if (getContext() == null) { 36 throw new IllegalStateException("context not set"); 37 } 38 if (shouldStart()) { 39 getContext().getExecutorService().execute(getRunnableTask()); 40 started = true; 41 } 42 } 43 44 /** 45 * {@inheritDoc} 46 */ 47 public final void stop() { 48 if (!isStarted()) 49 return; 50 try { 51 onStop(); 52 } catch (RuntimeException ex) { 53 addError("on stop: " + ex, ex); 54 } 55 started = false; 56 } 57 58 /** 59 * {@inheritDoc} 60 */ 61 public final boolean isStarted() { 62 return started; 63 } 64 65 /** 66 * Determines whether this receiver should start. 67 * <p> 68 * Subclasses will implement this method to do any subclass-specific validation. 69 * The subclass's {@link #getRunnableTask()} method will be invoked (and the 70 * task returned will be submitted to the executor) if and only if this method 71 * returns {@code true} 72 * 73 * @return flag indicating whether this receiver should start 74 */ 75 protected abstract boolean shouldStart(); 76 77 /** 78 * Allows a subclass to participate in receiver shutdown. 79 */ 80 protected abstract void onStop(); 81 82 /** 83 * Provides the runnable task this receiver will execute. 84 * 85 * @return runnable task 86 */ 87 protected abstract Runnable getRunnableTask(); 88 89 }