View Javadoc
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  }