001: package org.mandarax.xkb;
002:
003: /*
004: * Copyright (C) 1999-2004 <A href="http://www-ist.massey.ac.nz/JBDietrich" target="_top">Jens Dietrich</a>
005: *
006: * This library is free software; you can redistribute it and/or
007: * modify it under the terms of the GNU Lesser General Public
008: * License as published by the Free Software Foundation; either
009: * version 2 of the License, or (at your option) any later version.
010: *
011: * This library is distributed in the hope that it will be useful,
012: * but WITHOUT ANY WARRANTY; without even the implied warranty of
013: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
014: * Lesser General Public License for more details.
015: *
016: * You should have received a copy of the GNU Lesser General Public
017: * License along with this library; if not, write to the Free Software
018: * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
019: */
020:
021: import java.util.Iterator;
022: import java.util.List;
023: import java.util.Vector;
024:
025: import org.jdom.Element;
026: import org.mandarax.kernel.LogicFactory;
027:
028: /**
029: * Abstract super class for XKB drivers.
030: * @author <A href="http://www-ist.massey.ac.nz/JBDietrich" target="_top">Jens Dietrich</A>
031: * @version 3.4 <7 March 05>
032: * @since 1.4
033: */
034: public abstract class AbstractXKBDriver implements XKBDriver {
035:
036: protected LogicFactory lfactory = LogicFactory.getDefaultFactory();
037:
038: /**
039: * Constructor.
040: */
041: public AbstractXKBDriver() {
042: super ();
043: }
044:
045: /**
046: * Get a list of all child elements
047: * nested directly (one level deep) within this element
048: * with one of the given names. Preserve the order of children.
049: * @return a list of children with the respective names
050: * @param e an element
051: * @param name1 a name
052: * @param name2 a name
053: */
054: protected List collectChildren(Element e, String name1, String name2) {
055: List children = e.getChildren();
056: List collected = new Vector(children.size());
057: Element next = null;
058:
059: for (Iterator it = children.iterator(); it.hasNext();) {
060: next = (Element) it.next();
061:
062: if (compare(name1, next.getName())
063: || compare(name2, next.getName())) {
064: collected.add(next);
065: }
066: }
067:
068: return collected;
069: }
070:
071: /**
072: * Get a list of all child elements
073: * nested directly (one level deep) within this element
074: * with one of the given names. Preserve the order of children.
075: * @return a list of children with the respective names
076: * @param e an element
077: * @param name1 a name
078: * @param name2 a name
079: * @param name3 a nam
080: */
081: protected List collectChildren(Element e, String name1,
082: String name2, String name3) {
083: List children = e.getChildren();
084: List collected = new Vector(children.size());
085: Element next = null;
086:
087: for (Iterator it = children.iterator(); it.hasNext();) {
088: next = (Element) it.next();
089:
090: if (compare(name1, next.getName())
091: || compare(name2, next.getName())
092: || compare(name3, next.getName())) {
093: collected.add(next);
094: }
095: }
096:
097: return collected;
098: }
099:
100: /**
101: * Compare two strings representing tag names.
102: * @return a boolean
103: * @param s1 string 1
104: * @param s2 string 2
105: */
106: protected boolean compare(String s1, String s2) {
107: return (s1 == null) ? s2 == null : s1.equalsIgnoreCase(s2);
108: }
109:
110: /**
111: * Get the number of all child elements
112: * nested directly (one level deep) within this element
113: * with the given name.
114: * @return the number of children
115: * @param e an element
116: * @param name a name
117: */
118: protected int countChildren(Element e, String name) {
119: return ((e == null) || (name == null)) ? 0 : e
120: .getChildren(name).size();
121: }
122:
123: /**
124: * Get the number of all child elements
125: * nested directly (one level deep) within this element
126: * with one of the given names.
127: * @return the number of children
128: * @param e an element
129: * @param name1 a name
130: * @param name2 a name
131: */
132: protected int countChildren(Element e, String name1, String name2) {
133: if (e == null) {
134: return 0;
135: }
136:
137: int n = (name1 == null) ? 0 : e.getChildren(name1).size();
138:
139: n = (name2 == null) ? n : n + e.getChildren(name2).size();
140:
141: return n;
142: }
143:
144: /**
145: * Get the number of all child elements
146: * nested directly (one level deep) within this element
147: * with one of the given names.
148: * @return the number of children
149: * @param e an element
150: * @param name1 a name
151: * @param name2 a name
152: * @param name3 a name
153: */
154: protected int countChildren(Element e, String name1, String name2,
155: String name3) {
156: if (e == null) {
157: return 0;
158: }
159:
160: int n = (name1 == null) ? 0 : e.getChildren(name1).size();
161:
162: n = (name2 == null) ? n : n + e.getChildren(name2).size();
163: n = (name3 == null) ? n : n + e.getChildren(name3).size();
164:
165: return n;
166: }
167:
168: /**
169: * Get the name of the driver.
170: * @return a text
171: */
172: public String getName() {
173: return getClass().getName();
174: }
175: }
|