--- /dev/null
+package fr.orsay.lri.varna.models.treealign;
+import java.util.ArrayList;
+import java.util.List;
+
+
+
+/**
+ * In this model, nodes are either:
+ * 1. a couple of paired bases, and in that case they may have children,
+ * in this case singleNode is true
+ * 2. a single base that comes from a broken base pair
+ * (broken during planarization), without children,
+ * in this case singleNode is true
+ * 3. a list of consecutive non-paired bases, without children.
+ * in this case singleNode is false
+ * Note that case 2 happens only if original sequences contained
+ * pseudoknots, otherwise this case can be ignored.
+ *
+ * @author Raphael Champeimont
+ *
+ */
+public class RNANodeValue2 implements GraphvizDrawableNodeValue {
+ /**
+ * Says whether we have a single node or a list of nodes.
+ */
+ private boolean singleNode = true;
+
+ /**
+ * Defined if singleNode is true.
+ */
+ private RNANodeValue node;
+
+ /**
+ * Defined if singleNode is false;
+ */
+ private List<RNANodeValue> nodes;
+
+ public RNANodeValue2(boolean singleNode) {
+ this.singleNode = singleNode;
+ if (singleNode) {
+ node = new RNANodeValue();
+ } else {
+ nodes = new ArrayList<RNANodeValue>();
+ }
+ }
+
+ /**
+ * In case of a single node, return it.
+ * Will throw RNANodeValue2WrongTypeException if singleNode = false.
+ */
+ public RNANodeValue getNode() {
+ if (singleNode) {
+ return node;
+ } else {
+ throw (new RNANodeValue2WrongTypeException());
+ }
+ }
+
+ public void setNode(RNANodeValue node) {
+ if (singleNode) {
+ this.node = node;
+ } else {
+ throw (new RNANodeValue2WrongTypeException());
+ }
+ }
+
+ /**
+ * In case of multiple nodes, return them.
+ * Will throw RNANodeValue2WrongTypeException if singleNode = true.
+ */
+ public List<RNANodeValue> getNodes() {
+ if (!singleNode) {
+ return nodes;
+ } else {
+ throw (new RNANodeValue2WrongTypeException());
+ }
+ }
+ /**
+ * In case of multiple nodes, return the sequence of nucleotides.
+ */
+ public char[] computeSequence() {
+ if (!singleNode) {
+ final int n = nodes.size();
+ char[] sequence = new char[n];
+ for (int i=0; i<n; i++) {
+ sequence[i] = nodes.get(i).getLeftNucleotide().charAt(0);
+ }
+ return sequence;
+ } else {
+ throw (new RNANodeValue2WrongTypeException());
+ }
+ }
+
+ public void setNodes(List<RNANodeValue> nodes) {
+ if (!singleNode) {
+ this.nodes = nodes;
+ } else {
+ throw (new RNANodeValue2WrongTypeException());
+ }
+ }
+
+ public boolean isSingleNode() {
+ return singleNode;
+ }
+
+ public String toString() {
+ if (singleNode) {
+ return node.toString();
+ } else {
+ String s = "";
+ for (RNANodeValue node: nodes) {
+ if (s != "") {
+ s += " ";
+ }
+ s += node.toString();
+ }
+ return s;
+ }
+ }
+
+ public String toGraphvizNodeName() {
+ if (singleNode) {
+ return node.toGraphvizNodeName();
+ } else {
+ String s = "";
+ for (RNANodeValue node: nodes) {
+ if (s != "") {
+ s += " ";
+ }
+ s += node.toGraphvizNodeName();
+ }
+ return s;
+ }
+ }
+
+}