/*******************************************************************************
 * Copyright (c) 2010, 2011 IBM Corporation and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.equinox.coordinator;

import java.util.Collection;

import org.osgi.framework.BundleContext;
import org.osgi.service.component.ComponentContext;
import org.osgi.service.coordinator.Coordination;
import org.osgi.service.coordinator.CoordinationException;
import org.osgi.service.coordinator.Coordinator;
import org.osgi.service.coordinator.Participant;

public class CoordinatorComponent implements Coordinator {
	private volatile Coordinator coordinator;

	public boolean addParticipant(Participant participant) throws CoordinationException {
		return coordinator.addParticipant(participant);
	}

	public Coordination begin(String name, long timeout) {
		return coordinator.begin(name, timeout);
	}

	public Coordination create(String name, long timeout) {
		return coordinator.create(name, timeout);
	}

	public boolean fail(Throwable reason) {
		return coordinator.fail(reason);
	}

	public Coordination getCoordination(long id) {
		return coordinator.getCoordination(id);
	}

	public Collection<Coordination> getCoordinations() {
		return coordinator.getCoordinations();
	}

	public Coordination peek() {
		return coordinator.peek();
	}

	public Coordination pop() {
		return coordinator.pop();
	}

	void activate(ComponentContext componentContext) {
		coordinator = Activator.factory.getService(componentContext.getUsingBundle(), null);
	}

	void deactivate(BundleContext context) {
		((CoordinatorImpl) coordinator).shutdown();
	}
}
