001: // Copyright 2006, 2007 The Apache Software Foundation
002: //
003: // Licensed under the Apache License, Version 2.0 (the "License");
004: // you may not use this file except in compliance with the License.
005: // You may obtain a copy of the License at
006: //
007: // http://www.apache.org/licenses/LICENSE-2.0
008: //
009: // Unless required by applicable law or agreed to in writing, software
010: // distributed under the License is distributed on an "AS IS" BASIS,
011: // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
012: // See the License for the specific language governing permissions and
013: // limitations under the License.
014:
015: package org.apache.tapestry.dom;
016:
017: import java.io.PrintWriter;
018:
019: import org.apache.tapestry.ioc.internal.util.Defense;
020:
021: /**
022: * The root node of a DOM.
023: */
024: public final class Document extends Node {
025: private Element _rootElement;
026:
027: private DTD _dtd;
028:
029: private final MarkupModel _model;
030:
031: public Document(MarkupModel model) {
032: super (null);
033: _model = model;
034: }
035:
036: Document getDocument() {
037: return this ;
038: }
039:
040: /**
041: * Finds an element based on a path of element names.
042: *
043: * @param path
044: * slash separated series of element names
045: * @return the matching element, or null if not found
046: * @see Element#find(String)
047: */
048: public Element find(String path) {
049: Defense.notBlank(path, "path");
050:
051: if (_rootElement == null)
052: return null;
053:
054: int slashx = path.indexOf("/");
055:
056: String rootElementName = slashx < 0 ? path : path.substring(0,
057: slashx);
058:
059: if (!_rootElement.getName().equals(rootElementName))
060: return null;
061:
062: return slashx < 0 ? _rootElement : _rootElement.find(path
063: .substring(slashx + 1));
064: }
065:
066: /** Builds with an instance of {@link DefaultMarkupModel}. */
067: public Document() {
068: this (new DefaultMarkupModel());
069: }
070:
071: public MarkupModel getMarkupModel() {
072: return _model;
073: }
074:
075: /** Creates the root element for this document, replacing any previous root element. */
076: public Element newRootElement(String name) {
077: _rootElement = new Element(this , name);
078:
079: return _rootElement;
080: }
081:
082: @Override
083: public void toMarkup(PrintWriter writer) {
084: if (_rootElement == null)
085: throw new IllegalStateException(
086: "No root element has been defined.");
087:
088: // TODO: XML declaration, plus lead-in comments, directives.
089: if (_dtd != null) {
090: _dtd.toMarkup(writer);
091: }
092: _rootElement.toMarkup(writer);
093: }
094:
095: @Override
096: public String toString() {
097: if (_rootElement == null)
098: return "[empty Document]";
099:
100: return super .toString();
101: }
102:
103: public Element getRootElement() {
104: return _rootElement;
105: }
106:
107: /**
108: * Tries to find an element in this document whose id is specified.
109: *
110: * @param id
111: * the value of the id attribute of the element being looked for
112: * @return the element if found. null if not found.
113: */
114: public Element getElementById(String id) {
115: return _rootElement.getElementById(id);
116: }
117:
118: public void dtd(String name, String publicId, String systemId) {
119: _dtd = new DTD(name, publicId, systemId);
120: }
121:
122: }
|