ElementHandler.java
001 /* This file is part of the project "Hilbert II" - http://www.qedeq.org
002  *
003  * Copyright 2000-2011,  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 = (ElementListelements.get(elements.size() 1);
094         elements.remove(elements.size() 1);
095         if (elements.size() 0) {
096             ((ElementListelements.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 = (ElementListelements.get(elements.size() 1);
104         last.add(new DefaultAtom(data));
105     }
106 
107 }