/*
* Copyright (c) 1998-2011 Caucho Technology -- all rights reserved
*
* This file is part of Resin(R) Open Source
*
* Each copy or derived work must preserve the copyright notice and this
* notice unmodified.
*
* Resin Open Source is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* Resin Open Source is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, or any warranty
* of NON-INFRINGEMENT. See the GNU General Public License for more
* details.
*
* You should have received a copy of the GNU General Public License
* along with Resin Open Source; if not, write to the
*
* Free Software Foundation, Inc.
* 59 Temple Place, Suite 330
* Boston, MA 02111-1307 USA
*
* @author Emil Ong
*/
package com.caucho.xtpdoc;
import com.caucho.config.Config;
import com.caucho.vfs.Path;
import com.caucho.vfs.Vfs;
import javax.servlet.ServletContext;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;
public class Document {
private static Logger log = Logger.getLogger(Document.class.getName());
private ServletContext _webApp;
private Header _header;
private Body _body;
private Path _documentPath;
private String _contextPath;
private String _uri;
private int _level;
private Navigation _navigation;
private NavigationItem _navItem;
private String _encoding;
private boolean _hasChildren;
private boolean _isArticle;
private boolean _isDisableAction;
private boolean _isJavascriptEnabled = true;
private String _redirect;
private ReferenceDocument _referenceDocument;
Document()
{
this(null, null, null, null, "utf-8");
}
public Document(Path documentPath, String contextPath)
{
this(null, documentPath, contextPath, null, "utf-8");
}
public Document(ServletContext webApp,
Path documentPath,
String contextPath,
String uri,
String encoding)
{
_webApp = webApp;
_documentPath = documentPath;
_contextPath = contextPath;
_uri = uri;
_encoding = encoding;
}
public boolean isArticle()
{
return _isArticle;
}
public void setArticle(boolean isArticle)
{
_isArticle = isArticle;
}
public void setDisableAction(boolean isDisable)
{
_isDisableAction = isDisable;
}
public boolean isDisableAction()
{
return _isDisableAction;
}
public boolean isJavascriptEnabled()
{
return _isJavascriptEnabled;
}
public void setJavascriptEnabled(boolean isJavascriptEnabled)
{
_isJavascriptEnabled = isJavascriptEnabled;
}
public Path getRealPath(String uri)
{
if (_webApp != null) {
String contextPath = _webApp.getContextPath();
if (uri.startsWith(contextPath))
uri = uri.substring(contextPath.length());
return Vfs.lookup(_webApp.getRealPath(uri));
}
else
return Vfs.lookup("./" + uri);
}
NavigationItem getNavigation()
{
if (_navItem != null)
return _navItem;
ArrayList<Navigation> navList = new ArrayList();
String uri = _uri;
int p = uri.lastIndexOf('/');
if (p > 0)
uri = uri.substring(0, p + 1);
ServletContext rootWebApp = _webApp.getContext("/");
NavigationItem child = null;
while (! uri.equals("") && rootWebApp != null) {
String realPath = rootWebApp.getRealPath(uri);
Path path = Vfs.lookup(realPath);
Path toc = path.lookup("toc.xml");
if (toc.canRead()) {
Config config = new Config();
config.setEL(false);
Navigation navigation = new Navigation(this, uri, path, 0);
navigation.setChild(child);
try {
config.configure(navigation, toc);
navList.add(navigation);
} catch (Exception e) {
log.log(Level.FINE, e.toString(), e);
navigation = null;
}
if (navigation != null)
child = navigation.getRootItem();
else
child = null;
}
p = uri.lastIndexOf('/', uri.length() - 2);
if (p >= 0)
uri = uri.substring(0, p + 1);
else
break;
}
if (navList.size() > 0) {
Navigation nav = navList.get(0);
_navItem = nav.getItem(_uri);
}
return _navItem;
}
void fillChildNavigation()
{
getNavigation();
if (! _hasChildren) {
_hasChildren = true;
fillChildNavigation(_navItem);
}
}
void fillChildNavigation(NavigationItem navItem)
{
if (navItem == null)
return;
for (NavigationItem child : navItem.getChildren()) {
fillChildNavigation(child);
}
try {
String link = navItem.getLink();
if (link.indexOf('/') > 0) {
ServletContext rootWebApp = _webApp.getContext("/");
String uri = navItem.getUri();
String realPath = rootWebApp.getRealPath(uri);
Path path = Vfs.lookup(realPath);
Path pwd = path.getParent();
Path toc = pwd.lookup("toc.xml");
if (toc.canRead()) {
Config config = new Config();
config.setEL(false);
int p = uri.lastIndexOf('/');
if (p > 0)
uri = uri.substring(0, p + 1);
Navigation navigation = new Navigation(this, uri, pwd, 0);
navigation.setChild(navItem);
config.configure(navigation, toc);
if (navigation.getRootItem() != null)
navItem.addChildren(navigation.getRootItem().getChildren());
}
}
}
catch (Exception e) {
log.log(Level.FINE, e.toString(), e);
}
}
ReferenceDocument getReferenceDocument()
{
if (_referenceDocument != null)
return _referenceDocument;
String uri = _uri;
ServletContext rootWebApp = _webApp.getContext("/");
if (rootWebApp != null) {
while (! uri.equals("")) {
int p = uri.lastIndexOf('/');
if (p > 0)
uri = uri.substring(0, p);
else
break;
String realPath = rootWebApp.getRealPath(uri + '/');
Path path = Vfs.lookup(realPath);
Path ref = path.lookup("reference.xtp");
if (ref.canRead()) {
Config config = new Config();
config.setEL(false);
try {
_referenceDocument =
new ReferenceDocument(_webApp, ref, _contextPath,
uri + "/reference.xtp", _encoding);
config.configure(_referenceDocument, ref);
break;
}
catch (Exception e) {
log.log(Level.FINE, e.toString(), e);
_referenceDocument = null;
}
}
}
}
return _referenceDocument;
}
public Path getDocumentPath()
{
return _documentPath;
}
public String getContextPath()
{
return _contextPath;
}
public String getURI()
{
return _uri;
}
public Header getHeader()
{
return _header;
}
public String getName()
{
// XXX
return "";
}
public Header createHeader()
{
_header = new Header(this);
return _header;
}
public Body createBody()
{
return new Body(this);
}
public void setBody(Body body)
{
_body = body;
}
public Body getBody()
{
return _body;
}
public void setRedirect(String href)
{
_redirect = href;
}
public String getRedirect()
{
return _redirect;
}
public void writeHtml(XMLStreamWriter out)
throws XMLStreamException
{
out.writeStartDocument(_encoding, "1.0");
out.writeDTD("<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">");
out.writeStartElement("html");
out.writeDefaultNamespace("http://www.w3.org/1999/xhtml");
out.writeAttribute("lang", "en");
if (_header != null)
_header.writeHtml(out);
if (_body != null)
_body.writeHtml(out);
out.writeEndElement(); // html
}
public void writeLeftNav(XMLStreamWriter out)
throws XMLStreamException
{
NavigationItem item = getNavigation();
if (item != null) {
item.writeLeftNav(out);
}
}
public void writeLaTeXTop(PrintWriter out)
throws IOException
{
out.println("\\documentclass{article}");
_header.writeLaTeXTop(out);
_body.writeLaTeXTop(out);
}
public void writeLaTeX(PrintWriter out)
throws IOException
{
_header.writeLaTeX(out);
_body.writeLaTeX(out);
}
public void writeLaTeXEnclosed(PrintWriter out)
throws IOException
{
_header.writeLaTeXEnclosed(out);
_body.writeLaTeXEnclosed(out);
}
public void writeLaTeXArticle(PrintWriter out)
throws IOException
{
setArticle(true);
_header.writeLaTeXArticle(out);
_body.writeLaTeX(out);
}
public void writeAsciiDoc(PrintWriter out)
throws IOException
{
_header.writeAsciiDoc(out);
_body.writeAsciiDoc(out);
}
public String toString()
{
return "Document[" + _documentPath + "]";
}
}