001/*
002 * Sonar, open source software quality management tool.
003 * Copyright (C) 2008-2012 SonarSource
004 * mailto:contact AT sonarsource DOT com
005 *
006 * Sonar is free software; you can redistribute it and/or
007 * modify it under the terms of the GNU Lesser General Public
008 * License as published by the Free Software Foundation; either
009 * version 3 of the License, or (at your option) any later version.
010 *
011 * Sonar is distributed in the hope that it will be useful,
012 * but WITHOUT ANY WARRANTY; without even the implied warranty of
013 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
014 * Lesser General Public License for more details.
015 *
016 * You should have received a copy of the GNU Lesser General Public
017 * License along with Sonar; if not, write to the Free Software
018 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02
019 */
020package org.sonar.server.platform;
021
022import org.slf4j.LoggerFactory;
023import org.sonar.api.ServerComponent;
024import org.sonar.api.platform.ServerStartHandler;
025import org.sonar.api.platform.ServerStopHandler;
026import org.sonar.api.platform.Server;
027
028/**
029 * @since 2.2
030 */
031public class ServerLifecycleNotifier implements ServerComponent {
032
033  private ServerStartHandler[] startHandlers;
034  private ServerStopHandler[] stopHandlers;
035  private Server server;
036
037  public ServerLifecycleNotifier(Server server, ServerStartHandler[] startHandlers, ServerStopHandler[] stopHandlers) {
038    this.startHandlers = startHandlers;
039    this.stopHandlers = stopHandlers;
040    this.server = server;
041  }
042
043  public ServerLifecycleNotifier(Server server, ServerStartHandler[] startHandlers) {
044    this(server, startHandlers, new ServerStopHandler[0]);
045  }
046
047  public ServerLifecycleNotifier(Server server, ServerStopHandler[] stopHandlers) {
048    this(server, new ServerStartHandler[0], stopHandlers);
049  }
050
051  public ServerLifecycleNotifier(Server server) {
052    this(server, new ServerStartHandler[0], new ServerStopHandler[0]);
053  }
054
055  public void start() {
056    /* IMPORTANT :
057     we want to be sure that handlers are notified when all other services are started.
058     That's why the class Platform explicitely executes the method notifyStart(), instead of letting picocontainer
059     choose the startup order.
060     */
061  }
062
063  public void notifyStart() {
064    LoggerFactory.getLogger(ServerLifecycleNotifier.class).debug("Notify " + ServerStartHandler.class.getSimpleName() + " handlers...");
065    for (ServerStartHandler handler : startHandlers) {
066      handler.onServerStart(server);
067    }
068  }
069
070  public void stop() {
071    LoggerFactory.getLogger(ServerLifecycleNotifier.class).debug("Notify " + ServerStopHandler.class.getSimpleName() + " handlers...");
072    for (ServerStopHandler handler : stopHandlers) {
073      handler.onServerStop(server);
074    }
075  }
076}