blob: abd6457c4618e5a30c97bcaf397ed8779412bdde [file] [log] [blame]
/**
* 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 javax.xml.bind.util;
import javax.xml.transform.Source;
import javax.xml.transform.sax.SAXSource;
import javax.xml.bind.Marshaller;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import org.xml.sax.XMLReader;
import org.xml.sax.SAXNotRecognizedException;
import org.xml.sax.EntityResolver;
import org.xml.sax.DTDHandler;
import org.xml.sax.ContentHandler;
import org.xml.sax.ErrorHandler;
import org.xml.sax.SAXException;
import org.xml.sax.InputSource;
import org.xml.sax.SAXParseException;
import org.xml.sax.helpers.XMLFilterImpl;
import org.xml.sax.ext.LexicalHandler;
public class JAXBSource extends SAXSource {
public JAXBSource(JAXBContext context, Object contentObject) throws JAXBException {
if (context == null) {
throw new JAXBException("context must not be null");
}
if (contentObject == null) {
throw new JAXBException("contentObject must not be null");
}
setXMLReader(new Reader(context.createMarshaller(), contentObject));
setInputSource(new InputSource());
}
public JAXBSource(final Marshaller marshaller, final Object contentObject) throws JAXBException {
if (marshaller == null) {
throw new JAXBException("marshaller must not be null");
}
if (contentObject == null) {
throw new JAXBException("contentObject must not be null");
}
setXMLReader(new Reader(marshaller, contentObject));
setInputSource(new InputSource());
}
private static class Reader implements XMLReader {
private LexicalHandler lexicalHandler;
private EntityResolver entityResolver;
private DTDHandler dtdHandler;
private XMLFilterImpl repeater;
private ErrorHandler errorHandler;
private final Marshaller marshaller;
private final Object contentObject;
public Reader(Marshaller marshaller, Object contentObject) {
this.marshaller = marshaller;
this.contentObject = contentObject;
repeater = new XMLFilterImpl();
}
public boolean getFeature(String name) throws SAXNotRecognizedException {
if (name.equals("http://xml.org/sax/features/namespaces")) {
return true;
}
if (name.equals("http://xml.org/sax/features/namespace-prefixes")) {
return false;
}
throw new SAXNotRecognizedException(name);
}
public void setFeature(String name, boolean value) throws SAXNotRecognizedException {
if (name.equals("http://xml.org/sax/features/namespaces") && value) {
return;
}
if (name.equals("http://xml.org/sax/features/namespace-prefixes") && !value) {
return;
}
throw new SAXNotRecognizedException(name);
}
public Object getProperty(String name) throws SAXNotRecognizedException {
if("http://xml.org/sax/properties/lexical-handler".equals(name)) {
return lexicalHandler;
}
throw new SAXNotRecognizedException(name);
}
public void setProperty(String name, Object value) throws SAXNotRecognizedException {
if("http://xml.org/sax/properties/lexical-handler".equals(name)) {
lexicalHandler = (LexicalHandler) value;
return;
}
throw new SAXNotRecognizedException(name);
}
public void setEntityResolver(EntityResolver resolver) {
entityResolver = resolver;
}
public EntityResolver getEntityResolver() {
return entityResolver;
}
public void setDTDHandler(DTDHandler handler) {
dtdHandler = handler;
}
public DTDHandler getDTDHandler() {
return dtdHandler;
}
public void setContentHandler(ContentHandler handler) {
repeater.setContentHandler(handler);
}
public ContentHandler getContentHandler() {
return repeater.getContentHandler();
}
public void setErrorHandler(ErrorHandler handler) {
errorHandler = handler;
}
public ErrorHandler getErrorHandler() {
return errorHandler;
}
public void parse(InputSource input) throws SAXException {
parse();
}
public void parse(String systemId) throws SAXException {
parse();
}
public void parse() throws SAXException {
try {
marshaller.marshal(contentObject, repeater);
} catch(JAXBException e) {
SAXParseException se = new SAXParseException(e.getMessage(), null, null, -1, -1, e);
if (errorHandler != null) {
errorHandler.fatalError(se);
}
throw se;
}
}
}
}