diff options
Diffstat (limited to 'src/share/classes/com/sun/org/apache/xalan/internal/xsltc/compiler/Include.java')
-rw-r--r-- | src/share/classes/com/sun/org/apache/xalan/internal/xsltc/compiler/Include.java | 156 |
1 files changed, 156 insertions, 0 deletions
diff --git a/src/share/classes/com/sun/org/apache/xalan/internal/xsltc/compiler/Include.java b/src/share/classes/com/sun/org/apache/xalan/internal/xsltc/compiler/Include.java new file mode 100644 index 0000000..3d549f4 --- /dev/null +++ b/src/share/classes/com/sun/org/apache/xalan/internal/xsltc/compiler/Include.java @@ -0,0 +1,156 @@ +/* + * reserved comment block + * DO NOT REMOVE OR ALTER! + */ +/* + * Copyright 2001-2004 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/* + * $Id: Include.java,v 1.8 2007/04/09 21:30:41 joehw Exp $ + */ + +package com.sun.org.apache.xalan.internal.xsltc.compiler; + +import java.io.File; +import java.io.FileNotFoundException; +import java.net.MalformedURLException; +import java.net.URL; +import java.util.Enumeration; + +import com.sun.org.apache.xml.internal.utils.SystemIDResolver; +import com.sun.org.apache.xalan.internal.xsltc.compiler.util.ClassGenerator; +import com.sun.org.apache.xalan.internal.xsltc.compiler.util.ErrorMsg; +import com.sun.org.apache.xalan.internal.xsltc.compiler.util.MethodGenerator; +import com.sun.org.apache.xalan.internal.xsltc.compiler.util.Type; +import com.sun.org.apache.xalan.internal.xsltc.compiler.util.TypeCheckError; + +import org.xml.sax.InputSource; +import org.xml.sax.XMLReader; + +/** + * @author Jacek Ambroziak + * @author Morten Jorgensen + * @author Erwin Bolwidt <ejb@klomp.org> + * @author Gunnlaugur Briem <gthb@dimon.is> + */ +final class Include extends TopLevelElement { + + private Stylesheet _included = null; + + public Stylesheet getIncludedStylesheet() { + return _included; + } + + public void parseContents(final Parser parser) { + XSLTC xsltc = parser.getXSLTC(); + Stylesheet context = parser.getCurrentStylesheet(); + + String docToLoad = getAttribute("href"); + try { + if (context.checkForLoop(docToLoad)) { + final ErrorMsg msg = new ErrorMsg(ErrorMsg.CIRCULAR_INCLUDE_ERR, + docToLoad, this); + parser.reportError(Constants.FATAL, msg); + return; + } + + InputSource input = null; + XMLReader reader = null; + String currLoadedDoc = context.getSystemId(); + SourceLoader loader = context.getSourceLoader(); + + // Use SourceLoader if available + if (loader != null) { + input = loader.loadSource(docToLoad, currLoadedDoc, xsltc); + if (input != null) { + docToLoad = input.getSystemId(); + reader = xsltc.getXMLReader(); + } else if (parser.errorsFound()) { + return; + } + } + + // No SourceLoader or not resolved by SourceLoader + if (input == null) { + docToLoad = SystemIDResolver.getAbsoluteURI(docToLoad, currLoadedDoc); + input = new InputSource(docToLoad); + } + + // Return if we could not resolve the URL + if (input == null) { + final ErrorMsg msg = + new ErrorMsg(ErrorMsg.FILE_NOT_FOUND_ERR, docToLoad, this); + parser.reportError(Constants.FATAL, msg); + return; + } + + final SyntaxTreeNode root; + if (reader != null) { + root = parser.parse(reader,input); + } + else { + root = parser.parse(input); + } + + if (root == null) return; + _included = parser.makeStylesheet(root); + if (_included == null) return; + + _included.setSourceLoader(loader); + _included.setSystemId(docToLoad); + _included.setParentStylesheet(context); + _included.setIncludingStylesheet(context); + _included.setTemplateInlining(context.getTemplateInlining()); + + // An included stylesheet gets the same import precedence + // as the stylesheet that included it. + final int precedence = context.getImportPrecedence(); + _included.setImportPrecedence(precedence); + parser.setCurrentStylesheet(_included); + _included.parseContents(parser); + + final Enumeration elements = _included.elements(); + final Stylesheet topStylesheet = parser.getTopLevelStylesheet(); + while (elements.hasMoreElements()) { + final Object element = elements.nextElement(); + if (element instanceof TopLevelElement) { + if (element instanceof Variable) { + topStylesheet.addVariable((Variable) element); + } + else if (element instanceof Param) { + topStylesheet.addParam((Param) element); + } + else { + topStylesheet.addElement((TopLevelElement) element); + } + } + } + } + catch (Exception e) { + e.printStackTrace(); + } + finally { + parser.setCurrentStylesheet(context); + } + } + + public Type typeCheck(SymbolTable stable) throws TypeCheckError { + return Type.Void; + } + + public void translate(ClassGenerator classGen, MethodGenerator methodGen) { + // do nothing + } +} |