1 10 package org.jgap.distr; 11 12 import java.io.*; 13 import java.util.*; 14 import org.apache.commons.lang.builder.*; 15 16 26 public class CultureMemoryCell 27 implements Serializable, Comparable { 28 29 private final static String CVS_REVISION = "$Revision: 1.12 $"; 30 31 34 private String m_name; 35 36 41 private int m_version; 42 43 46 private Object m_value; 47 48 51 private int m_readAccessed; 52 53 57 private int m_historySize; 58 59 private int m_internalHistorySize; 60 61 65 private CultureMemoryCell m_previousVersion; 66 67 70 private List m_history; 71 72 76 private long m_dateTimeVersion; 77 78 84 public CultureMemoryCell() { 85 this(null); 86 } 87 88 95 public CultureMemoryCell(final String a_name) { 96 this(a_name, 3); 97 } 98 99 109 public CultureMemoryCell(final String a_name, final int a_historySize) { 110 setHistorySize(a_historySize); 111 m_history = new Vector(getHistorySize()); 112 setName(a_name); 113 } 114 115 122 public void setName(final String a_name) { 123 m_name = a_name; 124 } 125 126 132 public String getName() { 133 return m_name; 134 } 135 136 143 public void setValue(final Object a_value) { 144 if (m_historySize > 0) { 145 keepHistory(a_value, getVersion(), getName()); 146 } 147 else { 148 m_previousVersion = getNewInstance(m_value, getVersion(), 149 getName()); 150 } 151 m_value = a_value; 152 incrementVersion(); 153 } 154 155 163 public void setDouble(final double a_value) { 164 setValue(new Double (a_value)); 165 } 166 167 175 public double getCurrentValueAsDouble() { 176 return ( (Double ) getCurrentValue()).doubleValue(); 177 } 178 179 185 public Object getCurrentValue() { 186 m_readAccessed++; 187 return m_value; 188 } 189 190 197 public List getHistory() { 198 return m_history; 199 } 200 201 207 public int getVersion() { 208 return m_version; 209 } 210 211 217 protected void incrementVersion() { 218 m_version++; 219 m_dateTimeVersion = System.currentTimeMillis(); 221 } 222 223 234 protected void keepHistory(final Object a_value, final int a_version, 235 final String a_name) { 236 trimHistory(m_historySize - 1); 237 CultureMemoryCell cell = getNewInstance(a_value, a_version, a_name); 239 cell.m_internalHistorySize = m_historySize; 240 m_history.add(cell); 241 } 242 243 255 protected CultureMemoryCell getNewInstance(final Object a_value, 256 final int a_version, 257 final String a_name) { 258 CultureMemoryCell cell = new CultureMemoryCell(a_name, 0); 260 cell.m_value = a_value; 261 cell.m_version = a_version; 262 return cell; 263 } 264 265 271 public int getReadAccessed() { 272 return m_readAccessed; 273 } 274 275 283 public int getReadAccessedCurrentVersion() { 284 if (m_historySize < 1) { 285 return getReadAccessed() - m_previousVersion.getReadAccessed(); 288 } 289 else { 290 CultureMemoryCell cell = (CultureMemoryCell) m_history.get( 293 m_history.size() - 1); 294 return getReadAccessed() - cell.getReadAccessed(); 295 } 296 } 297 298 306 public void setHistorySize(final int a_size) { 307 if (getHistory() != null && a_size > getHistory().size()) { 308 trimHistory(a_size); 309 m_historySize = a_size; 310 } 311 else if (a_size < 0) { 312 m_historySize = 0; 313 } 314 else { 315 m_historySize = a_size; 316 } 317 } 318 319 326 protected void trimHistory(final int a_size) { 327 while (m_history.size() > a_size) { 329 m_history.remove(0); 331 } 332 } 333 334 340 public int getHistorySize() { 341 return m_historySize; 342 } 343 344 351 public String toString() { 352 StringBuffer result = new StringBuffer (); 353 toStringRecursive(result, getHistorySize()); 354 return result.toString(); 355 } 356 357 365 protected void toStringRecursive(StringBuffer a_result, 366 final int a_historySize) { 367 List history = getHistory(); 368 a_result.append("[Name:" + getName() + ";"); 369 a_result.append("Value:" + m_value + ";"); a_result.append("Version:" + getVersion() + ";"); 371 a_result.append("Read accessed:" + getReadAccessed() + ";"); 372 a_result.append("History Size:" + a_historySize + ";"); 373 a_result.append("History:["); 374 for (int i = 0; i < history.size(); i++) { 375 if (i > 0) { 376 a_result.append(";"); 377 } 378 CultureMemoryCell cell = (CultureMemoryCell) history.get(i); 379 cell.toStringRecursive(a_result, cell.m_internalHistorySize); 381 a_result.append("]"); 382 } 383 a_result.append("]"); 384 } 385 386 392 public long getVersionTimeMilliseconds() { 393 return m_dateTimeVersion; 394 } 395 396 404 public boolean equals(Object a_other) { 405 try { 406 return compareTo(a_other) == 0; 407 } catch (ClassCastException cex) { 408 return false; 409 } 410 } 411 412 420 public int compareTo(Object a_other) { 421 CultureMemoryCell other = (CultureMemoryCell) a_other; 422 if (other == null) { 423 return 1; 424 } 425 return new CompareToBuilder() 426 .append(m_value, other.m_value) 427 .append(m_version, other.m_version) 428 .append(m_historySize, other.m_historySize) 429 .toComparison(); 430 } 431 } 432 | Popular Tags |