1
23package org.jzuul.dtdparser;
24
25import java.util.Iterator;
26import java.util.List;
27import java.util.Vector;
28
29
37public class DTDTreeElement extends DTDElement {
38
39 public static final int ONE_TIME = 1;
40
41 public static final int ONE_OR_ZERO_TIMES = 2;
42
43 public static final int ONE_OR_MORE_TIMES = 3;
44
45 public static final int ZERO_OR_MORE_TIMES = 4;
46
47 protected int card;
48
49 protected DTDTreeElement parent;
50
51
54 public DTDTreeElement(String name) {
55 super(name);
56 setCardinality(ONE_TIME);
57 }
58
59 public int getCardinality() {
60 return 0;
61 }
62
63 public void setCardinality(String cardToken) {
64 if (cardToken.equals("*")) setCardinality(ZERO_OR_MORE_TIMES);
65 if (cardToken.equals("?")) setCardinality(ONE_OR_ZERO_TIMES);
66 if (cardToken.equals("+")) setCardinality(ONE_OR_MORE_TIMES);
67
68 }
69
70 public void setCardinality(int card) {
71 this.card = card;
72 }
73
74 public void setParent(DTDTreeElement parent) {
75 DTDParser.debug(this.getName() + " Got new Parent " + parent.getName());
76 this.parent = parent;
77 }
78
79 public DTDTreeElement getParent() {
80 return parent;
81 }
82
83 public String toString() {
84 return this.toString(0, new Vector());
85 }
86
87 public String toString(int indent, List seen) {
88 DTDParser.debug("Depth is " + indent);
90 String retval = "";
91
92 if (!seen.contains(name)) {
93
94 retval += repeat(' ', indent);
95 retval += name + cardToString() + "\n";
96 System.out.println(name);
97
98 for (Iterator iter = attributes.values().iterator(); iter.hasNext();) {
99 DTDAttribute at = (DTDAttribute) iter.next();
00 retval += at.toString(indent);
01
02 }
03 for (Iterator iter = children.values().iterator(); iter.hasNext();) {
04 DTDTreeElement element = (DTDTreeElement) iter.next();
05
06 seen.add(name);
07 retval += element.toString(indent + 1, seen);
08 seen.remove(name);
09
10 }
11 } else {
12 retval += repeat(' ', indent) + name + "-->" + "\n";
13 seen.remove(name);
14 }
15 return retval;
16
17 }
18
19 private String cardToString() {
20 switch (card) {
21 case ONE_TIME:
22 return "";
23 case ONE_OR_MORE_TIMES:
24 return "+";
25 case ZERO_OR_MORE_TIMES:
26 return "*";
27 case ONE_OR_ZERO_TIMES:
28 return "?";
29 }
30 return "ERROR";
31 }
32
33 private String repeat(char sign, int times) {
34 String retval = "";
35 for (int i = 1; i < times; i++) {
36 retval += sign;
37 }
38 return retval;
39 }
40
41}