/** * Licensed to Ravel, Inc. under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. Ravel, Inc. licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ package org.goldenorb.zookeeper; import java.util.Collection; import java.util.List; import java.util.concurrent.CountDownLatch; import org.apache.zookeeper.ZooKeeper; import org.goldenorb.event.LeadershipChangeEvent; import org.goldenorb.event.LostMemberEvent; import org.goldenorb.event.MemberDataChangeEvent; import org.goldenorb.event.NewMemberEvent; import org.goldenorb.event.OrbCallback; import org.goldenorb.event.OrbEvent; import org.goldenorb.event.OrbExceptionEvent; import org.goldenorb.zookeeper.LeaderGroup; import org.goldenorb.zookeeper.OrbZKFailure; public class TTracker implements Runnable { /** * Constructor * * @param ZooKeeper zk * @param int data * @param String basePath * @param CountDownLatch startCdl * @param CountDownLatch leaderChangeCdl * @param CountDownLatch leaveCdl * @param CountDownLatch dataChangedCdl */ public TTracker(ZooKeeper zk, int data, String basePath, CountDownLatch startCdl, CountDownLatch leaderChangeCdl, CountDownLatch leaveCdl, CountDownLatch dataChangedCdl) { this.basePath = basePath; this.data = data; this.zk = zk; this.startCdl = startCdl; this.leaderChangeCdl = leaderChangeCdl; this.leaveCdl = leaveCdl; this.dataChangedCdl = dataChangedCdl; member = new TMember(); member.setData(this.data); } private ZooKeeper zk; private String basePath; private boolean orbExceptionEvent = false; private boolean newMemberEvent = false; private boolean lostMemberEvent = false; private boolean LeadershipChangeEvent = false; private boolean memberDataChangeEvent = false; private CountDownLatch startCdl; private CountDownLatch leaderChangeCdl; private CountDownLatch leaveCdl; private CountDownLatch dataChangedCdl; private int data; private TMember member; private Boolean shutdown = false; private LeaderGroup<TMember> leaderGroup; /** * */ @Override public void run() { leaderGroup = new LeaderGroup<TMember>(zk, new OrbTTrackerCallback(), basePath, member, TMember.class); startCdl.countDown(); } /** * */ public void shutdown() { synchronized (shutdown) { shutdown = true; } } public class OrbTTrackerCallback implements OrbCallback { /** * * @param OrbEvent e */ public void process(OrbEvent e) { if (e.getClass() == OrbExceptionEvent.class) { ((OrbExceptionEvent)e).getException().printStackTrace(); orbExceptionEvent = true; } if (e.getClass() == NewMemberEvent.class) { System.out.println("A new member joined the LeaderGroup"); orbExceptionEvent = true; } if (e.getClass() == LostMemberEvent.class) { System.out.println("A member has been lost from the LeaderGroup"); orbExceptionEvent = true; } if (e.getClass() == LeadershipChangeEvent.class) { System.out.println("Leadership has changed hands"); leaderChangeCdl.countDown(); orbExceptionEvent = true; } if (e.getClass() == MemberDataChangeEvent.class) { memberDataChangeEvent = true; //System.err.println("Received update on TTracker: " + data); dataChangedCdl.countDown(); } } } /** * Return the rbExceptionEvent */ public boolean isOrbExceptionEvent() { return orbExceptionEvent; } /** * Set the orbExceptionEvent * @param boolean orbExceptionEvent */ public void setOrbExceptionEvent(boolean orbExceptionEvent) { this.orbExceptionEvent = orbExceptionEvent; } /** * Return the ewMemberEvent */ public boolean isNewMemberEvent() { return newMemberEvent; } /** * Set the newMemberEvent * @param boolean newMemberEvent */ public void setNewMemberEvent(boolean newMemberEvent) { this.newMemberEvent = newMemberEvent; } /** * Return the ostMemberEvent */ public boolean isLostMemberEvent() { return lostMemberEvent; } /** * Set the lostMemberEvent * @param boolean lostMemberEvent */ public void setLostMemberEvent(boolean lostMemberEvent) { this.lostMemberEvent = lostMemberEvent; } /** * Return the eadershipChangeEvent */ public boolean isLeadershipChangeEvent() { return LeadershipChangeEvent; } /** * Set the leadershipChangeEvent * @param boolean leadershipChangeEvent */ public void setLeadershipChangeEvent(boolean leadershipChangeEvent) { LeadershipChangeEvent = leadershipChangeEvent; } /** * Return the eader */ public boolean isLeader(){ return leaderGroup.isLeader(); } /** * Return the emberDataChangeEvent */ public boolean isMemberDataChangeEvent() { return memberDataChangeEvent; } /** * */ public void leave(){ leaveCdl.countDown(); leaderGroup.leave(); } /** * Return the leader */ public TMember getLeader(){ return leaderGroup.getLeader(); } /** * * @param int newData */ public void changeMemberData(int newData) throws OrbZKFailure { member.changeData(newData, zk, getMyPath()); } /** * Return the membersPath */ public List<String> getMembersPath() { return leaderGroup.getMembersPath(); } /** * Return the members */ public Collection<TMember> getMembers() { return leaderGroup.getMembers(); } /** * Return the myPath */ public String getMyPath() { return leaderGroup.getMyPath(); } /** * Return the memberData */ public int getMemberData() { return member.getData(); } }