blob: 0d99a23cc60a238e671994b2e775936a1fdc07f6 [file] [log] [blame]
// This file is part of TagSoup and is Copyright 2002-2008 by John Cowan.
//
// TagSoup is licensed under the Apache License,
// Version 2.0. You may obtain a copy of this license at
// http://www.apache.org/licenses/LICENSE-2.0 . You may also have
// additional legal rights not granted by this license.
//
// TagSoup is distributed in the hope that it will be useful, but
// unless required by applicable law or agreed to in writing, TagSoup
// is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS
// OF ANY KIND, either express or implied; not even the implied warranty
// of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
//
//
// Model of document
package org.ccil.cowan.tagsoup;
import java.util.HashMap;
/**
Abstract class representing a TSSL schema.
Actual TSSL schemas are compiled into concrete subclasses of this class.
**/
public abstract class Schema {
public static final int M_ANY = 0xFFFFFFFF;
public static final int M_EMPTY = 0;
public static final int M_PCDATA = 1 << 30;
public static final int M_ROOT = 1 << 31;
public static final int F_RESTART = 1;
public static final int F_CDATA = 2;
public static final int F_NOFORCE = 4;
private HashMap theEntities =
new HashMap(); // String -> Character
private HashMap theElementTypes =
new HashMap(); // String -> ElementType
private String theURI = "";
private String thePrefix = "";
private ElementType theRoot = null;
/**
Add or replace an element type for this schema.
@param name Name (Qname) of the element
@param model Models of the element's content as a vector of bits
@param memberOf Models the element is a member of as a vector of bits
@param flags Flags for the element
**/
public void elementType(String name, int model, int memberOf, int flags) {
ElementType e = new ElementType(name, model, memberOf, flags, this);
theElementTypes.put(name.toLowerCase(), e);
if (memberOf == M_ROOT) theRoot = e;
}
/**
Get the root element of this schema
**/
public ElementType rootElementType() {
return theRoot;
}
/**
Add or replace a default attribute for an element type in this schema.
@param elemName Name (Qname) of the element type
@param attrName Name (Qname) of the attribute
@param type Type of the attribute
@param value Default value of the attribute; null if no default
**/
public void attribute(String elemName, String attrName,
String type, String value) {
ElementType e = getElementType(elemName);
if (e == null) {
throw new Error("Attribute " + attrName +
" specified for unknown element type " +
elemName);
}
e.setAttribute(attrName, type, value);
}
/**
Specify natural parent of an element in this schema.
@param name Name of the child element
@param parentName Name of the parent element
**/
public void parent(String name, String parentName) {
ElementType child = getElementType(name);
ElementType parent = getElementType(parentName);
if (child == null) {
throw new Error("No child " + name + " for parent " + parentName);
}
if (parent == null) {
throw new Error("No parent " + parentName + " for child " + name);
}
child.setParent(parent);
}
/**
Add to or replace a character entity in this schema.
@param name Name of the entity
@param value Value of the entity
**/
public void entity(String name, int value) {
theEntities.put(name, new Integer(value));
}
/**
Get an ElementType by name.
@param name Name (Qname) of the element type
@return The corresponding ElementType
**/
public ElementType getElementType(String name) {
return (ElementType)(theElementTypes.get(name.toLowerCase()));
}
/**
Get an entity value by name.
@param name Name of the entity
@return The corresponding character, or 0 if none
**/
public int getEntity(String name) {
// System.err.println("%% Looking up entity " + name);
Integer ch = (Integer)theEntities.get(name);
if (ch == null) return 0;
return ch.intValue();
}
/**
Return the URI (namespace name) of this schema.
**/
public String getURI() {
return theURI;
}
/**
Return the prefix of this schema.
**/
public String getPrefix() {
return thePrefix;
}
/**
Change the URI (namespace name) of this schema.
**/
public void setURI(String uri) {
theURI = uri;
}
/**
Change the prefix of this schema.
**/
public void setPrefix(String prefix) {
thePrefix = prefix;
}
}