{
try
{
CuratorEntry entry = CuratorEntry.mustGetEntry(connectionManager, projection);
final LeaderLatch leaderLatch = new LeaderLatch(entry.getClient(), path, participantId);
leaderLatch.start();
Closer closer = new Closer()
{
@Override
public void close()
{
try
{
leaderLatch.close();
}
catch ( IOException e )
{
log.error("Could not close left-over leader latch for path: " + path, e);
}
}
};
String id = entry.addThing(leaderLatch, closer);
LeaderLatchListener listener = new LeaderLatchListener()
{
@Override
public void isLeader()
{
addEvent(projection, new RpcCuratorEvent(new LeaderEvent(path, participantId, true)));
}
@Override
public void notLeader()
{
addEvent(projection, new RpcCuratorEvent(new LeaderEvent(path, participantId, false)));
}
};
leaderLatch.addListener(listener);
if ( waitForLeadershipMs > 0 )
{
leaderLatch.await(waitForLeadershipMs, TimeUnit.MILLISECONDS);
}
return new LeaderResult(new LeaderProjection(id), leaderLatch.hasLeadership());
}
catch ( Exception e )
{
throw new RpcException(e);
}