/*
 * 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.sling.discovery;

/**
 * A topology event is sent whenever a change in the topology occurs.
 * 
 * This event object might be extended in the future with new event types and
 * methods.
 * 
 * @see TopologyEventListener
 */
public class TopologyEvent {

    public static enum Type {
        /**
         * Informs the service about the initial topology state - this is only 
         * sent once at bind-time and is the first one a TopologyEventListener
         * receives (after the implementation bundle was activated).
         */
        TOPOLOGY_INIT,

        /**
         * Informs the service about the fact that a state change was detected in
         * the topology/cluster and that the new state is in the process of
         * being discovered. Once the discovery is finished, a TOPOLOGY_CHANGED
         * is sent with the new topology view.
         * <p>
         * After receiving a TOPOLOGY_CHANGING and before receiving a
         * TOPOLOGY_CHANGED event a TopologyEventListener cannot make any
         * assumptions wrt the topology whatsoever, including whether or not 
         * the local instance is part of it at all (partitioning).
         * <p>
         * An implementation must always send a TOPOLOGY_CHANGING before a
         * TOPOLOGY_CHANGED.
         */
        TOPOLOGY_CHANGING,

        /**
         * Informs the service about a state change in the topology.
         * <p>
         * A state change includes:
         * <ul>
         * <li>A joining or leaving instance</li>
         * <li>A restart of an instance - or more precisely: when the
         * corresponding implementation bundle is deactivated/activated</li>
         * <li>A cluster structure - either its members or the cluster
         * view id - changed. The cluster view id changes when an instance joins, 
         * leaves or was restarted (its bundle deactivated/activated)</li>
         * </ul>
         * <p>
         * Note that a TOPOLOGY_CHANGED can also include changes in the
         * properties!
         */
        TOPOLOGY_CHANGED,

        /**
         * One or many properties have been changed on an instance which is part
         * of the topology.
         * <p>
         * This event is sent when otherwise the topology remains identical.
         */
        PROPERTIES_CHANGED

    }

    private final Type type;
    private final TopologyView oldView;
    private final TopologyView newView;

    public TopologyEvent(final Type type, final TopologyView oldView,
            final TopologyView newView) {
        if (type == null) {
            throw new IllegalArgumentException("type must not be null");
        }

        if (type == Type.TOPOLOGY_INIT) {
            // then oldView is null
            if (oldView != null) {
                throw new IllegalArgumentException("oldView must be null");
            }
            // and newView must be not null
            if (newView == null) {
                throw new IllegalArgumentException("newView must not be null");
            }
        } else if (type == Type.TOPOLOGY_CHANGING) {
            // then newView is null
            if (newView != null) {
                throw new IllegalArgumentException("newView must be null");
            }
            // and oldView must not be null
            if (oldView == null) {
                throw new IllegalArgumentException("oldView must not be null");
            }
        } else {
            // in all other cases both oldView and newView must not be null
            if (oldView == null) {
                throw new IllegalArgumentException("oldView must not be null");
            }
            if (newView == null) {
                throw new IllegalArgumentException("newView must not be null");
            }
        }
        this.type = type;
        this.oldView = oldView;
        this.newView = newView;
    }

    /**
     * Returns the type of this event
     * 
     * @return the type of this event
     */
    public Type getType() {
        return type;
    }

    /**
     * Returns the view which was valid up until now.
     * <p>
     * This is null in case of <code>TOPOLOGY_INIT</code>
     * 
     * @return the view which was valid up until now, or null in case of a fresh
     *         instance start
     */
    public TopologyView getOldView() {
        return oldView;
    }

    /**
     * Returns the view which is currently (i.e. newly) valid.
     * <p>
     * This is null in case of <code>TOPOLOGY_CHANGING</code>
     * 
     * @return the view which is currently valid, or null in case of
     *         <code>TOPOLOGY_CHANGING</code>
     */
    public TopologyView getNewView() {
        return newView;
    }

    @Override
    public String toString() {
        return "TopologyEvent [type=" + type + ", oldView=" + oldView
                + ", newView=" + newView + "]";
    }
}
