/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements. See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License. You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.apache.activemq.artemis.core.server;

public interface ActivateCallback {

   /*
    * this is called before any services are started when the server first initialised
    */
   default void preActivate() {
   }

   /*
    * this is called after most of the services have been started but before any cluster resources or JMS resources have been
    */
   default void activated() {
   }

   /*
    * this is called when the server is stopping, after any network resources and clients are closed but before the rest
    * of the resources
    */
   default void deActivate() {
   }

   /*
    * this is called when the server is stopping, before any resources or clients are closed/stopped
    */
   default void preDeActivate() {
   }

   /*
    * this is called when all resources have been started including any JMS resources
    */
   default void activationComplete() {
   }

   /*
    * This is called when the broker is stopped (no shutdown in place)
    */
   default void stop(ActiveMQServer server) {
   }

   default void shutdown(ActiveMQServer server) {
   }


}
