1 /*
2  *  CVS: $Id: DTDTreeElement.java,v 1.6 2004/07/17 12:49:28 leh Exp $
3  * 
4  *  This file is part of zuul.
5  *
6  *  zuul is free software; you can redistribute it and/or modify
7  *  it under the terms of the GNU General Public License as published by
8  *  the Free Software Foundation; either version 2 of the License, or
9  *  (at your option) any later version.
10 *
11 *  zuul is distributed in the hope that it will be useful,
12 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
13 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14 *  GNU General Public License for more details.
15 *
16 *  You should have received a copy of the GNU General Public License
17 *  along with zuul; if not, write to the Free Software
18 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
19 * 
20 *  Copyrigth 2004 by marcus, leh
21 * 
22 */
23package org.jzuul.dtdparser;
24
25import java.util.Iterator;
26import java.util.List;
27import java.util.Vector;
28
29/**
30 * TODO Document new class
31 * 
32 * Created on Jun 7, 2004
33 * 
34 * 
35 * @version $Revision: 1.6 $
36 */
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    /**
52     * @param name
53     */
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        // FIXME This may lead to a loop if parent.parent is a child
89        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}