/*
* Copyright 2014 Red Hat Inc. and/or its affiliates and other contributors.
*
* 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.switchyard.deploy.osgi;
import org.osgi.framework.Bundle;
/**
* SwitchyardEvent.
*/
public class SwitchYardEvent {
/** CREATING. */
public static final int CREATING = 1;
/** CREATED. */
public static final int CREATED = 2;
/** DESTROYING. */
public static final int DESTROYING = 3;
/** DESTROYED. */
public static final int DESTROYED = 4;
/** FAILURE. */
public static final int FAILURE = 5;
/** GRACE_PERIOD. */
public static final int GRACE_PERIOD = 6;
private final int _type;
/**
* The time when the event occurred.
*
* @see #getTimestamp()
*/
private final long _timestamp;
/**
* The Switchyard bundle.
*
* @see #getBundle()
*/
private final Bundle _bundle;
/**
* The Switchyard extender bundle.
*
* @see #getExtenderBundle()
*/
private final Bundle _extenderBundle;
/**
* An array containing filters identifying the missing dependencies. Must
* not be <code>null</code> when the event type requires it.
*
* @see #getDependencies()
*/
private final String[] _dependencies;
/**
* Cause of the failure.
*
* @see #getCause()
*/
private final Throwable _cause;
/**
* Indicate if this event is a replay event or not.
*
* @see #isReplay()
*/
private final boolean _replay;
/**
* Create a simple <code>SwitchyardEvent</code> object.
*
* @param type The type of this event.
* @param bundle The Switchyard bundle associated with this event. This
* parameter must not be <code>null</code>.
* @param extenderBundle The Switchyard extender bundle that is generating
* this event. This parameter must not be <code>null</code>.
*/
public SwitchYardEvent(int type, Bundle bundle, Bundle extenderBundle) {
this(type, bundle, extenderBundle, null, null);
}
/**
* Create a <code>SwitchyardEvent</code> object associated with a set of
* dependencies.
*
* @param type The type of this event.
* @param bundle The Switchyard bundle associated with this event. This
* parameter must not be <code>null</code>.
* @param extenderBundle The Switchyard extender bundle that is generating
* this event. This parameter must not be <code>null</code>.
* @param dependencies An array of <code>String</code> filters for each
* dependency associated with this event. Must be a non-empty array
* for event types {@link #FAILURE}, {@link #GRACE_PERIOD}.
* Must be <code>null</code> for other event types.
*/
public SwitchYardEvent(int type, Bundle bundle, Bundle extenderBundle,
String[] dependencies) {
this(type, bundle, extenderBundle, dependencies, null);
}
/**
* Create a <code>SwitchyardEvent</code> object associated with a failure
* cause.
*
* @param type The type of this event.
* @param bundle The Switchyard bundle associated with this event. This
* parameter must not be <code>null</code>.
* @param extenderBundle The Switchyard extender bundle that is generating
* this event. This parameter must not be <code>null</code>.
* @param cause A <code>Throwable</code> object describing the root cause of
* the event. May be <code>null</code>.
*/
public SwitchYardEvent(int type, Bundle bundle, Bundle extenderBundle,
Throwable cause) {
this(type, bundle, extenderBundle, null, cause);
}
/**
* Create a <code>SwitchyardEvent</code> object associated with a failure
* cause and a set of dependencies.
*
* @param type The type of this event.
* @param bundle The Switchyard bundle associated with this event. This
* parameter must not be <code>null</code>.
* @param extenderBundle The Switchyard extender bundle that is generating
* this event. This parameter must not be <code>null</code>.
* @param dependencies An array of <code>String</code> filters for each
* dependency associated with this event. Must be a non-empty array
* for event type {@link #GRACE_PERIOD}. It
* is optional for {@link #FAILURE} event types.
* Must be <code>null</code> for other event types.
* @param cause A <code>Throwable</code> object describing the root cause of
* this event. May be <code>null</code>.
*/
public SwitchYardEvent(int type, Bundle bundle, Bundle extenderBundle,
String[] dependencies, Throwable cause) {
_type = type;
_timestamp = System.currentTimeMillis();
_bundle = bundle;
_extenderBundle = extenderBundle;
_dependencies = dependencies == null ? null
: (String[]) dependencies.clone();;
_cause = cause;
_replay = false;
if (bundle == null) {
throw new NullPointerException("bundle must not be null");
}
if (extenderBundle == null) {
throw new NullPointerException("extenderBundle must not be null");
}
switch (type) {
case GRACE_PERIOD :
if (dependencies == null) {
throw new NullPointerException(
"dependencies must not be null");
}
if (dependencies.length == 0) {
throw new IllegalArgumentException(
"dependencies must not be length zero");
}
break;
case FAILURE :
// not all FAILURE events have a dependency list, but if there
// is one, it must be non-empty.
if (dependencies != null) {
if (dependencies.length == 0) {
throw new IllegalArgumentException(
"dependencies must not be length zero");
}
}
break;
default :
if (dependencies != null) {
throw new IllegalArgumentException(
"dependencies must be null");
}
break;
}
}
/**
* Create a new <code>SwitchyardEvent</code> from the specified
* <code>SwitchyardEvent</code>. The <code>timestamp</code> property will be
* copied from the original event and only the replay property will be
* overridden with the given value.
*
* @param event The original <code>SwitchyardEvent</code> to copy. Must not
* be <code>null</code>.
* @param replay <code>true</code> if this event should be used as a replay
* event.
*/
public SwitchYardEvent(SwitchYardEvent event, boolean replay) {
_type = event._type;
_timestamp = event._timestamp;
_bundle = event._bundle;
_extenderBundle = event._extenderBundle;
_dependencies = event._dependencies;
_cause = event._cause;
_replay = replay;
}
/**
* Return the type of this event.
* <p>
* The type values are:
* <ul>
* <li>{@link #CREATING}</li>
* <li>{@link #CREATED}</li>
* <li>{@link #DESTROYING}</li>
* <li>{@link #DESTROYED}</li>
* <li>{@link #FAILURE}</li>
* <li>{@link #GRACE_PERIOD}</li>
* </ul>
*
* @return The type of this event.
*/
public int getType() {
return _type;
}
/**
* Return the time at which this event was created.
*
* @return The time at which this event was created.
*/
public long getTimestamp() {
return _timestamp;
}
/**
* Return the Blueprint bundle associated with this event.
*
* @return The Blueprint bundle associated with this event.
*/
public Bundle getBundle() {
return _bundle;
}
/**
* Return the Blueprint extender bundle that is generating this event.
*
* @return The Blueprint extender bundle that is generating this event.
*/
public Bundle getExtenderBundle() {
return _extenderBundle;
}
/**
* Return the filters identifying the missing dependencies that caused this
* event.
*
* @return The filters identifying the missing dependencies that caused this
* event if the event type is one of
* {@link #GRACE_PERIOD} or {@link #FAILURE} or <code>null</code>
* for the other event types.
*/
public String[] getDependencies() {
return _dependencies == null ? null : (String[]) _dependencies.clone();
}
/**
* Return the cause for this {@link #FAILURE} event.
*
* @return The cause of the failure for this event. May be <code>null</code>
* .
*/
public Throwable getCause() {
return _cause;
}
/**
* Return whether this event is a replay event.
*
* @return <code>true</code> if this event is a replay event and
* <code>false</code> otherwise.
*/
public boolean isReplay() {
return _replay;
}
}