| /* |
| * Copyright 2006 Sun Microsystems, Inc. All Rights Reserved. |
| * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
| * |
| * This code is free software; you can redistribute it and/or modify it |
| * under the terms of the GNU General Public License version 2 only, as |
| * published by the Free Software Foundation. Sun designates this |
| * particular file as subject to the "Classpath" exception as provided |
| * by Sun in the LICENSE file that accompanied this code. |
| * |
| * This code 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. See the GNU General Public License |
| * version 2 for more details (a copy is included in the LICENSE file that |
| * accompanied this code). |
| * |
| * You should have received a copy of the GNU General Public License version |
| * 2 along with this work; if not, write to the Free Software Foundation, |
| * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. |
| * |
| * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, |
| * CA 95054 USA or visit www.sun.com if you need additional information or |
| * have any questions. |
| */ |
| |
| package com.sun.xml.internal.xsom.util; |
| |
| import com.sun.xml.internal.xsom.XSAnnotation; |
| import com.sun.xml.internal.xsom.parser.AnnotationContext; |
| import com.sun.xml.internal.xsom.parser.AnnotationParser; |
| import com.sun.xml.internal.xsom.parser.AnnotationParserFactory; |
| import org.w3c.dom.Element; |
| import org.w3c.dom.Document; |
| import org.w3c.dom.Node; |
| import org.xml.sax.ContentHandler; |
| import org.xml.sax.EntityResolver; |
| import org.xml.sax.ErrorHandler; |
| |
| import javax.xml.transform.sax.SAXTransformerFactory; |
| import javax.xml.transform.sax.TransformerHandler; |
| import javax.xml.transform.TransformerConfigurationException; |
| import javax.xml.transform.dom.DOMResult; |
| |
| /** |
| * {@link AnnotationParserFactory} that parses annotations into a W3C DOM. |
| * |
| * <p> |
| * If you use this parser factory, you'll get {@link Element} that represents |
| * <xs:annotation> from {@link XSAnnotation#getAnnotation()}. |
| * |
| * <p> |
| * When multiple <xs:annotation>s are found for the given schema component, |
| * you'll see all <xs:appinfo>s and <xs:documentation>s combined under |
| * one <xs:annotation> element. |
| * |
| * @author Kohsuke Kawaguchi |
| */ |
| public class DomAnnotationParserFactory implements AnnotationParserFactory { |
| public AnnotationParser create() { |
| return new AnnotationParserImpl(); |
| } |
| |
| private static final SAXTransformerFactory stf = (SAXTransformerFactory) SAXTransformerFactory.newInstance(); |
| |
| private static class AnnotationParserImpl extends AnnotationParser { |
| |
| /** |
| * Identity transformer used to parse SAX into DOM. |
| */ |
| private final TransformerHandler transformer; |
| private DOMResult result; |
| |
| AnnotationParserImpl() { |
| try { |
| transformer = stf.newTransformerHandler(); |
| } catch (TransformerConfigurationException e) { |
| throw new Error(e); // impossible |
| } |
| } |
| |
| public ContentHandler getContentHandler(AnnotationContext context, String parentElementName, ErrorHandler errorHandler, EntityResolver entityResolver) { |
| result = new DOMResult(); |
| transformer.setResult(result); |
| return transformer; |
| } |
| |
| public Object getResult(Object existing) { |
| Document dom = (Document)result.getNode(); |
| Element e = dom.getDocumentElement(); |
| if(existing instanceof Element) { |
| // merge all the children |
| Element prev = (Element) existing; |
| Node anchor = e.getFirstChild(); |
| while(prev.getFirstChild()!=null) |
| e.insertBefore(prev.getFirstChild(), anchor ); |
| } |
| return e; |
| } |
| } |
| } |