package jeffaschenk.commons.frameworks.cnxidx.resiliency.ldap;
import java.io.Serializable;
import java.util.*;
/**
* Provides a Change Log Status for the entire Single Change within the Log File.
* This Object is used by the IRRChangeLogRestoreServiceReaderThread for tracking
* changes against ChangeResponseIdentifier.
*
* @author jeff.schenk
* @since 2005.11.10
*/
public class ChangeLogStatusElement implements Serializable {
// *****************************************
// Fields Established by Primary Coordinator
private Object originator = null;
private String logfilename = null;
private int change_number_within_log = 0;
// *****************************************
// Fields Updated By Primary Coordinator.
protected List<String> member_response_position = new ArrayList<>();
protected Map<String,ChangeResponseIdentifier> member_responses = new TreeMap<>();
/**
* Constructor specifying All Necessary Fields.
*/
public ChangeLogStatusElement(Object originator,
String logfilename,
int change_number_within_log) {
// ********************************
// Save our Originator Object.
this.originator = originator;
// ********************************
// Save the logfile Name.
this.logfilename = logfilename;
// ********************************
// Save the change within the log.
this.change_number_within_log = change_number_within_log;
} // End of Constructor.
/**
* Get Change Number within the Log.
*/
public int getChangeNumberWithinLog() {
return this.change_number_within_log;
} // End of getChangeNumberWithinLog.
/**
* Get Log File Name.
*/
public String getLogFileName() {
return this.logfilename;
} // End of getLogFileName.
/**
* Get Originator.
*/
public Object getOriginator() {
return this.originator;
} // End of getOriginator.
/**
* Determine State of a specific Change Log Element for this Change Log Object.
*
* @return boolean Indicator if this current element can be flagged as successful or not.
*/
public boolean determineElementState() {
// ******************************
// Accumulate Totals to determine
// State.
int success = 0;
int blocked = 0;
int ignored = 0;
int failed = 0;
for (int i = 0; i < member_response_position.size(); i++) {
ChangeResponseIdentifier cri = (ChangeResponseIdentifier)
member_responses.get(member_response_position.get(i).toString());
if (cri.wasChangeSuccessful()) {
success++;
} else if (cri.wasChangeBlocked()) {
blocked++;
} else if (cri.wasChangeIgnored()) {
ignored++;
} else {
failed++;
}
} // End of For Loop.
// ********************************
// Now Determine State based upon
// Counts.
// TODO FIX
if (failed > 0) {
System.out.println("Element State Failed for Log:[" +
this.toStateFileString(true) + "].");
}
if (failed > 0) {
return false;
}
// ***********************
// Return
return true;
} // End of Public Method to Determine State of this Change Log Object.
/**
* toString.
*/
public String toString() {
StringBuffer sb = new StringBuffer();
sb.append("Change Log Status:[ logfilename:[" + this.logfilename + "]");
sb.append(", Change Number in Log:[" + this.change_number_within_log + "]\n");
sb.append(", Originator:[" + this.originator + "]");
// ********************************
// Now Loop to Show Members
// who have confirmed change.
sb.append(", Member Responses:[ ");
for (int i = 0; i < member_response_position.size(); i++) {
if (i > 0) {
sb.append(",");
}
sb.append(" ");
sb.append(member_response_position.get(i).toString());
sb.append(member_responses.get(member_response_position.get(i).toString()).toString());
} // End of For Loop.
sb.append("]");
return sb.toString();
} // End of toString Method.
/**
* toStateFileString, provides helper method to output
* current Object State into a State File.
*
* @param detail indicator if detail should be provided or suppressed.
* @return String of Formatted State File of this Current Change Element.
*/
public String toStateFileString(boolean detail) {
StringBuffer sb = new StringBuffer();
if (detail) {
sb.append("# Change Log Status:[ logfilename:[" + this.logfilename + "]\n");
sb.append("# Change Number in Log:[" + this.change_number_within_log + "]\n");
sb.append("# Originator:[" + this.originator + "]\n");
} // End of detail check.
// ********************************
// Now Loop to Show Members
// who have confirmed change.
sb.append("# Member Responses:\n");
for (int i = 0; i < member_response_position.size(); i++) {
sb.append("# Member: ");
sb.append(member_response_position.get(i).toString());
sb.append("\n# \n");
sb.append(((ChangeResponseIdentifier) member_responses.get(
member_response_position.get(i))).toStateFileString());
sb.append("# \n");
sb.append("# \n");
} // End of For Loop.
sb.append("# \n");
return sb.toString();
} // End of toStateString Method.
/**
* helper Method to formulate the proper Change Log Status Idenitifier Key.
*
* @param originator
* @param logfilename
* @return String -- formulated Change Log Key
*/
public static String formulateChangeLogKey(Object originator,
String logfilename) {
return originator.toString() + ":" + logfilename;
} // End of formulateChangeLogKeyKey.
} ///:~ End of ChangeIdentifier Class.