PageRenderTime 51ms CodeModel.GetById 21ms RepoModel.GetById 0ms app.codeStats 0ms

/src/sys/java/fan/sys/Version.java

https://bitbucket.org/bedlaczech/fan-1.0
Java | 184 lines | 136 code | 26 blank | 22 comment | 31 complexity | 2049f4a4aacd56c762940b85c745ae3d MD5 | raw file
Possible License(s): CC-BY-SA-3.0
  1. //
  2. // Copyright (c) 2006, Brian Frank and Andy Frank
  3. // Licensed under the Academic Free License version 3.0
  4. //
  5. // History:
  6. // 27 Jul 06 Brian Frank Creation
  7. //
  8. package fan.sys;
  9. import java.util.*;
  10. /**
  11. * Version
  12. */
  13. public final class Version
  14. extends FanObj
  15. {
  16. //////////////////////////////////////////////////////////////////////////
  17. // Construction
  18. //////////////////////////////////////////////////////////////////////////
  19. public static Version fromStr(String str) { return fromStr(str, true); }
  20. public static Version fromStr(String s, boolean checked)
  21. {
  22. List segments = new List(Sys.IntType, 4);
  23. int seg = -1;
  24. boolean valid = true;
  25. int len = s.length();
  26. for (int i=0; i<len; ++i)
  27. {
  28. int c = s.charAt(i);
  29. if (c == '.')
  30. {
  31. if (seg < 0 || i+1>=len) { valid = false; break; }
  32. segments.add(Long.valueOf(seg));
  33. seg = -1;
  34. }
  35. else
  36. {
  37. if ('0' <= c && c <= '9')
  38. {
  39. if (seg < 0) seg = c-'0';
  40. else seg = seg*10 + (c-'0');
  41. }
  42. else
  43. {
  44. valid = false; break;
  45. }
  46. }
  47. }
  48. if (seg >= 0) segments.add(Long.valueOf(seg));
  49. if (!valid || segments.sz() == 0)
  50. {
  51. if (checked)
  52. throw ParseErr.make("Version", s);
  53. else
  54. return null;
  55. }
  56. return new Version(segments);
  57. }
  58. public static Version make(List segments)
  59. {
  60. boolean valid = segments.sz() > 0;
  61. for (int i=0; i<segments.sz(); ++i)
  62. if (((Long)segments.get(i)).longValue() < 0) valid = false;
  63. if (!valid) throw ArgErr.make("Invalid Version: '" + segments + "'");
  64. return new Version(segments);
  65. }
  66. Version(List segments)
  67. {
  68. this.segments = segments.ro();
  69. }
  70. //////////////////////////////////////////////////////////////////////////
  71. // Identity
  72. //////////////////////////////////////////////////////////////////////////
  73. public boolean equals(Object obj)
  74. {
  75. if (obj instanceof Version)
  76. return toStr().equals(((Version)obj).toStr());
  77. else
  78. return false;
  79. }
  80. public long compare(Object obj)
  81. {
  82. Version that = (Version)obj;
  83. List a = this.segments;
  84. List b = that.segments;
  85. for (int i=0; i<a.sz() && i<b.sz(); ++i)
  86. {
  87. long ai = (Long)a.get(i);
  88. long bi = (Long)b.get(i);
  89. if (ai < bi) return -1;
  90. if (ai > bi) return +1;
  91. }
  92. if (a.sz() < b.sz()) return -1;
  93. if (a.sz() > b.sz()) return +1;
  94. return 0;
  95. }
  96. public int hashCode()
  97. {
  98. return toStr().hashCode();
  99. }
  100. public long hash()
  101. {
  102. return FanStr.hash(toStr());
  103. }
  104. public Type typeof()
  105. {
  106. return Sys.VersionType;
  107. }
  108. public String toStr()
  109. {
  110. if (str == null)
  111. {
  112. StringBuilder s = new StringBuilder();
  113. for (int i=0; i<segments.sz(); ++i)
  114. {
  115. if (i > 0) s.append('.');
  116. s.append(segments.get(i));
  117. }
  118. str = s.toString();
  119. }
  120. return str;
  121. }
  122. //////////////////////////////////////////////////////////////////////////
  123. // Methods
  124. //////////////////////////////////////////////////////////////////////////
  125. public List segments()
  126. {
  127. return segments;
  128. }
  129. public int segment(int index)
  130. {
  131. return ((Long)segments.get(index)).intValue();
  132. }
  133. public long major()
  134. {
  135. return (Long)segments.get(0);
  136. }
  137. public Long minor()
  138. {
  139. if (segments.sz() < 2) return null;
  140. return (Long)segments.get(1);
  141. }
  142. public Long build()
  143. {
  144. if (segments.sz() < 3) return null;
  145. return (Long)segments.get(2);
  146. }
  147. public Long patch()
  148. {
  149. if (segments.sz() < 4) return null;
  150. return (Long)segments.get(3);
  151. }
  152. //////////////////////////////////////////////////////////////////////////
  153. // Fields
  154. //////////////////////////////////////////////////////////////////////////
  155. public static final Version defVal = fromStr("0");
  156. private final List segments;
  157. private String str;
  158. }