/**
* 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@xxxxxxx
*
*/
public
final
class
ChangeListenerWithSemaphore implements
IResourceChangeListener {
private
final Semaphore
s;
private
final
List<Object> 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<Object>());
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)
{
Activator.getDefault().getLog().log(new
Status(IStatus.ERROR,
Activator.PLUGIN_ID,
e.getMessage(), e));
return;
} finally {
if (expectedEvents ==
receivedEvents.size())
s.release();
}
}
public
boolean
waitForEvents() throws
InterruptedException {
return s.tryAcquire(5,
TimeUnit.SECONDS);
}
public
synchronized
List<Object> getDeltas() {
return deltas;
}
public
synchronized
int getEvents()
{
return receivedEvents.size();
}
public
List<IResourceChangeEvent> getReceivedEvents() {
return receivedEvents;
}
}
This is how I am creating, deleting and updating files.
Best Regards,
Kiril