documentfun.java

来自「RESIN 3.2 最新源码」· Java 代码 · 共 180 行

JAVA
180
字号
/* * Copyright (c) 1998-2008 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 SoftwareFoundation, Inc. *   59 Temple Place, Suite 330 *   Boston, MA 02111-1307  USA * * @author Scott Ferguson */package com.caucho.xsl.fun;import com.caucho.log.Log;import com.caucho.vfs.Path;import com.caucho.xml.CauchoNode;import com.caucho.xml.LooseHtml;import com.caucho.xml.QDocument;import com.caucho.xml.Xml;import com.caucho.xpath.Env;import com.caucho.xpath.Expr;import com.caucho.xpath.ExprEnvironment;import com.caucho.xpath.XPathException;import com.caucho.xpath.XPathFun;import com.caucho.xpath.pattern.AbstractPattern;import com.caucho.xsl.TransformerImpl;import org.w3c.dom.Document;import org.w3c.dom.DocumentType;import org.w3c.dom.Node;import javax.xml.transform.Source;import javax.xml.transform.TransformerException;import javax.xml.transform.URIResolver;import java.util.ArrayList;import java.util.logging.Level;import java.util.logging.Logger;/** * The document(...) function. */public class DocumentFun extends XPathFun {  static final Logger log = Log.open(DocumentFun.class);  TransformerImpl _transformer;  boolean _isHtml;  public DocumentFun(TransformerImpl transformer)  {    _transformer = transformer;  }  public void setHtml(boolean isHtml)  {    _isHtml = isHtml;  }    /**   * Evaluate the function.   *   * @param pattern The context pattern.   * @param args The evaluated arguments   */  public Object eval(Node node, ExprEnvironment env, 		     AbstractPattern pattern, ArrayList args)    throws XPathException  {    if (args.size() < 1)      return null;    Node basenode;    String name = Expr.toString(args.get(0));    if (args.size() > 1)      basenode = Expr.toNode(args.get(1));    else      basenode = Expr.toNode(args.get(0));    Path stylesheetPath = env.getStylesheetEnv().getPath();    URIResolver resolver = _transformer.getURIResolver();    Path path;    if (name == null || name.equals(""))      name = stylesheetPath.getTail();    String systemId = null;    DocumentType dtd = null;    Document owner = null;    if (basenode == null) {    }    else if (basenode.getOwnerDocument() != null) {      owner = basenode.getOwnerDocument();      dtd = owner.getDoctype();    }    else if (basenode instanceof Document) {      owner = (Document) basenode;      dtd = owner.getDoctype();    }        if (basenode instanceof CauchoNode)      systemId = ((CauchoNode) basenode).getBaseURI();    Path pwd = stylesheetPath.getParent();    if (systemId == null && owner instanceof QDocument)      systemId = ((QDocument) owner).getSystemId();    if (systemId == null && dtd != null)      systemId = dtd.getSystemId();    if (systemId == null)      systemId = stylesheetPath.getURL();    Node doc = null;    Source source = null;    if (resolver != null) {      try {	source = resolver.resolve(name, systemId);      } catch (TransformerException e) {	throw new XPathException(e);      }    }    if (source != null) {      systemId = source.getSystemId();      path = pwd.lookup(systemId);    }    else if (systemId != null) {      pwd = pwd.lookup(systemId).getParent();      path = pwd.lookup(name);    }    else      path = pwd.lookup(name);    _transformer.addCacheDepend(path);    if (env instanceof Env)      doc = (Node) ((Env) env).getCache(path);    if (doc != null)      return doc;    try {      if (_isHtml)        doc = new LooseHtml().parseDocument(path);      else        doc = new Xml().parseDocument(path);    } catch (Exception e) {      log.log(Level.FINE, e.toString(), e);            //XXX:throw new XPathException(e);    }    if (env instanceof Env && source == null)      ((Env) env).setCache(path, doc);    return doc;  }}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?