/*
 * Copyright (c) OSGi Alliance (2004, 2016). All Rights Reserved.
 * 
 * Licensed 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.osgi.framework;

import java.util.EventObject;

import org.osgi.framework.startlevel.FrameworkStartLevel;
import org.osgi.framework.wiring.FrameworkWiring;

/**
 * A general event from the Framework.
 * 
 * <p>
 * {@code FrameworkEvent} objects are delivered to {@code FrameworkListener}s
 * when a general event occurs within the OSGi environment. A type code is used
 * to identify the event type for future extendability.
 * 
 * <p>
 * OSGi Alliance reserves the right to extend the set of event types.
 * 
 * @Immutable
 * @see FrameworkListener
 * @author $Id: b3072b2d058e70389a52e342ed5f8647b930b8f1 $
 */

public class FrameworkEvent extends EventObject {
	static final long		serialVersionUID				= 207051004521261705L;
	/**
	 * Bundle related to the event.
	 */
	private final Bundle	bundle;

	/**
	 * Exception related to the event.
	 */
	private final Throwable	throwable;

	/**
	 * Type of event.
	 */
	private final int		type;

	/**
	 * The Framework has started.
	 * 
	 * <p>
	 * This event is fired when the Framework has started after all installed
	 * bundles that are marked to be started have been started and the Framework
	 * has reached the initial start level. The source of this event is the
	 * System Bundle.
	 * 
	 * @see "The Start Level Specification"
	 */
	public final static int	STARTED							= 0x00000001;

	/**
	 * An error has occurred.
	 * 
	 * <p>
	 * There was an error associated with a bundle.
	 */
	public final static int	ERROR							= 0x00000002;

	/**
	 * A FrameworkWiring.refreshBundles operation has completed.
	 * 
	 * <p>
	 * This event is fired when the Framework has completed the refresh bundles
	 * operation initiated by a call to the FrameworkWiring.refreshBundles
	 * method. The source of this event is the System Bundle.
	 * 
	 * @since 1.2
	 * @see FrameworkWiring#refreshBundles(java.util.Collection,
	 *      FrameworkListener...)
	 */
	public final static int	PACKAGES_REFRESHED				= 0x00000004;

	/**
	 * A FrameworkStartLevel.setStartLevel operation has completed.
	 * 
	 * <p>
	 * This event is fired when the Framework has completed changing the active
	 * start level initiated by a call to the StartLevel.setStartLevel method.
	 * The source of this event is the System Bundle.
	 * 
	 * @since 1.2
	 * @see FrameworkStartLevel#setStartLevel(int, FrameworkListener...)
	 */
	public final static int	STARTLEVEL_CHANGED				= 0x00000008;

	/**
	 * A warning has occurred.
	 * 
	 * <p>
	 * There was a warning associated with a bundle.
	 * 
	 * @since 1.3
	 */
	public final static int	WARNING							= 0x00000010;

	/**
	 * An informational event has occurred.
	 * 
	 * <p>
	 * There was an informational event associated with a bundle.
	 * 
	 * @since 1.3
	 */
	public final static int	INFO							= 0x00000020;

	/**
	 * The Framework has stopped.
	 * 
	 * <p>
	 * This event is fired when the Framework has been stopped because of a stop
	 * operation on the system bundle. The source of this event is the System
	 * Bundle.
	 * 
	 * @since 1.5
	 */
	public final static int	STOPPED							= 0x00000040;

	/**
	 * The Framework has stopped during update.
	 * 
	 * <p>
	 * This event is fired when the Framework has been stopped because of an
	 * update operation on the system bundle. The Framework will be restarted
	 * after this event is fired. The source of this event is the System Bundle.
	 * 
	 * @since 1.5
	 */
	public final static int	STOPPED_UPDATE					= 0x00000080;

	/**
	 * The Framework has stopped and the boot class path has changed.
	 * 
	 * <p>
	 * This event is fired when the Framework has been stopped because of a stop
	 * operation on the system bundle and a bootclasspath extension bundle has
	 * been installed or updated. The source of this event is the System Bundle.
	 * 
	 * @since 1.5
	 */
	public final static int	STOPPED_BOOTCLASSPATH_MODIFIED	= 0x00000100;

	/**
	 * The Framework did not stop before the wait timeout expired.
	 * 
	 * <p>
	 * This event is fired when the Framework did not stop before the wait
	 * timeout expired. The source of this event is the System Bundle.
	 * 
	 * @since 1.5
	 */
	public final static int	WAIT_TIMEDOUT					= 0x00000200;

	/**
	 * The Framework has stopped and the framework requires a new class loader
	 * to restart.
	 * <p>
	 * This event is fired when the Framework has been stopped because of a stop
	 * operation on the system bundle and the framework requires a new class
	 * loader to be used to restart. For example, if a framework extension
	 * bundle has been refreshed. The source of this event is the System Bundle.
	 * 
	 * @since 1.9
	 */
	public final static int	STOPPED_SYSTEM_REFRESHED		= 0x00000400;

	/**
	 * Creates a Framework event.
	 * 
	 * @param type The event type.
	 * @param source The event source object. This may not be {@code null}.
	 * @deprecated As of 1.2. This constructor is deprecated in favor of using
	 *             the other constructor with the System Bundle as the event
	 *             source.
	 */
	public FrameworkEvent(int type, Object source) {
		super(source);
		this.type = type;
		this.bundle = null;
		this.throwable = null;
	}

	/**
	 * Creates a Framework event regarding the specified bundle.
	 * 
	 * @param type The event type.
	 * @param bundle The event source.
	 * @param throwable The related exception. This argument may be {@code null}
	 *        if there is no related exception.
	 */
	public FrameworkEvent(int type, Bundle bundle, Throwable throwable) {
		super(bundle);
		this.type = type;
		this.bundle = bundle;
		this.throwable = throwable;
	}

	/**
	 * Returns the exception related to this event.
	 * 
	 * @return The related exception or {@code null} if none.
	 */
	public Throwable getThrowable() {
		return throwable;
	}

	/**
	 * Returns the bundle associated with the event. This bundle is also the
	 * source of the event.
	 * 
	 * @return The bundle associated with the event.
	 */
	public Bundle getBundle() {
		return bundle;
	}

	/**
	 * Returns the type of framework event.
	 * <p>
	 * The type values are:
	 * <ul>
	 * <li>{@link #STARTED}</li>
	 * <li>{@link #ERROR}</li>
	 * <li>{@link #WARNING}</li>
	 * <li>{@link #INFO}</li>
	 * <li>{@link #PACKAGES_REFRESHED}</li>
	 * <li>{@link #STARTLEVEL_CHANGED}</li>
	 * <li>{@link #STOPPED}</li>
	 * <li>{@link #STOPPED_BOOTCLASSPATH_MODIFIED}</li>
	 * <li>{@link #STOPPED_UPDATE}</li>
	 * <li>{@link #WAIT_TIMEDOUT}</li>
	 * </ul>
	 * 
	 * @return The type of state change.
	 */

	public int getType() {
		return type;
	}
}
