/*******************************************************************************
 * Copyright (c) 1997-2009 by ProSyst Software GmbH
 * http://www.prosyst.com
 *
 * This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License 2.0
 * which accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
 *
 * Contributors:
 *    ProSyst Software GmbH - initial API and implementation
 *******************************************************************************/
package org.eclipse.equinox.ds.tests.tbc;

public class DSEvent implements Comparable {

	public static final int ACT_BOUND = 1;
	public static final int ACT_UNBOUND = 2;
	public static final int ACT_ACTIVATE = 3;
	public static final int ACT_DEACTIVATE = 4;

	private static long lastTime = System.currentTimeMillis();
	private static final Object lock = new Object();

	private long time;
	private int action;
	private Object object;

	public DSEvent(int action, Object object) {
		synchronized (lock) { // to prevent from creating BoundServiceEvents in one and the same millisecond
			this.action = action;
			this.object = object;
			while (lastTime == System.currentTimeMillis())
				;
			this.time = lastTime = System.currentTimeMillis();
		}
	}

	public int getAction() {
		return action;
	}

	public Object getObject() {
		return object;
	}

	public long getTime() {
		return time;
	}

	/**
	 * Returns whether this event is before the passed one
	 * 
	 * @param event
	 * @return
	 */
	public boolean before(DSEvent event) {
		if (event.time > this.time) {
			return true;
		} else {
			return false;
		}
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see java.lang.Comparable#compareTo(java.lang.Object)
	 */
	public int compareTo(Object var0) {
		DSEvent event = (DSEvent) var0;
		if (event.time > this.time) {
			return -1;
		} else if (event.time < this.time) {
			return 1;
		} else {
			return 0;
		}
	}

	protected String getActionAsString() {
		switch (getAction()) {
		case ACT_BOUND:
			return "ACT_BOUND";
		case ACT_UNBOUND:
			return "ACT_UNBOUND";
		case ACT_ACTIVATE:
			return "ACT_ACTIVATE";
		case ACT_DEACTIVATE:
			return "ACT_DEACTIVATE";
		default:
			return "UNKNOWN (" + getAction() + ")";
		}
	}

	@Override
	public String toString() {
		StringBuilder buf = new StringBuilder("DSEvent[");
		buf.append("time=" + this.time + ";action=");
		buf.append(getActionAsString());
		buf.append(";object=" + (this.object != null ? this.object.toString() : "null"));
		buf.append("]");
		return buf.toString();
	}

}
