001 /* This file is part of the project "Hilbert II" - http://www.qedeq.org
002 *
003 * Copyright 2000-2013, Michael Meyling <mime@qedeq.org>.
004 *
005 * "Hilbert II" is free software; you can redistribute
006 * it and/or modify it under the terms of the GNU General Public
007 * License as published by the Free Software Foundation; either
008 * version 2 of the License, or (at your option) any later version.
009 *
010 * This program is distributed in the hope that it will be useful,
011 * but WITHOUT ANY WARRANTY; without even the implied warranty of
012 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
013 * GNU General Public License for more details.
014 */
015
016 package org.qedeq.kernel.xml.handler.list;
017
018 import java.util.ArrayList;
019 import java.util.List;
020
021 import org.qedeq.kernel.se.base.list.Element;
022 import org.qedeq.kernel.se.base.list.ElementList;
023 import org.qedeq.kernel.se.dto.list.DefaultAtom;
024 import org.qedeq.kernel.se.dto.list.DefaultElementList;
025 import org.qedeq.kernel.xml.handler.common.AbstractSimpleHandler;
026 import org.qedeq.kernel.xml.handler.common.SaxDefaultHandler;
027 import org.qedeq.kernel.xml.handler.common.SimpleAttributes;
028
029
030 /**
031 * Parse elements. For example formulas and terms are build of
032 * {@link org.qedeq.kernel.se.base.list.Element}s.
033 * <P>
034 * This handler knows nothing about special forms. It doesn't do any
035 * validating. It simply puts all attributes into string atoms and
036 * adds all sub elements. The element name is taken for the operator name.
037 *
038 * @author Michael Meyling
039 */
040 public class ElementHandler extends AbstractSimpleHandler {
041
042 /** Value object element. */
043 private Element result;
044
045 /** Element stack. */
046 private final List elements;
047
048
049 /**
050 * Deals with elements.
051 *
052 * @param handler Parent handler.
053 */
054 public ElementHandler(final AbstractSimpleHandler handler) {
055 super(handler);
056 elements = new ArrayList(20);
057 }
058
059 /**
060 * Deals with elements.
061 *
062 * @param handler Parent handler.
063 */
064 public ElementHandler(final SaxDefaultHandler handler) {
065 super(handler);
066 elements = new ArrayList(20);
067 }
068
069 public final void init() {
070 result = null;
071 elements.clear();
072 }
073
074 /**
075 * Get parsed element.
076 *
077 * @return Parsed element.
078 */
079 public final Element getElement() {
080 return result;
081 }
082
083 public final void startElement(final String name, final SimpleAttributes attributes) {
084 final String[] values = attributes.getKeySortedStringValues();
085 final ElementList element = new DefaultElementList(name);
086 for (int i = 0; i < values.length; i++) {
087 element.add(new DefaultAtom(values[i]));
088 }
089 elements.add(element);
090 }
091
092 public final void endElement(final String name) {
093 ElementList last = (ElementList) elements.get(elements.size() - 1);
094 elements.remove(elements.size() - 1);
095 if (elements.size() > 0) {
096 ((ElementList) elements.get(elements.size() - 1)).add(last);
097 } else {
098 result = last;
099 }
100 }
101
102 public final void characters(final String name, final String data) {
103 ElementList last = (ElementList) elements.get(elements.size() - 1);
104 last.add(new DefaultAtom(data));
105 }
106
107 }
|