001: /*
002: * Licensed to the Apache Software Foundation (ASF) under one or more
003: * contributor license agreements. See the NOTICE file distributed with
004: * this work for additional information regarding copyright ownership.
005: * The ASF licenses this file to You under the Apache License, Version 2.0
006: * (the "License"); you may not use this file except in compliance with
007: * the License. You may obtain a copy of the License at
008: *
009: * http://www.apache.org/licenses/LICENSE-2.0
010: *
011: * Unless required by applicable law or agreed to in writing, software
012: * distributed under the License is distributed on an "AS IS" BASIS,
013: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014: * See the License for the specific language governing permissions and
015: * limitations under the License.
016: */
017:
018: /* $Id: ElementMapping.java 442282 2006-09-11 18:24:35Z jeremias $ */
019:
020: package org.apache.fop.fo;
021:
022: import java.util.HashMap;
023:
024: import javax.xml.parsers.DocumentBuilderFactory;
025: import javax.xml.parsers.ParserConfigurationException;
026:
027: import org.apache.fop.util.QName;
028: import org.w3c.dom.DOMImplementation;
029:
030: /**
031: * Abstract base class for Element Mappings (including FO Element Mappings)
032: * which provide the framework of valid elements and attibutes for a given
033: * namespace.
034: */
035: public abstract class ElementMapping {
036: /** constant for defining the default value */
037: public static final String DEFAULT = "<default>";
038:
039: /** The HashMap table of formatting objects defined by the ElementMapping */
040: protected HashMap foObjs = null;
041:
042: /** The namespace for the ElementMapping */
043: protected String namespaceURI = null;
044:
045: /**
046: * Returns a HashMap of maker objects for this element mapping
047: *
048: * @return Table of Maker objects for this ElementMapping
049: */
050: public HashMap getTable() {
051: if (foObjs == null) {
052: initialize();
053: }
054: return foObjs;
055: }
056:
057: /**
058: * Returns the namespace URI for this element mapping
059: *
060: * @return Namespace URI for this element mapping
061: */
062: public String getNamespaceURI() {
063: return namespaceURI;
064: }
065:
066: /**
067: * Returns the DOMImplementation used by this ElementMapping. The value returned may be null
068: * for cases where no DOM is used to represent the element tree (XSL-FO, for example). This
069: * method is used by the intermediate format to instantiate the right kind of DOM document
070: * for foreign objects. For example, SVG handled through Apache Batik has to use a special
071: * DOMImplementation.
072: * @return the DOMImplementation used by this ElementMapping, may be null
073: */
074: public DOMImplementation getDOMImplementation() {
075: return null; //For namespaces not used in foreign objects
076: }
077:
078: /**
079: * @return the default DOMImplementation when no specialized DOM is necessary.
080: */
081: public static DOMImplementation getDefaultDOMImplementation() {
082: DocumentBuilderFactory fact = DocumentBuilderFactory
083: .newInstance();
084: fact.setNamespaceAware(true);
085: fact.setValidating(false);
086: try {
087: return fact.newDocumentBuilder().getDOMImplementation();
088: } catch (ParserConfigurationException e) {
089: throw new RuntimeException(
090: "Cannot return default DOM implementation: "
091: + e.getMessage());
092: }
093: }
094:
095: /** @return the standard namespace prefix for this namespace or null if it is not known. */
096: public String getStandardPrefix() {
097: return null;
098: }
099:
100: /**
101: * Indicates whether a particular attribute of the namespace is a property, i.e. the attribute
102: * value should be converted to a property value.
103: * @param attributeName the attribute name
104: * @return true if the attribute should be converted to a property
105: */
106: public boolean isAttributeProperty(QName attributeName) {
107: return false;
108: }
109:
110: /**
111: * Initializes the set of maker objects associated with this ElementMapping
112: */
113: protected abstract void initialize();
114:
115: /**
116: * Base class for all Makers. It is responsible to return the right kind of FONode for a
117: * particular element.
118: */
119: public static class Maker {
120:
121: /**
122: * Creates a new FONode (or rather a specialized subclass of it).
123: * @param parent the parent FONode
124: * @return the newly created FONode instance
125: */
126: public FONode make(FONode parent) {
127: return null;
128: }
129: }
130: }
|