You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@myfaces.apache.org by ta...@apache.org on 2019/03/19 16:30:22 UTC

[myfaces] branch master updated: cosmetics

This is an automated email from the ASF dual-hosted git repository.

tandraschko pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/myfaces.git


The following commit(s) were added to refs/heads/master by this push:
     new c7410b6  cosmetics
c7410b6 is described below

commit c7410b67e5ebfa1be412e7d6d90d2e982f049010
Author: Thomas Andraschko <ta...@apache.org>
AuthorDate: Tue Mar 19 17:30:13 2019 +0100

    cosmetics
---
 .../view/facelets/compiler/SAXCompiler.java        | 2258 ++++++++++----------
 1 file changed, 1129 insertions(+), 1129 deletions(-)

diff --git a/impl/src/main/java/org/apache/myfaces/view/facelets/compiler/SAXCompiler.java b/impl/src/main/java/org/apache/myfaces/view/facelets/compiler/SAXCompiler.java
index c004659..a1e1d39 100644
--- a/impl/src/main/java/org/apache/myfaces/view/facelets/compiler/SAXCompiler.java
+++ b/impl/src/main/java/org/apache/myfaces/view/facelets/compiler/SAXCompiler.java
@@ -1,1129 +1,1129 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you 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.
- */
-package org.apache.myfaces.view.facelets.compiler;
-
-import java.io.BufferedInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.URL;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-import java.security.AccessController;
-import java.security.PrivilegedExceptionAction;
-import java.security.PrivilegedActionException;
-import java.util.Arrays;
-import java.util.List;
-import java.util.Map;
-
-import javax.el.ELException;
-import javax.el.MethodExpression;
-import javax.el.ValueExpression;
-import javax.faces.FacesException;
-import javax.faces.view.Location;
-import javax.faces.view.facelets.FaceletException;
-import javax.faces.view.facelets.FaceletHandler;
-import javax.faces.view.facelets.Tag;
-import javax.faces.view.facelets.TagAttribute;
-import javax.faces.view.facelets.TagAttributes;
-import javax.xml.parsers.ParserConfigurationException;
-import javax.xml.parsers.SAXParser;
-import javax.xml.parsers.SAXParserFactory;
-
-import org.apache.myfaces.config.element.FaceletsProcessing;
-import org.apache.myfaces.util.ClassUtils;
-import org.apache.myfaces.view.facelets.tag.TagAttributeImpl;
-import org.apache.myfaces.view.facelets.tag.TagAttributesImpl;
-import org.apache.myfaces.view.facelets.tag.composite.CompositeLibrary;
-import org.apache.myfaces.view.facelets.tag.composite.ImplementationHandler;
-import org.apache.myfaces.view.facelets.tag.composite.InterfaceHandler;
-import org.apache.myfaces.view.facelets.tag.jsf.core.CoreLibrary;
-import org.apache.myfaces.view.facelets.tag.ui.UILibrary;
-import org.xml.sax.Attributes;
-import org.xml.sax.InputSource;
-import org.xml.sax.Locator;
-import org.xml.sax.SAXException;
-import org.xml.sax.SAXParseException;
-import org.xml.sax.XMLReader;
-import org.xml.sax.ext.LexicalHandler;
-import org.xml.sax.helpers.DefaultHandler;
-
-/**
- * Compiler implementation that uses SAX
- * 
- * @see org.apache.myfaces.view.facelets.compiler.Compiler
- * 
- * @author Jacob Hookom
- * @version $Id$
- */
-public final class SAXCompiler extends Compiler
-{
-
-    private final static Pattern XML_DECLARATION = Pattern
-            .compile("^<\\?xml.+?version=['\"](.+?)['\"](.+?encoding=['\"]((.+?))['\"])?.*?\\?>");
-
-    /**
-     * see https://issues.apache.org/jira/browse/MYFACES-4281
-     */
-    private final static List<String> SKIPPED_NAMESPACES = Arrays.asList("http://www.w3.org/1998/Math/MathML",
-            "http://www.w3.org/2000/svg","http://www.w3.org/1999/xlink");
-
-    private static class CompilationHandler extends DefaultHandler implements LexicalHandler
-    {
-
-        private final String alias;
-
-        private boolean inDocument = false;
-
-        private Locator locator;
-
-        private final CompilationManager unit;
-        
-        private boolean consumingCDATA = false;
-        private boolean swallowCDATAContent = false;
-
-        public CompilationHandler(CompilationManager unit, String alias)
-        {
-            this.unit = unit;
-            this.alias = alias;
-        }
-
-        @Override
-        public void characters(char[] ch, int start, int length) throws SAXException
-        {
-            if (this.inDocument && (!consumingCDATA || (consumingCDATA && !swallowCDATAContent)))
-            {
-                this.unit.writeText(new String(ch, start, length));
-            }
-        }
-
-        @Override
-        public void comment(char[] ch, int start, int length) throws SAXException
-        {
-            if (this.inDocument && !unit.getFaceletsProcessingInstructions().isConsumeXMLComments())
-            {
-                this.unit.writeComment(new String(ch, start, length));
-            }
-        }
-
-        protected TagAttributes createAttributes(Attributes attrs)
-        {
-            int len = attrs.getLength();
-            TagAttribute[] ta = new TagAttribute[len];
-            for (int i = 0; i < len; i++)
-            {
-                ta[i] = new TagAttributeImpl(this.createLocation(), attrs.getURI(i), attrs.getLocalName(i), attrs
-                        .getQName(i), attrs.getValue(i));
-            }
-            return new TagAttributesImpl(ta);
-        }
-
-        protected Location createLocation()
-        {
-            return new Location(this.alias, this.locator.getLineNumber(), this.locator.getColumnNumber());
-        }
-
-        @Override
-        public void endCDATA() throws SAXException
-        {
-            if (this.inDocument)
-            {
-                if (!this.unit.getFaceletsProcessingInstructions().isConsumeCDataSections())
-                {
-                    this.unit.writeInstruction("]]>");
-                }
-                else
-                {
-                    this.consumingCDATA = false;
-                    this.swallowCDATAContent = false;
-                }
-            }
-        }
-
-        @Override
-        public void endDTD() throws SAXException
-        {
-            this.inDocument = true;
-        }
-
-        @Override
-        public void endElement(String uri, String localName, String qName) throws SAXException
-        {
-            this.unit.popTag();
-        }
-
-        @Override
-        public void endEntity(String name) throws SAXException
-        {
-        }
-
-        @Override
-        public void endPrefixMapping(String prefix) throws SAXException
-        {
-            this.unit.popNamespace(prefix);
-        }
-
-        @Override
-        public void fatalError(SAXParseException e) throws SAXException
-        {
-            if (this.locator != null)
-            {
-                throw new SAXException("Error Traced[line: " + this.locator.getLineNumber() + "] " + e.getMessage());
-            }
-            else
-            {
-                throw e;
-            }
-        }
-
-        @Override
-        public void ignorableWhitespace(char[] ch, int start, int length) throws SAXException
-        {
-            if (this.inDocument)
-            {
-                this.unit.writeWhitespace(new String(ch, start, length));
-            }
-        }
-
-        @Override
-        public InputSource resolveEntity(String publicId, String systemId) throws SAXException
-        {
-            String dtd = "org/apache/myfaces/resource/default.dtd";
-            /*
-             * if ("-//W3C//DTD XHTML 1.0 Transitional//EN".equals(publicId)) { dtd = "xhtml1-transitional.dtd"; } else
-             * if (systemId != null && systemId.startsWith("file:/")) { return new InputSource(systemId); }
-             */
-            URL url = ClassUtils.getResource(dtd);
-            return new InputSource(url.toString());
-        }
-
-        @Override
-        public void setDocumentLocator(Locator locator)
-        {
-            this.locator = locator;
-        }
-
-        @Override
-        public void startCDATA() throws SAXException
-        {
-            if (this.inDocument)
-            {
-                if (!this.unit.getFaceletsProcessingInstructions().isConsumeCDataSections())
-                {
-                    this.unit.writeInstruction("<![CDATA[");
-                }
-                else
-                {
-                    this.consumingCDATA = true;
-                    this.swallowCDATAContent = this.unit.getFaceletsProcessingInstructions().isSwallowCDataContent();
-                }
-            }
-        }
-
-        @Override
-        public void startDocument() throws SAXException
-        {
-            this.inDocument = true;
-        }
-
-        @Override
-        public void startDTD(String name, String publicId, String systemId) throws SAXException
-        {
-            if (this.inDocument && !unit.getFaceletsProcessingInstructions().isConsumeXmlDocType())
-            {
-                this.unit.writeDoctype(name, publicId, systemId);
-                /*
-                StringBuffer sb = new StringBuffer(64);
-                sb.append("<!DOCTYPE ").append(name);
-                if (publicId != null)
-                {
-                    sb.append(" PUBLIC \"").append(publicId).append("\"");
-                    if (systemId != null)
-                    {
-                        sb.append(" \"").append(systemId).append("\"");
-                    }
-                }
-                else if (systemId != null)
-                {
-                    sb.append(" SYSTEM \"").append(systemId).append("\"");
-                }
-                sb.append(" >\n");
-                this.unit.writeInstruction(sb.toString());
-                */
-            }
-            this.inDocument = false;
-        }
-
-        @Override
-        public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException
-        {
-            this.unit.pushTag(new Tag(this.createLocation(), uri, localName, qName, this.createAttributes(attributes)));
-        }
-
-        @Override
-        public void startEntity(String name) throws SAXException
-        {
-        }
-
-        @Override
-        public void startPrefixMapping(String prefix, String uri) throws SAXException
-        {
-            if (!SAXCompiler.SKIPPED_NAMESPACES.contains(uri))
-            {
-                this.unit.pushNamespace(prefix, uri);
-            }
-        }
-
-        @Override
-        public void processingInstruction(String target, String data) throws SAXException
-        {
-            if (this.inDocument && !this.unit.getFaceletsProcessingInstructions().isConsumeProcessingInstructions())
-            {
-                StringBuilder sb = new StringBuilder(64);
-                sb.append("<?").append(target).append(' ').append(data).append("?>\n");
-                this.unit.writeInstruction(sb.toString());
-            }
-        }
-    }
-    
-    /**
-     * Like CompilationHandler but does not take into account everything outside f:metadata tag 
-     * 
-     * @since 2.0
-     */
-    private static class ViewMetadataHandler extends DefaultHandler implements LexicalHandler
-    {
-
-        private final String alias;
-
-        private boolean inDocument = false;
-
-        private Locator locator;
-
-        private final CompilationManager unit;
-        
-        private boolean inMetadata = false;
-        private int uiRemoveCount = 0;
-        
-        private boolean consumingCDATA = false;
-        private boolean swallowCDATAContent = false;
-
-        public ViewMetadataHandler(CompilationManager unit, String alias)
-        {
-            this.unit = unit;
-            this.alias = alias;
-        }
-
-        @Override
-        public void characters(char[] ch, int start, int length) throws SAXException
-        {
-            if (this.inDocument && inMetadata && (!consumingCDATA || (consumingCDATA && !swallowCDATAContent)))
-            {
-                this.unit.writeText(new String(ch, start, length));
-            }
-        }
-
-        @Override
-        public void comment(char[] ch, int start, int length) throws SAXException
-        {
-            if (this.inDocument && inMetadata && !unit.getFaceletsProcessingInstructions().isConsumeXMLComments())
-            {
-                this.unit.writeComment(new String(ch, start, length));
-            }
-        }
-
-        protected TagAttributes createAttributes(Attributes attrs)
-        {
-            int len = attrs.getLength();
-            TagAttribute[] ta = new TagAttribute[len];
-            for (int i = 0; i < len; i++)
-            {
-                ta[i] = new TagAttributeImpl(this.createLocation(), attrs.getURI(i), attrs.getLocalName(i), attrs
-                        .getQName(i), attrs.getValue(i));
-            }
-            return new TagAttributesImpl(ta);
-        }
-
-        protected Location createLocation()
-        {
-            return new Location(this.alias, this.locator.getLineNumber(), this.locator.getColumnNumber());
-        }
-
-        @Override
-        public void endCDATA() throws SAXException
-        {
-            if (this.inDocument && inMetadata)
-            {
-                if (!this.unit.getFaceletsProcessingInstructions().isConsumeCDataSections())
-                {
-                    this.unit.writeInstruction("]]>");
-                }
-                else
-                {
-                    this.consumingCDATA = false;
-                    this.swallowCDATAContent = false;
-                }
-            }
-        }
-
-        @Override
-        public void endDTD() throws SAXException
-        {
-            this.inDocument = true;
-        }
-
-        @Override
-        public void endElement(String uri, String localName, String qName) throws SAXException
-        {
-            if (inMetadata)
-            {
-                this.unit.popTag();
-            }
-            if ((CoreLibrary.NAMESPACE.equals(uri) || CoreLibrary.ALIAS_NAMESPACE.equals(uri)))
-            {
-                if ("metadata".equals(localName))
-                {
-                    this.inMetadata=false;
-                }
-                else if (!inMetadata && "view".equals(localName))
-                {
-                    this.unit.popTag();
-                }
-            }
-            else if (UILibrary.NAMESPACE.equals(uri) || UILibrary.ALIAS_NAMESPACE.equals(uri))
-            {
-                if (!inMetadata && "remove".equals(localName))
-                {
-                    this.uiRemoveCount--;
-                }
-            }
-        }
-
-        @Override
-        public void endEntity(String name) throws SAXException
-        {
-        }
-
-        @Override
-        public void endPrefixMapping(String prefix) throws SAXException
-        {
-            this.unit.popNamespace(prefix);
-        }
-
-        @Override
-        public void fatalError(SAXParseException e) throws SAXException
-        {
-            if (this.locator != null)
-            {
-                throw new SAXException("Error Traced[line: " + this.locator.getLineNumber() + "] " + e.getMessage());
-            }
-            else
-            {
-                throw e;
-            }
-        }
-
-        @Override
-        public void ignorableWhitespace(char[] ch, int start, int length) throws SAXException
-        {
-            if (this.inDocument && inMetadata)
-            {
-                this.unit.writeWhitespace(new String(ch, start, length));
-            }
-        }
-
-        @Override
-        public InputSource resolveEntity(String publicId, String systemId) throws SAXException
-        {
-            String dtd = "org/apache/myfaces/resource/default.dtd";
-            /*
-             * if ("-//W3C//DTD XHTML 1.0 Transitional//EN".equals(publicId)) { dtd = "xhtml1-transitional.dtd"; } else
-             * if (systemId != null && systemId.startsWith("file:/")) { return new InputSource(systemId); }
-             */
-            URL url = ClassUtils.getResource(dtd);
-            return new InputSource(url.toString());
-        }
-
-        @Override
-        public void setDocumentLocator(Locator locator)
-        {
-            this.locator = locator;
-        }
-
-        @Override
-        public void startCDATA() throws SAXException
-        {
-            if (this.inDocument && inMetadata)
-            {
-                if (!this.unit.getFaceletsProcessingInstructions().isConsumeCDataSections())
-                {
-                    this.unit.writeInstruction("<![CDATA[");
-                }
-                else
-                {
-                    this.consumingCDATA = true;
-                    this.swallowCDATAContent = this.unit.getFaceletsProcessingInstructions().isSwallowCDataContent();
-                }
-            }
-        }
-
-        @Override
-        public void startDocument() throws SAXException
-        {
-            this.inDocument = true;
-        }
-
-        @Override
-        public void startDTD(String name, String publicId, String systemId) throws SAXException
-        {
-            // metadata does not require output doctype
-            this.inDocument = false;
-        }
-
-        @Override
-        public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException
-        {
-            if ( (CoreLibrary.NAMESPACE.equals(uri) ||
-                  CoreLibrary.ALIAS_NAMESPACE.equals(uri)) && this.uiRemoveCount <= 0)
-            {
-                if ("metadata".equals(localName))
-                {
-                    this.inMetadata=true;
-                }
-                else if (!inMetadata && "view".equals(localName))
-                {
-                    this.unit.pushTag(new Tag(createLocation(), uri, localName, qName, createAttributes(attributes)));
-                }
-            }
-            if (inMetadata)
-            {
-                this.unit.pushTag(new Tag(createLocation(), uri, localName, qName, createAttributes(attributes)));
-            }
-            else if (UILibrary.NAMESPACE.equals(uri) ||
-                    UILibrary.ALIAS_NAMESPACE.equals(uri))
-            {
-                if ("remove".equals(localName))
-                {
-                    this.uiRemoveCount++;
-                }
-            }
-        }
-
-        @Override
-        public void startEntity(String name) throws SAXException
-        {
-        }
-
-        @Override
-        public void startPrefixMapping(String prefix, String uri) throws SAXException
-        {
-            this.unit.pushNamespace(prefix, uri);
-        }
-
-        @Override
-        public void processingInstruction(String target, String data) throws SAXException
-        {
-            if (inDocument && inMetadata && !unit.getFaceletsProcessingInstructions().isConsumeProcessingInstructions())
-            {
-                StringBuilder sb = new StringBuilder(64);
-                sb.append("<?").append(target).append(' ').append(data).append("?>\n");
-                unit.writeInstruction(sb.toString());
-            }
-        }        
-    }
-    
-    /**
-     * Like CompilationHandler but does not take into account everything outside cc:interface or cc:implementation tag.
-     *  
-     * Note inside cc:implementation it only takes into account cc:insertChildren, cc:insertFacet and cc:renderFacet,
-     * all other tags, comments or text are just skipped.
-     * 
-     * @since 2.0.1
-     */
-    private static class CompositeComponentMetadataHandler extends DefaultHandler implements LexicalHandler
-    {
-
-        private final String alias;
-
-        private boolean inDocument = false;
-
-        private Locator locator;
-
-        private final CompilationManager unit;
-        
-        private boolean inCompositeInterface = false;
-        
-        private boolean inCompositeImplementation = false;
-
-        private boolean consumingCDATA = false;
-        private boolean swallowCDATAContent = false;
-
-        public CompositeComponentMetadataHandler(CompilationManager unit, String alias)
-        {
-            this.unit = unit;
-            this.alias = alias;
-        }
-
-        @Override
-        public void characters(char[] ch, int start, int length) throws SAXException
-        {
-            if (this.inDocument && inCompositeInterface && 
-                    (!consumingCDATA || (consumingCDATA && !swallowCDATAContent)))
-            {
-                this.unit.writeText(new String(ch, start, length));
-            }
-        }
-
-        @Override
-        public void comment(char[] ch, int start, int length) throws SAXException
-        {
-            if (inDocument && inCompositeInterface && 
-                    !unit.getFaceletsProcessingInstructions().isConsumeXMLComments())
-            {
-                this.unit.writeComment(new String(ch, start, length));
-            }
-        }
-
-        protected TagAttributes createAttributes(Attributes attrs)
-        {
-            int len = attrs.getLength();
-            TagAttribute[] ta = new TagAttribute[len];
-            for (int i = 0; i < len; i++)
-            {
-                ta[i] = new TagAttributeImpl(this.createLocation(), attrs.getURI(i), attrs.getLocalName(i), attrs
-                        .getQName(i), attrs.getValue(i));
-            }
-            return new TagAttributesImpl(ta);
-        }
-
-        protected Location createLocation()
-        {
-            return new Location(this.alias, this.locator.getLineNumber(), this.locator.getColumnNumber());
-        }
-
-        @Override
-        public void endCDATA() throws SAXException
-        {
-            if (this.inDocument && inCompositeInterface)
-            {
-                if (!this.unit.getFaceletsProcessingInstructions().isConsumeCDataSections())
-                {
-                    this.unit.writeInstruction("]]>");
-                }
-                else
-                {
-                    this.consumingCDATA = false;
-                    this.swallowCDATAContent = false;
-                }
-            }
-        }
-
-        @Override
-        public void endDTD() throws SAXException
-        {
-            this.inDocument = true;
-        }
-
-        @Override
-        public void endElement(String uri, String localName, String qName) throws SAXException
-        {
-            if (inCompositeInterface)
-            {
-                this.unit.popTag();
-            }
-            else if (inCompositeImplementation && 
-                (CompositeLibrary.NAMESPACE.equals(uri) || CompositeLibrary.ALIAS_NAMESPACE.equals(uri)) )
-            {
-                if ( "insertFacet".equals(localName) ||
-                     "renderFacet".equals(localName) ||
-                     "insertChildren".equals(localName) || 
-                     ImplementationHandler.NAME.equals(localName))
-                {
-                    this.unit.popTag();
-                }
-            }
-            
-            if (CompositeLibrary.NAMESPACE.equals(uri) || CompositeLibrary.ALIAS_NAMESPACE.equals(uri))
-            {
-                if (InterfaceHandler.NAME.equals(localName))
-                {
-                    this.inCompositeInterface=false;
-                }
-                else if (ImplementationHandler.NAME.equals(localName))
-                {
-                    this.inCompositeImplementation=false;
-                }
-            }
-        }
-
-        @Override
-        public void endEntity(String name) throws SAXException
-        {
-        }
-
-        @Override
-        public void endPrefixMapping(String prefix) throws SAXException
-        {
-            this.unit.popNamespace(prefix);
-        }
-
-        @Override
-        public void fatalError(SAXParseException e) throws SAXException
-        {
-            if (this.locator != null)
-            {
-                throw new SAXException("Error Traced[line: " + this.locator.getLineNumber() + "] " + e.getMessage());
-            }
-            else
-            {
-                throw e;
-            }
-        }
-
-        @Override
-        public void ignorableWhitespace(char[] ch, int start, int length) throws SAXException
-        {
-            if (this.inDocument && inCompositeInterface)
-            {
-                this.unit.writeWhitespace(new String(ch, start, length));
-            }
-        }
-
-        @Override
-        public InputSource resolveEntity(String publicId, String systemId) throws SAXException
-        {
-            String dtd = "org/apache/myfaces/resource/default.dtd";
-            /*
-             * if ("-//W3C//DTD XHTML 1.0 Transitional//EN".equals(publicId)) { dtd = "xhtml1-transitional.dtd"; } else
-             * if (systemId != null && systemId.startsWith("file:/")) { return new InputSource(systemId); }
-             */
-            URL url = ClassUtils.getResource(dtd);
-            return new InputSource(url.toString());
-        }
-
-        @Override
-        public void setDocumentLocator(Locator locator)
-        {
-            this.locator = locator;
-        }
-
-        @Override
-        public void startCDATA() throws SAXException
-        {
-            if (this.inDocument && inCompositeInterface)
-            {
-                if (!this.unit.getFaceletsProcessingInstructions().isConsumeCDataSections())
-                {
-                    this.unit.writeInstruction("<![CDATA[");
-                }
-                else
-                {
-                    this.consumingCDATA = true;
-                    this.swallowCDATAContent = this.unit.getFaceletsProcessingInstructions().isSwallowCDataContent();
-                }
-            }
-        }
-
-        @Override
-        public void startDocument() throws SAXException
-        {
-            this.inDocument = true;
-        }
-
-        @Override
-        public void startDTD(String name, String publicId, String systemId) throws SAXException
-        {
-            // metadata does not require output doctype
-            this.inDocument = false;
-        }
-
-        @Override
-        public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException
-        {
-            if (CompositeLibrary.NAMESPACE.equals(uri) || CompositeLibrary.ALIAS_NAMESPACE.equals(uri))
-            {
-                if (InterfaceHandler.NAME.equals(localName))
-                {
-                    this.inCompositeInterface=true;
-                }
-                else if (ImplementationHandler.NAME.equals(localName))
-                {
-                    this.inCompositeImplementation=true;
-                }
-            }
-            
-            if (inCompositeInterface)
-            {
-                this.unit.pushTag(new Tag(createLocation(), uri, localName, qName, createAttributes(attributes)));
-            }
-            else if (inCompositeImplementation && 
-                (CompositeLibrary.NAMESPACE.equals(uri) || CompositeLibrary.ALIAS_NAMESPACE.equals(uri)))
-            {
-                if ("insertFacet".equals(localName)    ||
-                    "renderFacet".equals(localName)    ||
-                    "insertChildren".equals(localName) ||
-                    ImplementationHandler.NAME.equals(localName)   )
-                {
-                    this.unit.pushTag(new Tag(createLocation(), uri, localName, qName, createAttributes(attributes)));
-                }
-            }
-        }
-
-        @Override
-        public void startEntity(String name) throws SAXException
-        {
-        }
-
-        @Override
-        public void startPrefixMapping(String prefix, String uri) throws SAXException
-        {
-            this.unit.pushNamespace(prefix, uri);
-        }
-
-        @Override
-        public void processingInstruction(String target, String data) throws SAXException
-        {
-            if (inDocument && inCompositeInterface
-                && !unit.getFaceletsProcessingInstructions().isConsumeProcessingInstructions())
-            {
-                StringBuilder sb = new StringBuilder(64);
-                sb.append("<?").append(target).append(' ').append(data).append("?>\n");
-                this.unit.writeInstruction(sb.toString());
-            }
-        }        
-    }
-
-    public SAXCompiler()
-    {
-        super();
-    }
-
-    @Override
-    public FaceletHandler doCompile(URL src, String alias)
-            throws IOException, FaceletException, ELException, FacesException
-    {
-        CompilationManager mngr = null;
-        InputStream is = null;
-        String encoding = null;
-        try
-        {
-            is = new BufferedInputStream(src.openStream(), 1024);
-            mngr = new CompilationManager(alias, this, getFaceletsProcessingInstructions(src, alias));
-            encoding = writeXmlDecl(is, mngr);
-            CompilationHandler handler = new CompilationHandler(mngr, alias);
-            SAXParser parser = this.createSAXParser(handler);
-            parser.parse(is, handler);
-        }
-        catch (SAXException e)
-        {
-            throw new FaceletException("Error Parsing " + alias + ": " + e.getMessage(), e.getCause());
-        }
-        catch (ParserConfigurationException e)
-        {
-            throw new FaceletException("Error Configuring Parser " + alias + ": " + e.getMessage(), e.getCause());
-        }
-        finally
-        {
-            if (is != null)
-            {
-                is.close();
-            }
-        }
-        return new EncodingHandler(mngr.createFaceletHandler(), encoding);
-    }
-
-    /**
-     * @since 2.0
-     */
-    @Override
-    protected FaceletHandler doCompileViewMetadata(URL src, String alias)
-            throws IOException, FaceletException, ELException, FacesException
-    {
-        CompilationManager mngr = null;
-        InputStream is = null;
-        String encoding = null;
-        try
-        {
-            is = new BufferedInputStream(src.openStream(), 1024);
-            mngr = new CompilationManager(alias, this, getFaceletsProcessingInstructions(src, alias));
-            encoding = getXmlDecl(is, mngr);
-            final ViewMetadataHandler handler = new ViewMetadataHandler(mngr, alias);
-            final SAXParser parser = this.createSAXParser(handler);
-            
-            if (System.getSecurityManager() != null)
-            {
-                try
-                {
-                    final InputStream finalInputStream = is;
-                    AccessController.doPrivileged(new PrivilegedExceptionAction() 
-                    {
-                        public Object run() throws SAXException, IOException 
-                        {
-                            parser.parse(finalInputStream, handler);
-                            return null; 
-                        }
-                    });
-                }
-                catch (PrivilegedActionException pae)
-                {
-                    Exception e = pae.getException();
-                    if(e instanceof SAXException)
-                    {
-                        throw new FaceletException("Error Parsing " + alias + ": " + e.getMessage(), e.getCause());
-                    } 
-                    else if(e instanceof IOException)
-                    {
-                        throw (IOException)e;
-                    }
-                }
-            }
-            else
-            {
-                parser.parse(is, handler);
-            }
-        }
-        catch (SAXException e)
-        {
-            throw new FaceletException("Error Parsing " + alias + ": " + e.getMessage(), e.getCause());
-        }
-        catch (ParserConfigurationException e)
-        {
-            throw new FaceletException("Error Configuring Parser " + alias + ": " + e.getMessage(), e.getCause());
-        }
-        finally
-        {
-            if (is != null)
-            {
-                is.close();
-            }
-        }
-        return new EncodingHandler(mngr.createFaceletHandler(), encoding);
-    }
-
-    /**
-     * @since 2.0.1
-     */
-    @Override
-    protected FaceletHandler doCompileCompositeComponentMetadata(URL src, String alias)
-            throws IOException, FaceletException, ELException, FacesException
-    {
-        CompilationManager mngr = null;
-        InputStream is = null;
-        String encoding = null;
-        try
-        {
-            is = new BufferedInputStream(src.openStream(), 1024);
-            mngr = new CompilationManager(alias, this, getFaceletsProcessingInstructions(src, alias));
-            encoding = getXmlDecl(is, mngr);
-            CompositeComponentMetadataHandler handler = new CompositeComponentMetadataHandler(mngr, alias);
-            SAXParser parser = this.createSAXParser(handler);
-            parser.parse(is, handler);
-        }
-        catch (SAXException e)
-        {
-            throw new FaceletException("Error Parsing " + alias + ": " + e.getMessage(), e.getCause());
-        }
-        catch (ParserConfigurationException e)
-        {
-            throw new FaceletException("Error Configuring Parser " + alias + ": " + e.getMessage(), e.getCause());
-        }
-        finally
-        {
-            if (is != null)
-            {
-                is.close();
-            }
-        }
-        return new EncodingHandler(mngr.createFaceletHandler(), encoding);
-    }
-    
-    @Override
-    protected FaceletHandler doCompileComponent(
-        String taglibURI, String tagName, Map<String, Object> attributes)
-    {
-        String alias = tagName;
-        CompilationManager mngr = new CompilationManager(alias, this, getDefaultFaceletsProcessingInstructions());
-        String prefix = "oamf"; // The prefix is only a logical name.
-        mngr.pushNamespace(prefix, taglibURI);
-        
-        boolean tagContainParams = ( 
-                ("include".equals(tagName) || "decorate".equals(tagName) || "composition".equals(tagName)) && 
-                (UILibrary.NAMESPACE.equals(taglibURI) || UILibrary.ALIAS_NAMESPACE.equals(taglibURI)) );
-        
-        Location location = new Location(alias, 0, 0);
-        int len = attributes.size();
-        if (tagContainParams && attributes.containsKey("params"))
-        {
-            len = len-1;
-        }
-        
-        TagAttribute[] ta = new TagAttribute[len];
-        int i = 0;
-        Map<String, Object> paramsMap = null;
-        for (Map.Entry<String, Object> entry : attributes.entrySet())
-        {
-            String stringValue = null;
-            
-            if (tagContainParams && "params".equals(entry.getKey()))
-            {
-                paramsMap = (Map<String, Object>) entry.getValue();
-            }
-            else
-            {
-                if (entry.getValue() instanceof ValueExpression)
-                {
-                    stringValue = ((ValueExpression)entry.getValue()).getExpressionString();
-                }
-                else if (entry.getValue() instanceof MethodExpression)
-                {
-                    stringValue = ((MethodExpression)entry.getValue()).getExpressionString();
-                }
-                else if (entry.getValue() != null)
-                {
-                    stringValue = entry.getValue().toString();
-                }
-                ta[i] = new TagAttributeImpl(location, "", entry.getKey(), entry.getKey(), stringValue);
-                i++;
-            }
-        }        
-        mngr.pushTag(new Tag(location, taglibURI, tagName, "oamf:"+tagName, new TagAttributesImpl(ta)));
-        
-        if (tagContainParams && paramsMap != null)
-        {
-            for (Map.Entry<String, Object> entry : paramsMap.entrySet())
-            {
-                TagAttribute[] tap = new TagAttribute[2];
-                String stringValue = null;
-                if (entry.getValue() instanceof ValueExpression)
-                {
-                    stringValue = ((ValueExpression)entry.getValue()).getExpressionString();
-                }
-                else if (entry.getValue() instanceof MethodExpression)
-                {
-                    stringValue = ((MethodExpression)entry.getValue()).getExpressionString();
-                }
-                else if (entry.getValue() != null)
-                {
-                    stringValue = entry.getValue().toString();
-                }
-                tap[0] = new TagAttributeImpl(location, "", "name", "name", entry.getKey());
-                tap[1] = new TagAttributeImpl(location, "", "value", "value", stringValue);
-                mngr.pushTag(new Tag(location, UILibrary.NAMESPACE, "param", "oamf:param", new TagAttributesImpl(tap)));
-                mngr.popTag();
-            }
-        }
-        mngr.popTag();
-        mngr.popNamespace(prefix);
-        
-        FaceletHandler handler = new DynamicComponentFacelet((NamespaceHandler) mngr.createFaceletHandler());
-        return handler;
-    }
-    
-    protected FaceletsProcessingInstructions getDefaultFaceletsProcessingInstructions()
-    {
-        return FaceletsProcessingInstructions.getProcessingInstructions(FaceletsProcessing.PROCESS_AS_XHTML, false);
-    }
-    
-    protected FaceletsProcessingInstructions getFaceletsProcessingInstructions(URL src, String alias)
-    {
-        String processAs = null;
-        boolean compressSpaces = false;
-        for (FaceletsProcessing entry : getFaceletsProcessingConfigurations())
-        {
-            if (src.getPath().endsWith(entry.getFileExtension()))
-            {
-                processAs = entry.getProcessAs();
-                compressSpaces = Boolean.valueOf(entry.getOamCompressSpaces());
-                break;
-            }
-        }
-        return FaceletsProcessingInstructions.getProcessingInstructions(processAs, compressSpaces);
-    }
-
-    protected static String writeXmlDecl(InputStream is, CompilationManager mngr) throws IOException
-    {
-        is.mark(128);
-        String encoding = null;
-        try
-        {
-            byte[] b = new byte[128];
-            if (is.read(b) > 0)
-            {
-                String r = new String(b);
-                Matcher m = XML_DECLARATION.matcher(r);
-                if (m.find())
-                {
-                    if (!mngr.getFaceletsProcessingInstructions().isConsumeXmlDeclaration())
-                    {
-                        mngr.writeInstruction(m.group(0) + '\n');
-                    }
-                    if (m.group(3) != null)
-                    {
-                        encoding = m.group(3);
-                    }
-                }
-            }
-        }
-        finally
-        {
-            is.reset();
-        }
-        return encoding;
-    }
-    
-    protected static String getXmlDecl(InputStream is, CompilationManager mngr) throws IOException
-    {
-        is.mark(128);
-        String encoding = null;
-        try
-        {
-            byte[] b = new byte[128];
-            if (is.read(b) > 0)
-            {
-                String r = new String(b);
-                Matcher m = XML_DECLARATION.matcher(r);
-                if (m.find() && m.group(3) != null)
-                {
-                    encoding = m.group(3);
-                }
-            }
-        }
-        finally
-        {
-            is.reset();
-        }
-        return encoding;
-    }
-
-    private SAXParser createSAXParser(DefaultHandler handler) throws SAXException,
-            ParserConfigurationException
-    {
-        SAXParserFactory factory = SAXParserFactory.newInstance();
-        factory.setNamespaceAware(true);
-        factory.setFeature("http://xml.org/sax/features/namespace-prefixes", true);
-        factory.setFeature("http://xml.org/sax/features/validation", this.isValidating());
-        factory.setValidating(this.isValidating());
-        SAXParser parser = factory.newSAXParser();
-        XMLReader reader = parser.getXMLReader();
-        reader.setProperty("http://xml.org/sax/properties/lexical-handler", handler);
-        reader.setErrorHandler(handler);
-        reader.setEntityResolver(handler);
-        return parser;
-    }
-
-}
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.
+ */
+package org.apache.myfaces.view.facelets.compiler;
+
+import java.io.BufferedInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URL;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import java.security.AccessController;
+import java.security.PrivilegedExceptionAction;
+import java.security.PrivilegedActionException;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+
+import javax.el.ELException;
+import javax.el.MethodExpression;
+import javax.el.ValueExpression;
+import javax.faces.FacesException;
+import javax.faces.view.Location;
+import javax.faces.view.facelets.FaceletException;
+import javax.faces.view.facelets.FaceletHandler;
+import javax.faces.view.facelets.Tag;
+import javax.faces.view.facelets.TagAttribute;
+import javax.faces.view.facelets.TagAttributes;
+import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.parsers.SAXParser;
+import javax.xml.parsers.SAXParserFactory;
+
+import org.apache.myfaces.config.element.FaceletsProcessing;
+import org.apache.myfaces.util.ClassUtils;
+import org.apache.myfaces.view.facelets.tag.TagAttributeImpl;
+import org.apache.myfaces.view.facelets.tag.TagAttributesImpl;
+import org.apache.myfaces.view.facelets.tag.composite.CompositeLibrary;
+import org.apache.myfaces.view.facelets.tag.composite.ImplementationHandler;
+import org.apache.myfaces.view.facelets.tag.composite.InterfaceHandler;
+import org.apache.myfaces.view.facelets.tag.jsf.core.CoreLibrary;
+import org.apache.myfaces.view.facelets.tag.ui.UILibrary;
+import org.xml.sax.Attributes;
+import org.xml.sax.InputSource;
+import org.xml.sax.Locator;
+import org.xml.sax.SAXException;
+import org.xml.sax.SAXParseException;
+import org.xml.sax.XMLReader;
+import org.xml.sax.ext.LexicalHandler;
+import org.xml.sax.helpers.DefaultHandler;
+
+/**
+ * Compiler implementation that uses SAX
+ * 
+ * @see org.apache.myfaces.view.facelets.compiler.Compiler
+ * 
+ * @author Jacob Hookom
+ * @version $Id$
+ */
+public final class SAXCompiler extends Compiler
+{
+
+    private final static Pattern XML_DECLARATION = Pattern
+            .compile("^<\\?xml.+?version=['\"](.+?)['\"](.+?encoding=['\"]((.+?))['\"])?.*?\\?>");
+
+    /**
+     * see https://issues.apache.org/jira/browse/MYFACES-4281
+     */
+    private final static List<String> SKIPPED_NAMESPACES = Arrays.asList("http://www.w3.org/1998/Math/MathML",
+            "http://www.w3.org/2000/svg","http://www.w3.org/1999/xlink");
+
+    private static class CompilationHandler extends DefaultHandler implements LexicalHandler
+    {
+
+        private final String alias;
+
+        private boolean inDocument = false;
+
+        private Locator locator;
+
+        private final CompilationManager unit;
+        
+        private boolean consumingCDATA = false;
+        private boolean swallowCDATAContent = false;
+
+        public CompilationHandler(CompilationManager unit, String alias)
+        {
+            this.unit = unit;
+            this.alias = alias;
+        }
+
+        @Override
+        public void characters(char[] ch, int start, int length) throws SAXException
+        {
+            if (this.inDocument && (!consumingCDATA || (consumingCDATA && !swallowCDATAContent)))
+            {
+                this.unit.writeText(new String(ch, start, length));
+            }
+        }
+
+        @Override
+        public void comment(char[] ch, int start, int length) throws SAXException
+        {
+            if (this.inDocument && !unit.getFaceletsProcessingInstructions().isConsumeXMLComments())
+            {
+                this.unit.writeComment(new String(ch, start, length));
+            }
+        }
+
+        protected TagAttributes createAttributes(Attributes attrs)
+        {
+            int len = attrs.getLength();
+            TagAttribute[] ta = new TagAttribute[len];
+            for (int i = 0; i < len; i++)
+            {
+                ta[i] = new TagAttributeImpl(this.createLocation(), attrs.getURI(i), attrs.getLocalName(i), attrs
+                        .getQName(i), attrs.getValue(i));
+            }
+            return new TagAttributesImpl(ta);
+        }
+
+        protected Location createLocation()
+        {
+            return new Location(this.alias, this.locator.getLineNumber(), this.locator.getColumnNumber());
+        }
+
+        @Override
+        public void endCDATA() throws SAXException
+        {
+            if (this.inDocument)
+            {
+                if (!this.unit.getFaceletsProcessingInstructions().isConsumeCDataSections())
+                {
+                    this.unit.writeInstruction("]]>");
+                }
+                else
+                {
+                    this.consumingCDATA = false;
+                    this.swallowCDATAContent = false;
+                }
+            }
+        }
+
+        @Override
+        public void endDTD() throws SAXException
+        {
+            this.inDocument = true;
+        }
+
+        @Override
+        public void endElement(String uri, String localName, String qName) throws SAXException
+        {
+            this.unit.popTag();
+        }
+
+        @Override
+        public void endEntity(String name) throws SAXException
+        {
+        }
+
+        @Override
+        public void endPrefixMapping(String prefix) throws SAXException
+        {
+            this.unit.popNamespace(prefix);
+        }
+
+        @Override
+        public void fatalError(SAXParseException e) throws SAXException
+        {
+            if (this.locator != null)
+            {
+                throw new SAXException("Error Traced[line: " + this.locator.getLineNumber() + "] " + e.getMessage());
+            }
+            else
+            {
+                throw e;
+            }
+        }
+
+        @Override
+        public void ignorableWhitespace(char[] ch, int start, int length) throws SAXException
+        {
+            if (this.inDocument)
+            {
+                this.unit.writeWhitespace(new String(ch, start, length));
+            }
+        }
+
+        @Override
+        public InputSource resolveEntity(String publicId, String systemId) throws SAXException
+        {
+            String dtd = "org/apache/myfaces/resource/default.dtd";
+            /*
+             * if ("-//W3C//DTD XHTML 1.0 Transitional//EN".equals(publicId)) { dtd = "xhtml1-transitional.dtd"; } else
+             * if (systemId != null && systemId.startsWith("file:/")) { return new InputSource(systemId); }
+             */
+            URL url = ClassUtils.getResource(dtd);
+            return new InputSource(url.toString());
+        }
+
+        @Override
+        public void setDocumentLocator(Locator locator)
+        {
+            this.locator = locator;
+        }
+
+        @Override
+        public void startCDATA() throws SAXException
+        {
+            if (this.inDocument)
+            {
+                if (!this.unit.getFaceletsProcessingInstructions().isConsumeCDataSections())
+                {
+                    this.unit.writeInstruction("<![CDATA[");
+                }
+                else
+                {
+                    this.consumingCDATA = true;
+                    this.swallowCDATAContent = this.unit.getFaceletsProcessingInstructions().isSwallowCDataContent();
+                }
+            }
+        }
+
+        @Override
+        public void startDocument() throws SAXException
+        {
+            this.inDocument = true;
+        }
+
+        @Override
+        public void startDTD(String name, String publicId, String systemId) throws SAXException
+        {
+            if (this.inDocument && !unit.getFaceletsProcessingInstructions().isConsumeXmlDocType())
+            {
+                this.unit.writeDoctype(name, publicId, systemId);
+                /*
+                StringBuffer sb = new StringBuffer(64);
+                sb.append("<!DOCTYPE ").append(name);
+                if (publicId != null)
+                {
+                    sb.append(" PUBLIC \"").append(publicId).append("\"");
+                    if (systemId != null)
+                    {
+                        sb.append(" \"").append(systemId).append("\"");
+                    }
+                }
+                else if (systemId != null)
+                {
+                    sb.append(" SYSTEM \"").append(systemId).append("\"");
+                }
+                sb.append(" >\n");
+                this.unit.writeInstruction(sb.toString());
+                */
+            }
+            this.inDocument = false;
+        }
+
+        @Override
+        public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException
+        {
+            this.unit.pushTag(new Tag(this.createLocation(), uri, localName, qName, this.createAttributes(attributes)));
+        }
+
+        @Override
+        public void startEntity(String name) throws SAXException
+        {
+        }
+
+        @Override
+        public void startPrefixMapping(String prefix, String uri) throws SAXException
+        {
+            if (!SKIPPED_NAMESPACES.contains(uri))
+            {
+                this.unit.pushNamespace(prefix, uri);
+            }
+        }
+
+        @Override
+        public void processingInstruction(String target, String data) throws SAXException
+        {
+            if (this.inDocument && !this.unit.getFaceletsProcessingInstructions().isConsumeProcessingInstructions())
+            {
+                StringBuilder sb = new StringBuilder(64);
+                sb.append("<?").append(target).append(' ').append(data).append("?>\n");
+                this.unit.writeInstruction(sb.toString());
+            }
+        }
+    }
+    
+    /**
+     * Like CompilationHandler but does not take into account everything outside f:metadata tag 
+     * 
+     * @since 2.0
+     */
+    private static class ViewMetadataHandler extends DefaultHandler implements LexicalHandler
+    {
+
+        private final String alias;
+
+        private boolean inDocument = false;
+
+        private Locator locator;
+
+        private final CompilationManager unit;
+        
+        private boolean inMetadata = false;
+        private int uiRemoveCount = 0;
+        
+        private boolean consumingCDATA = false;
+        private boolean swallowCDATAContent = false;
+
+        public ViewMetadataHandler(CompilationManager unit, String alias)
+        {
+            this.unit = unit;
+            this.alias = alias;
+        }
+
+        @Override
+        public void characters(char[] ch, int start, int length) throws SAXException
+        {
+            if (this.inDocument && inMetadata && (!consumingCDATA || (consumingCDATA && !swallowCDATAContent)))
+            {
+                this.unit.writeText(new String(ch, start, length));
+            }
+        }
+
+        @Override
+        public void comment(char[] ch, int start, int length) throws SAXException
+        {
+            if (this.inDocument && inMetadata && !unit.getFaceletsProcessingInstructions().isConsumeXMLComments())
+            {
+                this.unit.writeComment(new String(ch, start, length));
+            }
+        }
+
+        protected TagAttributes createAttributes(Attributes attrs)
+        {
+            int len = attrs.getLength();
+            TagAttribute[] ta = new TagAttribute[len];
+            for (int i = 0; i < len; i++)
+            {
+                ta[i] = new TagAttributeImpl(this.createLocation(), attrs.getURI(i), attrs.getLocalName(i), attrs
+                        .getQName(i), attrs.getValue(i));
+            }
+            return new TagAttributesImpl(ta);
+        }
+
+        protected Location createLocation()
+        {
+            return new Location(this.alias, this.locator.getLineNumber(), this.locator.getColumnNumber());
+        }
+
+        @Override
+        public void endCDATA() throws SAXException
+        {
+            if (this.inDocument && inMetadata)
+            {
+                if (!this.unit.getFaceletsProcessingInstructions().isConsumeCDataSections())
+                {
+                    this.unit.writeInstruction("]]>");
+                }
+                else
+                {
+                    this.consumingCDATA = false;
+                    this.swallowCDATAContent = false;
+                }
+            }
+        }
+
+        @Override
+        public void endDTD() throws SAXException
+        {
+            this.inDocument = true;
+        }
+
+        @Override
+        public void endElement(String uri, String localName, String qName) throws SAXException
+        {
+            if (inMetadata)
+            {
+                this.unit.popTag();
+            }
+            if ((CoreLibrary.NAMESPACE.equals(uri) || CoreLibrary.ALIAS_NAMESPACE.equals(uri)))
+            {
+                if ("metadata".equals(localName))
+                {
+                    this.inMetadata=false;
+                }
+                else if (!inMetadata && "view".equals(localName))
+                {
+                    this.unit.popTag();
+                }
+            }
+            else if (UILibrary.NAMESPACE.equals(uri) || UILibrary.ALIAS_NAMESPACE.equals(uri))
+            {
+                if (!inMetadata && "remove".equals(localName))
+                {
+                    this.uiRemoveCount--;
+                }
+            }
+        }
+
+        @Override
+        public void endEntity(String name) throws SAXException
+        {
+        }
+
+        @Override
+        public void endPrefixMapping(String prefix) throws SAXException
+        {
+            this.unit.popNamespace(prefix);
+        }
+
+        @Override
+        public void fatalError(SAXParseException e) throws SAXException
+        {
+            if (this.locator != null)
+            {
+                throw new SAXException("Error Traced[line: " + this.locator.getLineNumber() + "] " + e.getMessage());
+            }
+            else
+            {
+                throw e;
+            }
+        }
+
+        @Override
+        public void ignorableWhitespace(char[] ch, int start, int length) throws SAXException
+        {
+            if (this.inDocument && inMetadata)
+            {
+                this.unit.writeWhitespace(new String(ch, start, length));
+            }
+        }
+
+        @Override
+        public InputSource resolveEntity(String publicId, String systemId) throws SAXException
+        {
+            String dtd = "org/apache/myfaces/resource/default.dtd";
+            /*
+             * if ("-//W3C//DTD XHTML 1.0 Transitional//EN".equals(publicId)) { dtd = "xhtml1-transitional.dtd"; } else
+             * if (systemId != null && systemId.startsWith("file:/")) { return new InputSource(systemId); }
+             */
+            URL url = ClassUtils.getResource(dtd);
+            return new InputSource(url.toString());
+        }
+
+        @Override
+        public void setDocumentLocator(Locator locator)
+        {
+            this.locator = locator;
+        }
+
+        @Override
+        public void startCDATA() throws SAXException
+        {
+            if (this.inDocument && inMetadata)
+            {
+                if (!this.unit.getFaceletsProcessingInstructions().isConsumeCDataSections())
+                {
+                    this.unit.writeInstruction("<![CDATA[");
+                }
+                else
+                {
+                    this.consumingCDATA = true;
+                    this.swallowCDATAContent = this.unit.getFaceletsProcessingInstructions().isSwallowCDataContent();
+                }
+            }
+        }
+
+        @Override
+        public void startDocument() throws SAXException
+        {
+            this.inDocument = true;
+        }
+
+        @Override
+        public void startDTD(String name, String publicId, String systemId) throws SAXException
+        {
+            // metadata does not require output doctype
+            this.inDocument = false;
+        }
+
+        @Override
+        public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException
+        {
+            if ( (CoreLibrary.NAMESPACE.equals(uri) ||
+                  CoreLibrary.ALIAS_NAMESPACE.equals(uri)) && this.uiRemoveCount <= 0)
+            {
+                if ("metadata".equals(localName))
+                {
+                    this.inMetadata=true;
+                }
+                else if (!inMetadata && "view".equals(localName))
+                {
+                    this.unit.pushTag(new Tag(createLocation(), uri, localName, qName, createAttributes(attributes)));
+                }
+            }
+            if (inMetadata)
+            {
+                this.unit.pushTag(new Tag(createLocation(), uri, localName, qName, createAttributes(attributes)));
+            }
+            else if (UILibrary.NAMESPACE.equals(uri) ||
+                    UILibrary.ALIAS_NAMESPACE.equals(uri))
+            {
+                if ("remove".equals(localName))
+                {
+                    this.uiRemoveCount++;
+                }
+            }
+        }
+
+        @Override
+        public void startEntity(String name) throws SAXException
+        {
+        }
+
+        @Override
+        public void startPrefixMapping(String prefix, String uri) throws SAXException
+        {
+            this.unit.pushNamespace(prefix, uri);
+        }
+
+        @Override
+        public void processingInstruction(String target, String data) throws SAXException
+        {
+            if (inDocument && inMetadata && !unit.getFaceletsProcessingInstructions().isConsumeProcessingInstructions())
+            {
+                StringBuilder sb = new StringBuilder(64);
+                sb.append("<?").append(target).append(' ').append(data).append("?>\n");
+                unit.writeInstruction(sb.toString());
+            }
+        }        
+    }
+    
+    /**
+     * Like CompilationHandler but does not take into account everything outside cc:interface or cc:implementation tag.
+     *  
+     * Note inside cc:implementation it only takes into account cc:insertChildren, cc:insertFacet and cc:renderFacet,
+     * all other tags, comments or text are just skipped.
+     * 
+     * @since 2.0.1
+     */
+    private static class CompositeComponentMetadataHandler extends DefaultHandler implements LexicalHandler
+    {
+
+        private final String alias;
+
+        private boolean inDocument = false;
+
+        private Locator locator;
+
+        private final CompilationManager unit;
+        
+        private boolean inCompositeInterface = false;
+        
+        private boolean inCompositeImplementation = false;
+
+        private boolean consumingCDATA = false;
+        private boolean swallowCDATAContent = false;
+
+        public CompositeComponentMetadataHandler(CompilationManager unit, String alias)
+        {
+            this.unit = unit;
+            this.alias = alias;
+        }
+
+        @Override
+        public void characters(char[] ch, int start, int length) throws SAXException
+        {
+            if (this.inDocument && inCompositeInterface && 
+                    (!consumingCDATA || (consumingCDATA && !swallowCDATAContent)))
+            {
+                this.unit.writeText(new String(ch, start, length));
+            }
+        }
+
+        @Override
+        public void comment(char[] ch, int start, int length) throws SAXException
+        {
+            if (inDocument && inCompositeInterface && 
+                    !unit.getFaceletsProcessingInstructions().isConsumeXMLComments())
+            {
+                this.unit.writeComment(new String(ch, start, length));
+            }
+        }
+
+        protected TagAttributes createAttributes(Attributes attrs)
+        {
+            int len = attrs.getLength();
+            TagAttribute[] ta = new TagAttribute[len];
+            for (int i = 0; i < len; i++)
+            {
+                ta[i] = new TagAttributeImpl(this.createLocation(), attrs.getURI(i), attrs.getLocalName(i), attrs
+                        .getQName(i), attrs.getValue(i));
+            }
+            return new TagAttributesImpl(ta);
+        }
+
+        protected Location createLocation()
+        {
+            return new Location(this.alias, this.locator.getLineNumber(), this.locator.getColumnNumber());
+        }
+
+        @Override
+        public void endCDATA() throws SAXException
+        {
+            if (this.inDocument && inCompositeInterface)
+            {
+                if (!this.unit.getFaceletsProcessingInstructions().isConsumeCDataSections())
+                {
+                    this.unit.writeInstruction("]]>");
+                }
+                else
+                {
+                    this.consumingCDATA = false;
+                    this.swallowCDATAContent = false;
+                }
+            }
+        }
+
+        @Override
+        public void endDTD() throws SAXException
+        {
+            this.inDocument = true;
+        }
+
+        @Override
+        public void endElement(String uri, String localName, String qName) throws SAXException
+        {
+            if (inCompositeInterface)
+            {
+                this.unit.popTag();
+            }
+            else if (inCompositeImplementation && 
+                (CompositeLibrary.NAMESPACE.equals(uri) || CompositeLibrary.ALIAS_NAMESPACE.equals(uri)) )
+            {
+                if ( "insertFacet".equals(localName) ||
+                     "renderFacet".equals(localName) ||
+                     "insertChildren".equals(localName) || 
+                     ImplementationHandler.NAME.equals(localName))
+                {
+                    this.unit.popTag();
+                }
+            }
+            
+            if (CompositeLibrary.NAMESPACE.equals(uri) || CompositeLibrary.ALIAS_NAMESPACE.equals(uri))
+            {
+                if (InterfaceHandler.NAME.equals(localName))
+                {
+                    this.inCompositeInterface=false;
+                }
+                else if (ImplementationHandler.NAME.equals(localName))
+                {
+                    this.inCompositeImplementation=false;
+                }
+            }
+        }
+
+        @Override
+        public void endEntity(String name) throws SAXException
+        {
+        }
+
+        @Override
+        public void endPrefixMapping(String prefix) throws SAXException
+        {
+            this.unit.popNamespace(prefix);
+        }
+
+        @Override
+        public void fatalError(SAXParseException e) throws SAXException
+        {
+            if (this.locator != null)
+            {
+                throw new SAXException("Error Traced[line: " + this.locator.getLineNumber() + "] " + e.getMessage());
+            }
+            else
+            {
+                throw e;
+            }
+        }
+
+        @Override
+        public void ignorableWhitespace(char[] ch, int start, int length) throws SAXException
+        {
+            if (this.inDocument && inCompositeInterface)
+            {
+                this.unit.writeWhitespace(new String(ch, start, length));
+            }
+        }
+
+        @Override
+        public InputSource resolveEntity(String publicId, String systemId) throws SAXException
+        {
+            String dtd = "org/apache/myfaces/resource/default.dtd";
+            /*
+             * if ("-//W3C//DTD XHTML 1.0 Transitional//EN".equals(publicId)) { dtd = "xhtml1-transitional.dtd"; } else
+             * if (systemId != null && systemId.startsWith("file:/")) { return new InputSource(systemId); }
+             */
+            URL url = ClassUtils.getResource(dtd);
+            return new InputSource(url.toString());
+        }
+
+        @Override
+        public void setDocumentLocator(Locator locator)
+        {
+            this.locator = locator;
+        }
+
+        @Override
+        public void startCDATA() throws SAXException
+        {
+            if (this.inDocument && inCompositeInterface)
+            {
+                if (!this.unit.getFaceletsProcessingInstructions().isConsumeCDataSections())
+                {
+                    this.unit.writeInstruction("<![CDATA[");
+                }
+                else
+                {
+                    this.consumingCDATA = true;
+                    this.swallowCDATAContent = this.unit.getFaceletsProcessingInstructions().isSwallowCDataContent();
+                }
+            }
+        }
+
+        @Override
+        public void startDocument() throws SAXException
+        {
+            this.inDocument = true;
+        }
+
+        @Override
+        public void startDTD(String name, String publicId, String systemId) throws SAXException
+        {
+            // metadata does not require output doctype
+            this.inDocument = false;
+        }
+
+        @Override
+        public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException
+        {
+            if (CompositeLibrary.NAMESPACE.equals(uri) || CompositeLibrary.ALIAS_NAMESPACE.equals(uri))
+            {
+                if (InterfaceHandler.NAME.equals(localName))
+                {
+                    this.inCompositeInterface=true;
+                }
+                else if (ImplementationHandler.NAME.equals(localName))
+                {
+                    this.inCompositeImplementation=true;
+                }
+            }
+            
+            if (inCompositeInterface)
+            {
+                this.unit.pushTag(new Tag(createLocation(), uri, localName, qName, createAttributes(attributes)));
+            }
+            else if (inCompositeImplementation && 
+                (CompositeLibrary.NAMESPACE.equals(uri) || CompositeLibrary.ALIAS_NAMESPACE.equals(uri)))
+            {
+                if ("insertFacet".equals(localName)    ||
+                    "renderFacet".equals(localName)    ||
+                    "insertChildren".equals(localName) ||
+                    ImplementationHandler.NAME.equals(localName)   )
+                {
+                    this.unit.pushTag(new Tag(createLocation(), uri, localName, qName, createAttributes(attributes)));
+                }
+            }
+        }
+
+        @Override
+        public void startEntity(String name) throws SAXException
+        {
+        }
+
+        @Override
+        public void startPrefixMapping(String prefix, String uri) throws SAXException
+        {
+            this.unit.pushNamespace(prefix, uri);
+        }
+
+        @Override
+        public void processingInstruction(String target, String data) throws SAXException
+        {
+            if (inDocument && inCompositeInterface
+                && !unit.getFaceletsProcessingInstructions().isConsumeProcessingInstructions())
+            {
+                StringBuilder sb = new StringBuilder(64);
+                sb.append("<?").append(target).append(' ').append(data).append("?>\n");
+                this.unit.writeInstruction(sb.toString());
+            }
+        }        
+    }
+
+    public SAXCompiler()
+    {
+        super();
+    }
+
+    @Override
+    public FaceletHandler doCompile(URL src, String alias)
+            throws IOException, FaceletException, ELException, FacesException
+    {
+        CompilationManager mngr = null;
+        InputStream is = null;
+        String encoding = null;
+        try
+        {
+            is = new BufferedInputStream(src.openStream(), 1024);
+            mngr = new CompilationManager(alias, this, getFaceletsProcessingInstructions(src, alias));
+            encoding = writeXmlDecl(is, mngr);
+            CompilationHandler handler = new CompilationHandler(mngr, alias);
+            SAXParser parser = this.createSAXParser(handler);
+            parser.parse(is, handler);
+        }
+        catch (SAXException e)
+        {
+            throw new FaceletException("Error Parsing " + alias + ": " + e.getMessage(), e.getCause());
+        }
+        catch (ParserConfigurationException e)
+        {
+            throw new FaceletException("Error Configuring Parser " + alias + ": " + e.getMessage(), e.getCause());
+        }
+        finally
+        {
+            if (is != null)
+            {
+                is.close();
+            }
+        }
+        return new EncodingHandler(mngr.createFaceletHandler(), encoding);
+    }
+
+    /**
+     * @since 2.0
+     */
+    @Override
+    protected FaceletHandler doCompileViewMetadata(URL src, String alias)
+            throws IOException, FaceletException, ELException, FacesException
+    {
+        CompilationManager mngr = null;
+        InputStream is = null;
+        String encoding = null;
+        try
+        {
+            is = new BufferedInputStream(src.openStream(), 1024);
+            mngr = new CompilationManager(alias, this, getFaceletsProcessingInstructions(src, alias));
+            encoding = getXmlDecl(is, mngr);
+            final ViewMetadataHandler handler = new ViewMetadataHandler(mngr, alias);
+            final SAXParser parser = this.createSAXParser(handler);
+            
+            if (System.getSecurityManager() != null)
+            {
+                try
+                {
+                    final InputStream finalInputStream = is;
+                    AccessController.doPrivileged(new PrivilegedExceptionAction() 
+                    {
+                        public Object run() throws SAXException, IOException 
+                        {
+                            parser.parse(finalInputStream, handler);
+                            return null; 
+                        }
+                    });
+                }
+                catch (PrivilegedActionException pae)
+                {
+                    Exception e = pae.getException();
+                    if(e instanceof SAXException)
+                    {
+                        throw new FaceletException("Error Parsing " + alias + ": " + e.getMessage(), e.getCause());
+                    } 
+                    else if(e instanceof IOException)
+                    {
+                        throw (IOException)e;
+                    }
+                }
+            }
+            else
+            {
+                parser.parse(is, handler);
+            }
+        }
+        catch (SAXException e)
+        {
+            throw new FaceletException("Error Parsing " + alias + ": " + e.getMessage(), e.getCause());
+        }
+        catch (ParserConfigurationException e)
+        {
+            throw new FaceletException("Error Configuring Parser " + alias + ": " + e.getMessage(), e.getCause());
+        }
+        finally
+        {
+            if (is != null)
+            {
+                is.close();
+            }
+        }
+        return new EncodingHandler(mngr.createFaceletHandler(), encoding);
+    }
+
+    /**
+     * @since 2.0.1
+     */
+    @Override
+    protected FaceletHandler doCompileCompositeComponentMetadata(URL src, String alias)
+            throws IOException, FaceletException, ELException, FacesException
+    {
+        CompilationManager mngr = null;
+        InputStream is = null;
+        String encoding = null;
+        try
+        {
+            is = new BufferedInputStream(src.openStream(), 1024);
+            mngr = new CompilationManager(alias, this, getFaceletsProcessingInstructions(src, alias));
+            encoding = getXmlDecl(is, mngr);
+            CompositeComponentMetadataHandler handler = new CompositeComponentMetadataHandler(mngr, alias);
+            SAXParser parser = this.createSAXParser(handler);
+            parser.parse(is, handler);
+        }
+        catch (SAXException e)
+        {
+            throw new FaceletException("Error Parsing " + alias + ": " + e.getMessage(), e.getCause());
+        }
+        catch (ParserConfigurationException e)
+        {
+            throw new FaceletException("Error Configuring Parser " + alias + ": " + e.getMessage(), e.getCause());
+        }
+        finally
+        {
+            if (is != null)
+            {
+                is.close();
+            }
+        }
+        return new EncodingHandler(mngr.createFaceletHandler(), encoding);
+    }
+    
+    @Override
+    protected FaceletHandler doCompileComponent(
+        String taglibURI, String tagName, Map<String, Object> attributes)
+    {
+        String alias = tagName;
+        CompilationManager mngr = new CompilationManager(alias, this, getDefaultFaceletsProcessingInstructions());
+        String prefix = "oamf"; // The prefix is only a logical name.
+        mngr.pushNamespace(prefix, taglibURI);
+        
+        boolean tagContainParams = ( 
+                ("include".equals(tagName) || "decorate".equals(tagName) || "composition".equals(tagName)) && 
+                (UILibrary.NAMESPACE.equals(taglibURI) || UILibrary.ALIAS_NAMESPACE.equals(taglibURI)) );
+        
+        Location location = new Location(alias, 0, 0);
+        int len = attributes.size();
+        if (tagContainParams && attributes.containsKey("params"))
+        {
+            len = len-1;
+        }
+        
+        TagAttribute[] ta = new TagAttribute[len];
+        int i = 0;
+        Map<String, Object> paramsMap = null;
+        for (Map.Entry<String, Object> entry : attributes.entrySet())
+        {
+            String stringValue = null;
+            
+            if (tagContainParams && "params".equals(entry.getKey()))
+            {
+                paramsMap = (Map<String, Object>) entry.getValue();
+            }
+            else
+            {
+                if (entry.getValue() instanceof ValueExpression)
+                {
+                    stringValue = ((ValueExpression)entry.getValue()).getExpressionString();
+                }
+                else if (entry.getValue() instanceof MethodExpression)
+                {
+                    stringValue = ((MethodExpression)entry.getValue()).getExpressionString();
+                }
+                else if (entry.getValue() != null)
+                {
+                    stringValue = entry.getValue().toString();
+                }
+                ta[i] = new TagAttributeImpl(location, "", entry.getKey(), entry.getKey(), stringValue);
+                i++;
+            }
+        }        
+        mngr.pushTag(new Tag(location, taglibURI, tagName, "oamf:"+tagName, new TagAttributesImpl(ta)));
+        
+        if (tagContainParams && paramsMap != null)
+        {
+            for (Map.Entry<String, Object> entry : paramsMap.entrySet())
+            {
+                TagAttribute[] tap = new TagAttribute[2];
+                String stringValue = null;
+                if (entry.getValue() instanceof ValueExpression)
+                {
+                    stringValue = ((ValueExpression)entry.getValue()).getExpressionString();
+                }
+                else if (entry.getValue() instanceof MethodExpression)
+                {
+                    stringValue = ((MethodExpression)entry.getValue()).getExpressionString();
+                }
+                else if (entry.getValue() != null)
+                {
+                    stringValue = entry.getValue().toString();
+                }
+                tap[0] = new TagAttributeImpl(location, "", "name", "name", entry.getKey());
+                tap[1] = new TagAttributeImpl(location, "", "value", "value", stringValue);
+                mngr.pushTag(new Tag(location, UILibrary.NAMESPACE, "param", "oamf:param", new TagAttributesImpl(tap)));
+                mngr.popTag();
+            }
+        }
+        mngr.popTag();
+        mngr.popNamespace(prefix);
+        
+        FaceletHandler handler = new DynamicComponentFacelet((NamespaceHandler) mngr.createFaceletHandler());
+        return handler;
+    }
+    
+    protected FaceletsProcessingInstructions getDefaultFaceletsProcessingInstructions()
+    {
+        return FaceletsProcessingInstructions.getProcessingInstructions(FaceletsProcessing.PROCESS_AS_XHTML, false);
+    }
+    
+    protected FaceletsProcessingInstructions getFaceletsProcessingInstructions(URL src, String alias)
+    {
+        String processAs = null;
+        boolean compressSpaces = false;
+        for (FaceletsProcessing entry : getFaceletsProcessingConfigurations())
+        {
+            if (src.getPath().endsWith(entry.getFileExtension()))
+            {
+                processAs = entry.getProcessAs();
+                compressSpaces = Boolean.valueOf(entry.getOamCompressSpaces());
+                break;
+            }
+        }
+        return FaceletsProcessingInstructions.getProcessingInstructions(processAs, compressSpaces);
+    }
+
+    protected static String writeXmlDecl(InputStream is, CompilationManager mngr) throws IOException
+    {
+        is.mark(128);
+        String encoding = null;
+        try
+        {
+            byte[] b = new byte[128];
+            if (is.read(b) > 0)
+            {
+                String r = new String(b);
+                Matcher m = XML_DECLARATION.matcher(r);
+                if (m.find())
+                {
+                    if (!mngr.getFaceletsProcessingInstructions().isConsumeXmlDeclaration())
+                    {
+                        mngr.writeInstruction(m.group(0) + '\n');
+                    }
+                    if (m.group(3) != null)
+                    {
+                        encoding = m.group(3);
+                    }
+                }
+            }
+        }
+        finally
+        {
+            is.reset();
+        }
+        return encoding;
+    }
+    
+    protected static String getXmlDecl(InputStream is, CompilationManager mngr) throws IOException
+    {
+        is.mark(128);
+        String encoding = null;
+        try
+        {
+            byte[] b = new byte[128];
+            if (is.read(b) > 0)
+            {
+                String r = new String(b);
+                Matcher m = XML_DECLARATION.matcher(r);
+                if (m.find() && m.group(3) != null)
+                {
+                    encoding = m.group(3);
+                }
+            }
+        }
+        finally
+        {
+            is.reset();
+        }
+        return encoding;
+    }
+
+    private SAXParser createSAXParser(DefaultHandler handler) throws SAXException,
+            ParserConfigurationException
+    {
+        SAXParserFactory factory = SAXParserFactory.newInstance();
+        factory.setNamespaceAware(true);
+        factory.setFeature("http://xml.org/sax/features/namespace-prefixes", true);
+        factory.setFeature("http://xml.org/sax/features/validation", this.isValidating());
+        factory.setValidating(this.isValidating());
+        SAXParser parser = factory.newSAXParser();
+        XMLReader reader = parser.getXMLReader();
+        reader.setProperty("http://xml.org/sax/properties/lexical-handler", handler);
+        reader.setErrorHandler(handler);
+        reader.setEntityResolver(handler);
+        return parser;
+    }
+
+}