TestModelBuilder.java Source code

Java tutorial

Introduction

Here is the source code for TestModelBuilder.java

Source

import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
import java.util.Stack;

import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.Attributes;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.DefaultHandler;

public class TestModelBuilder {
    public static void main(String[] args) throws Exception {
        SAXParserFactory factory = SAXParserFactory.newInstance();
        SAXParser saxParser = factory.newSAXParser();
        XMLReader parser = saxParser.getXMLReader();
        SAXModelBuilder mb = new SAXModelBuilder();
        parser.setContentHandler(mb);

        parser.parse(new InputSource("zooinventory.xml"));
        Element2 inventory = (Element2) mb.getModel();
        System.out.println("Animals = " + inventory.getAnimals());
        Element3 cocoa = (Element3) (inventory.getAnimals().get(1));
        ElementA recipe = cocoa.getFoodRecipe();
        System.out.println("Recipe = " + recipe);
    }
}

class SimpleElement {
    StringBuffer text = new StringBuffer();

    public void addText(String s) {
        text.append(s);
    }

    public String getText() {
        return text.toString();
    }

    public void setAttributeValue(String name, String value) {
        throw new Error(getClass() + ": No attributes allowed");
    }
}

class ElementA extends SimpleElement {
    String name;

    List<String> values = new ArrayList<String>();

    public void setName(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void addIngredient(String ingredient) {
        values.add(ingredient);
    }

    public void setValues(List<String> ingredients) {
        this.values = ingredients;
    }

    public List<String> getIngredients() {
        return values;
    }

    public String toString() {
        return name + ": " + values.toString();
    }
}

class Element2 extends SimpleElement {
    List<Element3> value = new ArrayList<Element3>();

    public void addAnimal(Element3 animal) {
        value.add(animal);
    }

    public List<Element3> getAnimals() {
        return value;
    }

    public void setValue(List<Element3> animals) {
        this.value = animals;
    }
}

class Element3 extends SimpleElement {
    public final static int MAMMAL = 1;

    int animalClass;

    String tag1, tag2, tag3, tag4, tag5;

    ElementA foodRecipe;

    public void setTag1(String name) {
        this.tag1 = name;
    }

    public String getName() {
        return tag1;
    }

    public void setTag2(String species) {
        this.tag2 = species;
    }

    public String getSpecies() {
        return tag2;
    }

    public void setTag3(String habitat) {
        this.tag3 = habitat;
    }

    public String getHabitat() {
        return tag3;
    }

    public void setTag4(String food) {
        this.tag4 = food;
    }

    public String getFood() {
        return tag4;
    }

    public void setFoodRecipe(ElementA recipe) {
        this.foodRecipe = recipe;
    }

    public ElementA getFoodRecipe() {
        return foodRecipe;
    }

    public void setTag5(String temperament) {
        this.tag5 = temperament;
    }

    public String getTemperament() {
        return tag5;
    }

    public void setAnimalClass(int animalClass) {
        this.animalClass = animalClass;
    }

    public int getAnimalClass() {
        return animalClass;
    }

    public void setAttributeValue(String name, String value) {
        if (name.equals("class") && value.equals("mammal"))
            setAnimalClass(MAMMAL);
        else
            throw new Error("No such attribute: " + name);
    }

    public String toString() {
        return tag1 + "(" + tag2 + ")";
    }
}

class SAXModelBuilder extends DefaultHandler {
    Stack<SimpleElement> stack = new Stack<SimpleElement>();

    SimpleElement element;

    public void startElement(String namespace, String localname, String qname, Attributes atts)
            throws SAXException {
        SimpleElement element = null;
        try {
            element = (SimpleElement) Class.forName(qname).newInstance();
        } catch (Exception e) {
        }
        if (element == null)
            element = new SimpleElement();
        for (int i = 0; i < atts.getLength(); i++)
            element.setAttributeValue(atts.getQName(i), atts.getValue(i));
        stack.push(element);
    }

    public void endElement(String namespace, String localname, String qname) throws SAXException {
        element = stack.pop();
        if (!stack.empty())
            try {
                setProperty(qname, stack.peek(), element);
            } catch (Exception e) {
                throw new SAXException("Error: " + e);
            }
    }

    public void characters(char[] ch, int start, int len) {
        String text = new String(ch, start, len);
        stack.peek().addText(text);
    }

    void setProperty(String name, Object target, Object value) throws SAXException {
        Method method = null;
        try {
            method = target.getClass().getMethod("add" + name, value.getClass());
        } catch (NoSuchMethodException e) {
        }
        if (method == null)
            try {
                method = target.getClass().getMethod("set" + name, value.getClass());
            } catch (NoSuchMethodException e) {
            }
        if (method == null)
            try {
                value = ((SimpleElement) value).getText();
                method = target.getClass().getMethod("add" + name, String.class);
            } catch (NoSuchMethodException e) {
            }
        try {
            if (method == null)
                method = target.getClass().getMethod("set" + name, String.class);
            method.invoke(target, value);
        } catch (Exception e) {
            throw new SAXException(e.toString());
        }
    }

    public SimpleElement getModel() {
        return element;
    }
}
//File: zooinventory.xml
/*<?xml version="1.0" encoding="UTF-8"?>
    
<Element2>
  <Element3 animalClass="mammal">
<Name>A</Name>
<Species>B</Species>
<Habitat>C</Habitat>
<Food>D</Food>
<Temperament>E</Temperament>
<Weight>1</Weight>
  </Element3>
  <Element3 animalClass="mammal">
<Name>F</Name>
<Species>G</Species>
<Habitat>H</Habitat>
<ElementA>
  <Name>I</Name>
  <Ingredient>I1</Ingredient>
  <Ingredient>I2</Ingredient>
  <Ingredient>I2</Ingredient>
</ElementA>
<Temperament>J</Temperament>
<Weight>4</Weight>
  </Element3>
</Element2>
*/