/*
 * Copyright (C) 2010, Google Inc.
 * Copyright (C) 2008, Robin Rosenberg <robin.rosenberg@dewire.com> and others
 *
 * This program and the accompanying materials are made available under the
 * terms of the Eclipse Distribution License v. 1.0 which is available at
 * https://www.eclipse.org/org/documents/edl-v10.php.
 *
 * SPDX-License-Identifier: BSD-3-Clause
 */

package org.eclipse.jgit.events;

import org.eclipse.jgit.lib.Repository;

/**
 * Describes a modification made to a repository.
 *
 * @param <T>
 *            type of listener this event dispatches to.
 */
public abstract class RepositoryEvent<T extends RepositoryListener> {
	private Repository repository;

	/**
	 * Set the repository this event occurred on.
	 * <p>
	 * This method should only be invoked once on each event object, and is
	 * automatically set by
	 * {@link org.eclipse.jgit.lib.Repository#fireEvent(RepositoryEvent)}.
	 *
	 * @param r
	 *            the repository.
	 */
	public void setRepository(Repository r) {
		if (repository == null)
			repository = r;
	}

	/**
	 * Get the repository that was changed
	 *
	 * @return the repository that was changed
	 */
	public Repository getRepository() {
		return repository;
	}

	/**
	 * Get type of listener this event dispatches to
	 *
	 * @return type of listener this event dispatches to
	 */
	public abstract Class<T> getListenerType();

	/**
	 * Dispatch this event to the given listener.
	 *
	 * @param listener
	 *            listener that wants this event.
	 */
	public abstract void dispatch(T listener);

	@SuppressWarnings("nls")
	@Override
	public String toString() {
		String type = getClass().getSimpleName();
		if (repository == null)
			return type;
		return type + "[" + repository + "]";
	}
}
