/***********************************************************************
 * Copyright (c) 2008 by SAP AG, Walldorf. 
 * 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
 * https://www.eclipse.org/legal/epl-2.0/
 *
 * Contributors:
 *     SAP AG - initial API and implementation
 ***********************************************************************/
package org.eclipse.jst.jee.model.tests;

import java.util.Collection;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit;

import org.eclipse.core.resources.IResourceChangeEvent;
import org.eclipse.core.resources.IResourceChangeListener;
import org.eclipse.core.resources.IResourceDelta;

/**
 * This change listener will release a semaphore after the resource changed
 * method is called. For every resourceChanged call one release will be called.
 * 
 * @author Kiril Mitov k.mitov@sap.com
 * 
 */
public final class ChangeListenerWithSemaphore implements IResourceChangeListener {
	private final Semaphore s;
	private final Collection<IResourceDelta> deltas;
	private final int expectedEvents;
	private final List<IResourceChangeEvent> receivedEvents;

	public ChangeListenerWithSemaphore(int expectedEvents) throws InterruptedException {
		this.expectedEvents = expectedEvents;
		this.s = new Semaphore(1);
		this.s.acquire();
		this.deltas = Collections.synchronizedList(new LinkedList<IResourceDelta>());
		this.receivedEvents = Collections.synchronizedList(new LinkedList<IResourceChangeEvent>());
	}

	public synchronized void resourceChanged(IResourceChangeEvent event) {
		receivedEvents.add(event);
		if (receivedEvents.size() > expectedEvents)
			throw new IllegalStateException("The expected events were already reached");
		try {
			deltas.add(event.getDelta());
		} catch (Exception e) {
			throw new RuntimeException(e);
		} finally {
			if (expectedEvents == receivedEvents.size())
				s.release();
		}
	}

	public boolean waitForEvents() throws InterruptedException {
		return s.tryAcquire(5, TimeUnit.SECONDS);
	}

	public synchronized Collection<IResourceDelta> getDeltas() {
		return deltas;
	}

	public synchronized int getEvents() {
		return receivedEvents.size();
	}

	public List<IResourceChangeEvent> getReceivedEvents() {
		return receivedEvents;
	}
}
