/***************************************************************************
* *
* FixFingerTask.java *
* ------------------- *
* date : 16.08.2004 *
* copyright : (C) 2004-2008 Distributed and *
* Mobile Systems Group *
* Lehrstuhl fuer Praktische Informatik *
* Universitaet Bamberg *
* http://www.uni-bamberg.de/pi/ *
* email : sven.kaffille@uni-bamberg.de *
* karsten.loesing@uni-bamberg.de *
* *
* *
***************************************************************************/
/***************************************************************************
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
* A copy of the license can be found in the license.txt file supplied *
* with this software or at: http://www.gnu.org/copyleft/gpl.html *
* *
***************************************************************************/
package de.uniba.wiai.lspi.chord.service.impl;
import java.util.Random;
import de.uniba.wiai.lspi.chord.com.Node;
import de.uniba.wiai.lspi.chord.data.ID;
import de.uniba.wiai.lspi.util.logging.Logger;
import static de.uniba.wiai.lspi.util.logging.Logger.LogLevel.*;
/**
* Looks up the node for a certain ID and stores the reference of the
* responsible node in the local finger table.
*
* @author Sven Kaffille, Karsten Loesing
* @version 1.0.5
*/
final class FixFingerTask implements Runnable {
/**
* Instance of random generator for randomly picking another finger to fix.
*/
private Random random = new Random();
/**
* Parent object for invoking findSuccessor.
*/
private NodeImpl parent;
/**
* Object logger.
*/
private Logger logger;
/**
* Copy of the local node's ID for determining which ID to look up.
*/
private ID localID;
/**
* Reference on routing table.
*/
private References references;
/**
* Creates a new instance, but without starting a thread running it.
*
* @param parent
* Parent object for invoking findSuccessor.
* @param localID
* Copy of the local node's ID for determining which ID to look
* up.
* @param references
* Reference on routing table.
* @throws NullPointerException
* If either of the parameters has value <code>null</code>.
*/
FixFingerTask(NodeImpl parent, ID localID, References references) {
if (parent == null || localID == null || references == null) {
throw new NullPointerException(
"Neither parameter of constructor may be null!");
}
// June 21st, 2006. Corrected logger name from FixFingerTask.class to
// actual version. sven
this.logger = Logger.getLogger(FixFingerTask.class.getName() + "."
+ localID);
this.parent = parent;
this.localID = localID;
this.references = references;
}
public void run() {
try {
int nextFingerToFix = this.random.nextInt(this.localID.getLength());
if (this.logger.isEnabledFor(DEBUG)) {
this.logger.debug("fixFingers tries to get finger for key "
+ this.localID.addPowerOfTwo(nextFingerToFix)
.toString());
}
// look up reference
ID lookForID = this.localID.addPowerOfTwo(nextFingerToFix);
Node newReference;
// try {
newReference = this.parent.findSuccessor(lookForID);
// add new reference to finger table, if not yet included
if (newReference != null
&& !this.references.containsReference(newReference)) {
if (this.logger.isEnabledFor(INFO)) {
this.logger.info("Adding new reference "
+ newReference.getNodeID().toString());
}
this.references.addReference(newReference);
}
if (this.logger.isEnabledFor(DEBUG)) {
this.logger.debug("Invocation of fix fingers was successful");
}
} catch (Exception e) {
this.logger.warn(
"Unexpected Exception caught in FixFingerTask!", e);
}
}
}