/src/org/ooc/frontend/model/VersionNodes.java

http://github.com/nddrylliog/ooc · Java · 225 lines · 163 code · 58 blank · 4 comment · 15 complexity · 8e57c523b0bdee11af8aa472173ffaf2 MD5 · raw file

  1. package org.ooc.frontend.model;
  2. import java.io.IOException;
  3. import org.ooc.frontend.Target;
  4. public class VersionNodes {
  5. public static interface VersionNodeVisitor {
  6. void visit(VersionName versionName) throws IOException;
  7. void visit(VersionNegation versionNegation) throws IOException;
  8. void visit(VersionAnd versionAnd) throws IOException;
  9. void visit(VersionOr versionOr) throws IOException;
  10. void visit(VersionParen versionParen) throws IOException;
  11. }
  12. /**
  13. * A version string, corresponding to a #define
  14. * @author Amos Wenger
  15. */
  16. public static abstract class VersionNode {
  17. public abstract void accept(VersionNodeVisitor visitor) throws IOException;
  18. public abstract void acceptChildren(VersionNodeVisitor visitor) throws IOException;
  19. public abstract boolean isSatisfied(Target target);
  20. }
  21. public static class VersionName extends VersionNode {
  22. String name;
  23. boolean solved = false;
  24. public VersionName(String name) {
  25. this.name = name;
  26. }
  27. public String getName() {
  28. return name;
  29. }
  30. @Override
  31. public void accept(VersionNodeVisitor visitor) throws IOException {
  32. visitor.visit(this);
  33. }
  34. @Override
  35. public void acceptChildren(VersionNodeVisitor visitor) {}
  36. @Override
  37. public String toString() {
  38. return name;
  39. }
  40. @Override
  41. public boolean isSatisfied(Target target) {
  42. if(name.toLowerCase().contains("win") && target == Target.WIN) {
  43. return true;
  44. }
  45. if((name.toLowerCase().contains("linux")
  46. || name.toLowerCase().contains("unix")) && target == Target.LINUX) {
  47. return true;
  48. }
  49. if(name.toLowerCase().contains("apple") && target == Target.OSX) {
  50. return true;
  51. }
  52. if(name.toLowerCase().contains("sun") && target == Target.SOLARIS) {
  53. return true;
  54. }
  55. return false;
  56. }
  57. }
  58. public static class VersionNegation extends VersionNode {
  59. VersionNode inner;
  60. public VersionNegation(VersionNode inner) {
  61. this.inner = inner;
  62. }
  63. public VersionNode getInner() {
  64. return inner;
  65. }
  66. @Override
  67. public void accept(VersionNodeVisitor visitor) throws IOException {
  68. visitor.visit(this);
  69. }
  70. @Override
  71. public void acceptChildren(VersionNodeVisitor visitor) throws IOException {
  72. inner.accept(visitor);
  73. }
  74. @Override
  75. public String toString() {
  76. return "!" + inner;
  77. }
  78. @Override
  79. public boolean isSatisfied(Target target) {
  80. return !inner.isSatisfied(target);
  81. }
  82. }
  83. public static class VersionParen extends VersionNode {
  84. VersionNode inner;
  85. public VersionParen(VersionNode inner) {
  86. this.inner = inner;
  87. }
  88. public VersionNode getInner() {
  89. return inner;
  90. }
  91. @Override
  92. public void accept(VersionNodeVisitor visitor) throws IOException {
  93. visitor.visit(this);
  94. }
  95. @Override
  96. public void acceptChildren(VersionNodeVisitor visitor) throws IOException {
  97. inner.accept(visitor);
  98. }
  99. @Override
  100. public String toString() {
  101. return "(" + inner + ")";
  102. }
  103. @Override
  104. public boolean isSatisfied(Target target) {
  105. return inner.isSatisfied(target);
  106. }
  107. }
  108. public abstract static class VersionCouple extends VersionNode {
  109. VersionNode left;
  110. VersionNode right;
  111. public VersionCouple(VersionNode left, VersionNode right) {
  112. this.left = left;
  113. this.right = right;
  114. }
  115. public VersionNode getLeft() {
  116. return left;
  117. }
  118. public void setLeft(VersionNode left) {
  119. this.left = left;
  120. }
  121. public VersionNode getRight() {
  122. return right;
  123. }
  124. public void setRight(VersionNode right) {
  125. this.right = right;
  126. }
  127. @Override
  128. public void acceptChildren(VersionNodeVisitor visitor) throws IOException {
  129. left.accept(visitor);
  130. right.accept(visitor);
  131. }
  132. }
  133. public static class VersionAnd extends VersionCouple {
  134. public VersionAnd(VersionNode left, VersionNode right) {
  135. super(left, right);
  136. }
  137. @Override
  138. public void accept(VersionNodeVisitor visitor) throws IOException {
  139. visitor.visit(this);
  140. }
  141. @Override
  142. public String toString() {
  143. return left + " && " + right;
  144. }
  145. @Override
  146. public boolean isSatisfied(Target target) {
  147. return left.isSatisfied(target) && right.isSatisfied(target);
  148. }
  149. }
  150. public static class VersionOr extends VersionCouple {
  151. public VersionOr(VersionNode left, VersionNode right) {
  152. super(left, right);
  153. }
  154. @Override
  155. public void accept(VersionNodeVisitor visitor) throws IOException {
  156. visitor.visit(this);
  157. }
  158. @Override
  159. public String toString() {
  160. return left + " || " + right;
  161. }
  162. @Override
  163. public boolean isSatisfied(Target target) {
  164. return left.isSatisfied(target) || right.isSatisfied(target);
  165. }
  166. }
  167. }