141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project// This file is part of TagSoup and is Copyright 2002-2008 by John Cowan.
241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project//
341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project// TagSoup is licensed under the Apache License,
441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project// Version 2.0.  You may obtain a copy of this license at
541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project// http://www.apache.org/licenses/LICENSE-2.0 .  You may also have
641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project// additional legal rights not granted by this license.
741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project//
841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project// TagSoup is distributed in the hope that it will be useful, but
941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project// unless required by applicable law or agreed to in writing, TagSoup
1041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project// is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS
1141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project// OF ANY KIND, either express or implied; not even the implied warranty
1241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project// of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
1341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project//
1441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project//
1541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project// Model of document
1641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project
1741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Projectpackage org.ccil.cowan.tagsoup;
1841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Projectimport java.util.HashMap;
1941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project
2041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project/**
2141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source ProjectAbstract class representing a TSSL schema.
2241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source ProjectActual TSSL schemas are compiled into concrete subclasses of this class.
2341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project**/
2441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project
2541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Projectpublic abstract class Schema {
2641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project
2741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project	public static final int M_ANY = 0xFFFFFFFF;
2841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project	public static final int M_EMPTY = 0;
2941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project	public static final int M_PCDATA = 1 << 30;
3041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project	public static final int M_ROOT = 1 << 31;
3141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project
3241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project
3341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project	public static final int F_RESTART = 1;
3441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project	public static final int F_CDATA = 2;
3541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project	public static final int F_NOFORCE = 4;
3641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project
3741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project	private HashMap theEntities =
3841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project		new HashMap();		// String -> Character
3941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project	private HashMap theElementTypes =
4041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project		new HashMap();		// String -> ElementType
4141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project
4241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project	private String theURI = "";
4341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project	private String thePrefix = "";
4441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project	private ElementType theRoot = null;
4541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project
4641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project	/**
4741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project	Add or replace an element type for this schema.
4841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project	@param name Name (Qname) of the element
4941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project	@param model Models of the element's content as a vector of bits
5041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project	@param memberOf Models the element is a member of as a vector of bits
5141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project	@param flags Flags for the element
5241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project	**/
5341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project
5441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project	public void elementType(String name, int model, int memberOf, int flags) {
5541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project		ElementType e = new ElementType(name, model, memberOf, flags, this);
5641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project		theElementTypes.put(name.toLowerCase(), e);
5741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project		if (memberOf == M_ROOT) theRoot = e;
5841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project		}
5941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project
6041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project	/**
6141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project	Get the root element of this schema
6241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project	**/
6341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project
6441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project	public ElementType rootElementType() {
6541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project		return theRoot;
6641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project		}
6741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project
6841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project	/**
6941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project	Add or replace a default attribute for an element type in this schema.
7041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project	@param elemName Name (Qname) of the element type
7141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project	@param attrName Name (Qname) of the attribute
7241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project	@param type Type of the attribute
7341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project	@param value Default value of the attribute; null if no default
7441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project	**/
7541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project
7641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project	public void attribute(String elemName, String attrName,
7741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project				String type, String value) {
7841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project		ElementType e = getElementType(elemName);
7941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project		if (e == null) {
8041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project			throw new Error("Attribute " + attrName +
8141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project				" specified for unknown element type " +
8241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project				elemName);
8341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project			}
8441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project		e.setAttribute(attrName, type, value);
8541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project		}
8641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project
8741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project	/**
8841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project	Specify natural parent of an element in this schema.
8941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project	@param name Name of the child element
9041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project	@param parentName Name of the parent element
9141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project	**/
9241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project
9341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project	public void parent(String name, String parentName) {
9441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project		ElementType child = getElementType(name);
9541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project		ElementType parent = getElementType(parentName);
9641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project		if (child == null) {
9741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project			throw new Error("No child " + name + " for parent " + parentName);
9841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project			}
9941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project		if (parent == null) {
10041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project			throw new Error("No parent " + parentName + " for child " + name);
10141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project			}
10241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project		child.setParent(parent);
10341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project		}
10441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project
10541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project	/**
10641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project	Add to or replace a character entity in this schema.
10741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project	@param name Name of the entity
10841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project	@param value Value of the entity
10941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project	**/
11041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project
11141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project	public void entity(String name, int value) {
11241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project		theEntities.put(name, new Integer(value));
11341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project		}
11441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project
11541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project	/**
11641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project	Get an ElementType by name.
11741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project	@param name Name (Qname) of the element type
11841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project	@return The corresponding ElementType
11941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project	**/
12041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project
12141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project	public ElementType getElementType(String name) {
12241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project		return (ElementType)(theElementTypes.get(name.toLowerCase()));
12341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project		}
12441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project
12541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project	/**
12641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project	Get an entity value by name.
12741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project	@param name Name of the entity
12841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project	@return The corresponding character, or 0 if none
12941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project	**/
13041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project
13141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project	public int getEntity(String name) {
13241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project//		System.err.println("%% Looking up entity " + name);
13341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project		Integer ch = (Integer)theEntities.get(name);
13441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project		if (ch == null) return 0;
13541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project		return ch.intValue();
13641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project		}
13741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project
13841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project	/**
13941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project	Return the URI (namespace name) of this schema.
14041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project	**/
14141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project
14241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project	public String getURI() {
14341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project		return theURI;
14441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project		}
14541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project
14641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project	/**
14741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project	Return the prefix of this schema.
14841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project	**/
14941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project
15041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project	public String getPrefix() {
15141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project		return thePrefix;
15241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project		}
15341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project
15441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project	/**
15541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project	Change the URI (namespace name) of this schema.
15641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project	**/
15741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project
15841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project	public void setURI(String uri) {
15941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project		theURI = uri;
16041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project		}
16141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project
16241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project	/**
16341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project	Change the prefix of this schema.
16441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project	**/
16541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project
16641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project	public void setPrefix(String prefix) {
16741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project		thePrefix = prefix;
16841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project		}
16941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project
17041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project	}
171