001    /**
002     * Licensed to the Apache Software Foundation (ASF) under one or more
003     * contributor license agreements.  See the NOTICE file distributed with
004     * this work for additional information regarding copyright ownership.
005     * The ASF licenses this file to You under the Apache License, Version 2.0
006     * (the "License"); you may not use this file except in compliance with
007     * the License.  You may obtain a copy of the License at
008     *
009     *     http://www.apache.org/licenses/LICENSE-2.0
010     *
011     *  Unless required by applicable law or agreed to in writing, software
012     *  distributed under the License is distributed on an "AS IS" BASIS,
013     *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014     *  See the License for the specific language governing permissions and
015     *  limitations under the License.
016     */
017    package javax.xml.bind.annotation;
018    
019    import javax.xml.transform.dom.DOMResult;
020    import javax.xml.transform.dom.DOMSource;
021    import javax.xml.transform.Source;
022    import javax.xml.parsers.DocumentBuilder;
023    import javax.xml.bind.ValidationEventHandler;
024    
025    import org.w3c.dom.Element;
026    import org.w3c.dom.Document;
027    import org.w3c.dom.Node;
028    import org.w3c.dom.DocumentFragment;
029    
030    public class W3CDomHandler implements DomHandler<Element, DOMResult> {
031    
032        private DocumentBuilder builder;
033    
034        public W3CDomHandler() {
035        }
036    
037        public W3CDomHandler(DocumentBuilder builder) {
038            if (builder == null) {
039                throw new IllegalArgumentException();
040            }
041            this.builder = builder;
042        }
043    
044        public DOMResult createUnmarshaller(ValidationEventHandler errorHandler) {
045            if (builder == null) {
046                return new DOMResult();
047            } else {
048                return new DOMResult(builder.newDocument());
049            }
050        }
051    
052        public DocumentBuilder getBuilder() {
053            return builder;
054        }
055    
056        public Element getElement(DOMResult rt) {
057            Node n = rt.getNode();
058            if (n instanceof Document) {
059                return ((Document)n).getDocumentElement();
060            }
061            if (n instanceof Element) {
062                return (Element)n;
063            }
064            if (n instanceof DocumentFragment) {
065                return (Element)n.getChildNodes().item(0);
066            } else {
067                throw new IllegalStateException(n.toString());
068            }
069        }
070    
071        public Source marshal(Element n, ValidationEventHandler errorHandler) {
072            return new DOMSource(n);
073        }
074    
075        public void setBuilder(DocumentBuilder builder) {
076            this.builder = builder;
077        }
078    }