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