
javax.xml.bind.helpers.AbstractMarshallerImpl Maven / Gradle / Ivy
/*
* Copyright 2003, 2004 The Apache Software Foundation
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package javax.xml.bind.helpers;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.io.Writer;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.PropertyException;
import javax.xml.bind.ValidationEventHandler;
import javax.xml.transform.dom.DOMResult;
import javax.xml.transform.sax.SAXResult;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.Node;
import org.xml.sax.ContentHandler;
/** Default implementation of a Marshaller. The JAXB provider needs
* to implement only
* {@link javax.xml.bind.Marshaller#marshal(Object, javax.xml.transform.Result)}.
*
* @author JSR-31
* @since JAXB1.0
* @see javax.xml.bind.Marshaller
*/
public abstract class AbstractMarshallerImpl implements Marshaller {
private String encoding = "UTF-8";
private String schemaLocation, noNSSchemaLocation;
private boolean isFormattedOutput = true;
private ValidationEventHandler eventHandler = DefaultValidationEventHandler.theInstance;
/** Creates a new instance of AbstractMarshallerImpl
.
*/
public AbstractMarshallerImpl() {
}
/* @see javax.xml.bind.Marshaller#setValidationEventHandler(javax.xml.bind.ValidationEventHandler)}
*/
public void setEventHandler(ValidationEventHandler pHandler) throws JAXBException {
eventHandler = pHandler;
}
/* @see javax.xml.bind.Marshaller#getValidationEventHandler()}
*/
public ValidationEventHandler getEventHandler() throws JAXBException {
return eventHandler;
}
/** Public interface to set the properties defined
* by the {@link javax.xml.bind.Marshaller} interface.
* Works by invocation of {@link #setEncoding(String)},
* {@link #setFormattedOutput(boolean)},
* {@link #setNoNSSchemaLocation(String)}, and
* {@link #setSchemaLocation(String)} internally.
* If you want to support additional properties,
* you have to override this method in a subclass.
* @throws PropertyException Unknown property name
*/
public void setProperty(String pName, Object pValue) throws PropertyException {
if (pName == null) {
throw new IllegalArgumentException("The property name must not be null.");
}
if (Marshaller.JAXB_ENCODING.equals(pName)) {
setEncoding((String) pValue);
} else if (Marshaller.JAXB_FORMATTED_OUTPUT.equals(pName)) {
if (pValue == null) {
setFormattedOutput(true);
} else {
setFormattedOutput(((Boolean) pValue).booleanValue());
}
} else if (Marshaller.JAXB_SCHEMA_LOCATION.equals(pName)) {
setSchemaLocation((String) pValue);
} else if (Marshaller.JAXB_NO_NAMESPACE_SCHEMA_LOCATION.equals(pName)) {
setNoNSSchemaLocation((String) pValue);
} else {
throw new PropertyException("Unknown property name: " + pName);
}
}
/** Public interface to get the properties defined
* by the {@link javax.xml.bind.Marshaller} interface.
* Works by invocation of {@link #getEncoding()},
* {@link #isFormattedOutput()},
* {@link #getNoNSSchemaLocation()}, and
* {@link #getSchemaLocation()} internally.
* If you want to support additional properties,
* you have to override this method in a subclass.
* @throws PropertyException Unknown property name
*/
public Object getProperty(String pName) throws PropertyException {
if (pName == null) {
throw new IllegalArgumentException("The property name must not be null.");
}
if (Marshaller.JAXB_ENCODING.equals(pName)) {
return getEncoding();
} else if (Marshaller.JAXB_FORMATTED_OUTPUT.equals(pName)) {
return isFormattedOutput() ? Boolean.TRUE : Boolean.FALSE;
} else if (Marshaller.JAXB_SCHEMA_LOCATION.equals(pName)) {
return getSchemaLocation();
} else if (Marshaller.JAXB_NO_NAMESPACE_SCHEMA_LOCATION.equals(pName)) {
return getNoNSSchemaLocation();
} else {
throw new PropertyException("Unknown property name: " + pName);
}
}
/** Returns the current output encoding.
* @see javax.xml.bind.Marshaller#JAXB_ENCODING
* @return The current encoding, by default "UTF-8".
*/
protected String getEncoding() {
return encoding;
}
/** Converts the given IANA encoding name into a Java encoding
* name. This is a helper method for derived subclasses.
*/
protected String getJavaEncoding(String pEncoding)
throws UnsupportedEncodingException {
"".getBytes(pEncoding); // Throws an UnsupportedEncodingException,
// if the encoding is unknown.
return pEncoding;
}
/** Sets the current output encoding.
* @see javax.xml.bind.Marshaller#JAXB_ENCODING
*/
protected void setEncoding(String pEncoding) {
encoding = pEncoding == null ? "UTF-8" : pEncoding;
}
/** Sets the marshallers schema location.
* Defaults to null.
* @see javax.xml.bind.Marshaller#JAXB_SCHEMA_LOCATION
*/
protected void setSchemaLocation(String pSchemaLocation) {
schemaLocation = pSchemaLocation;
}
/** Returns the marshallers schema location.
* Defaults to null.
* @see javax.xml.bind.Marshaller#JAXB_SCHEMA_LOCATION
*/
protected String getSchemaLocation() {
return schemaLocation;
}
/** Sets the marshallers "no namespace" schema location.
* Defaults to null.
* @see javax.xml.bind.Marshaller#JAXB_NO_NAMESPACE_SCHEMA_LOCATION
*/
protected void setNoNSSchemaLocation(String pNoNSSchemaLocation) {
noNSSchemaLocation = pNoNSSchemaLocation;
}
/** Returns the marshallers "no namespace" schema location.
* Defaults to null.
* @see javax.xml.bind.Marshaller#JAXB_NO_NAMESPACE_SCHEMA_LOCATION
*/
protected String getNoNSSchemaLocation() {
return noNSSchemaLocation;
}
/** Sets whether the marshaller will create formatted
* output or not. By default it does.
* @see javax.xml.bind.Marshaller#JAXB_FORMATTED_OUTPUT
*/
protected void setFormattedOutput(boolean pFormattedOutput) {
isFormattedOutput = pFormattedOutput;
}
/** Returns whether the marshaller will create formatted
* output or not. By default it does.
* @see javax.xml.bind.Marshaller#JAXB_FORMATTED_OUTPUT
*/
protected boolean isFormattedOutput() {
return isFormattedOutput;
}
/* @see javax.xml.bind.Marshaller#marshal(Object, java.io.OutputStream)
*/
public final void marshal(Object pObject, OutputStream pStream)
throws JAXBException {
StreamResult sr = new StreamResult();
sr.setOutputStream(pStream);
marshal(pObject, sr);
}
/* @see javax.xml.bind.Marshaller#marshal(Object, java.io.Writer)
*/
public final void marshal(Object pObject, Writer pWriter)
throws JAXBException {
StreamResult sr = new StreamResult();
sr.setWriter(pWriter);
marshal(pObject, sr);
}
/* @see javax.xml.bind.Marshaller#marshal(Object, org.xml.sax.ContentHandler)
*/
public final void marshal(Object pObject, ContentHandler pHandler)
throws JAXBException {
SAXResult sr = new SAXResult();
sr.setHandler(pHandler);
marshal(pObject, sr);
}
/* @see javax.xml.bind.Marshaller#marshal(Object, org.w3c.dom.Node)
*/
public final void marshal(Object pObject, Node pNode)
throws JAXBException {
DOMResult dr = new DOMResult();
dr.setNode(pNode);
marshal(pObject, dr);
}
/** This method is unsupported in the default implementation
* and throws an {@link UnsupportedOperationException}.
* @throws UnsupportedOperationException This method is not available in the
* default implementation.
*/
public Node getNode(Object obj) throws JAXBException {
throw new UnsupportedOperationException("This operation is unsupported.");
}
}