/******************************************************************************* * Copyright (c) 1998, 2015 Oracle and/or its affiliates. All rights reserved. * This program and the accompanying materials are made available under the * terms of the Eclipse Public License v1.0 and Eclipse Distribution License v. 1.0 * which accompanies this distribution. * The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html * and the Eclipse Distribution License is available at * http://www.eclipse.org/org/documents/edl-v10.php. * * Contributors: * dmccann - September 15/2009 - 1.2 - Initial implementation ******************************************************************************/ package org.eclipse.persistence.jaxb; import org.eclipse.persistence.oxm.XMLBinder; import org.eclipse.persistence.oxm.XMLContext; import org.eclipse.persistence.oxm.XMLMarshaller; import org.eclipse.persistence.oxm.XMLUnmarshaller; import org.eclipse.persistence.internal.localization.ExceptionLocalization; import org.eclipse.persistence.jaxb.JAXBContext; /** * This class provides a mechanism to obtain the EclipseLink implementation of various JAXB runtime * classes based on a given JAXB class/interface. This is useful for accessing extended EclipseLink * features. Using this helper class will alleviate the need for consumers of EclipseLink JAXB to * perform casts where their code makes use of the standard JAXB API. In addition, a given JAXB * class/interface can be unwrapped based on a user-specified class. This will allow access - in * certain cases - to a given JAXB implementation class' underlying class(es). For example, a * Marshaller could be unwrapped resulting in an EclipseLink JAXBMarshaller, or its underlying * XMLMarshaller. */ public class JAXBHelper { /** * Return the EclipseLink implementation of JAXBContext. The given JAXBContext is assumed to be * an instance of {@link org.eclipse.persistence.jaxb.JAXBContext}. If not, an exception will be * thrown. * * @param jaxbContext * @return * @throws IllegalArgumentException */ public static JAXBContext getJAXBContext(javax.xml.bind.JAXBContext jaxbContext) throws IllegalArgumentException { try { return (JAXBContext) jaxbContext; } catch (ClassCastException e) { throw new IllegalArgumentException(ExceptionLocalization .buildMessage("jaxb_helper_invalid_jaxbcontext", new Object[] { jaxbContext.getClass() })); } } /** * Return the EclipseLink implementation of Unmarshaller. The given Unmarshaller is assumed to * be an instance of {@link org.eclipse.persistence.jaxb.JAXBUnmarshaller}. If not, an exception * will be thrown. * * @param jaxbUnmarshaller * @return * @throws IllegalArgumentException */ public static JAXBUnmarshaller getUnmarshaller(javax.xml.bind.Unmarshaller jaxbUnmarshaller) throws IllegalArgumentException { try { return (JAXBUnmarshaller) jaxbUnmarshaller; } catch (ClassCastException e) { throw new IllegalArgumentException(ExceptionLocalization .buildMessage("jaxb_helper_invalid_unmarshaller", new Object[] { jaxbUnmarshaller.getClass() })); } } /** * Return the EclipseLink implementation of Marshaller. The given Marshaller is assumed to be an * instance of {@link org.eclipse.persistence.jaxb.JAXBMarshaller}. If not, an exception will be * thrown. * * @param jaxbMarshaller * @return * @throws IllegalArgumentException */ public static JAXBMarshaller getMarshaller(javax.xml.bind.Marshaller jaxbMarshaller) throws IllegalArgumentException { try { return (JAXBMarshaller) jaxbMarshaller; } catch (ClassCastException e) { throw new IllegalArgumentException(ExceptionLocalization .buildMessage("jaxb_helper_invalid_marshaller", new Object[] { jaxbMarshaller.getClass() })); } } /** * Return the EclipseLink implementation of Binder. The given Binder is assumed to be an * instance of {@link org.eclipse.persistence.jaxb.JAXBBinder}. If not, an exception will be * thrown. * * @param jaxbBinder * @return * @throws IllegalArgumentException */ public static JAXBBinder getBinder(javax.xml.bind.Binder jaxbBinder) throws IllegalArgumentException { try { return (JAXBBinder) jaxbBinder; } catch (ClassCastException e) { throw new IllegalArgumentException(ExceptionLocalization .buildMessage("jaxb_helper_invalid_binder", new Object[] { jaxbBinder.getClass() })); } } /** * Unwraps a given JAXBContext resulting in an EclipseLink JAXBContext, or the EclipseLink * JAXBContext's underlying XMLContext. Assumes that the given JAXBContext is an instance of * EclipseLink JAXBContext, and clazz is one of org.eclipse.persistence.jaxb.JAXBContext or * org.eclipse.persistence.oxm.XMLContext. * * @param <T> * @param jaxbContext * @param clazz * @return * @see org.eclipse.persistence.jaxb.JAXBContext * @see org.eclipse.persistence.oxm.XMLContext * @throws IllegalArgumentException */ public static <T> T unwrap(javax.xml.bind.JAXBContext jaxbContext, Class<T> clazz) throws IllegalArgumentException { try { JAXBContext jaxbContextImpl = (JAXBContext) jaxbContext; if (clazz == org.eclipse.persistence.jaxb.JAXBContext.class) { return (T) jaxbContextImpl; } if (clazz == XMLContext.class) { return (T) jaxbContextImpl.getXMLContext(); } throw new IllegalArgumentException(ExceptionLocalization .buildMessage("jaxb_helper_invalid_target_for_jaxbcontext", new Object[] { clazz })); } catch (ClassCastException e) { throw new IllegalArgumentException(ExceptionLocalization .buildMessage("jaxb_helper_invalid_jaxbcontext", new Object[] { jaxbContext.getClass() })); } } /** * Unwraps a given Unmarshaller resulting in an EclipseLink JAXBUnmarshaller, or the EclipseLink * JAXBUnmarshaller's underlying XMLUnmarshaller. Assumes that the given Unmarshaller is an * instance of EclipseLink JAXBUnmarshaller, and clazz is one of * org.eclipse.persistence.jaxb.JAXBUnmarshaller or org.eclipse.persistence.oxm.XMLUnmarshaller. * * @param <T> * @param jaxbUnmarshaller * @param clazz * @return * @see org.eclipse.persistence.jaxb.JAXBUnmarshaller * @see org.eclipse.persistence.oxm.XMLUnmarshaller * @throws IllegalArgumentException */ public static <T> T unwrap(javax.xml.bind.Unmarshaller jaxbUnmarshaller, Class<T> clazz) throws IllegalArgumentException { try { JAXBUnmarshaller jaxbUnmarshallerImpl = (JAXBUnmarshaller) jaxbUnmarshaller; if (clazz == org.eclipse.persistence.jaxb.JAXBUnmarshaller.class) { return (T) jaxbUnmarshallerImpl; } if (clazz == XMLUnmarshaller.class) { return (T) jaxbUnmarshallerImpl.getXMLUnmarshaller(); } throw new IllegalArgumentException(ExceptionLocalization .buildMessage("jaxb_helper_invalid_target_for_unmarshaller", new Object[] { clazz })); } catch (ClassCastException e) { throw new IllegalArgumentException(ExceptionLocalization .buildMessage("jaxb_helper_invalid_unmarshaller", new Object[] { jaxbUnmarshaller.getClass() })); } } /** * Unwraps a given Marshaller resulting in an EclipseLink JAXBMarshaller, or the EclipseLink * JAXBMarshaller's underlying XMLMarshaller. Assumes that the given Marshaller is an instance * of EclipseLink JAXBMarshaller, and clazz is one of * org.eclipse.persistence.jaxb.JAXBMarshaller or org.eclipse.persistence.oxm.XMLMarshaller. * * @param <T> * @param jaxbMarshaller * @param clazz * @return * @see org.eclipse.persistence.jaxb.JAXBMarshaller * @see org.eclipse.persistence.oxm.XMLMarshaller * @throws IllegalArgumentException */ public static <T> T unwrap(javax.xml.bind.Marshaller jaxbMarshaller, Class<T> clazz) throws IllegalArgumentException { try { JAXBMarshaller jaxbMarshallerImpl = (JAXBMarshaller) jaxbMarshaller; if (clazz == org.eclipse.persistence.jaxb.JAXBMarshaller.class) { return (T) jaxbMarshallerImpl; } if (clazz == XMLMarshaller.class) { return (T) jaxbMarshallerImpl.getXMLMarshaller(); } throw new IllegalArgumentException(ExceptionLocalization .buildMessage("jaxb_helper_invalid_target_for_marshaller", new Object[] { clazz })); } catch (ClassCastException e) { throw new IllegalArgumentException(ExceptionLocalization .buildMessage("jaxb_helper_invalid_marshaller", new Object[] { jaxbMarshaller.getClass() })); } } /** * Unwraps a given Binder resulting in an EclipseLink JAXBBinder, or the EclipseLink * JAXBBinder's underlying XMLBinder. Assumes that the given Binder is an instance of * EclipseLink JAXBBinderr, and clazz is one of org.eclipse.persistence.jaxb.JAXBinder or * org.eclipse.persistence.oxm.XMLBinder. * * @param <T> * @param jaxbBinder * @param clazz * @return * @see org.eclipse.persistence.jaxb.JAXBBinder * @see org.eclipse.persistence.oxm.XMLBinder * @throws IllegalArgumentException */ public static <T> T unwrap(javax.xml.bind.Binder jaxbBinder, Class<T> clazz) throws IllegalArgumentException { try { JAXBBinder jaxbBinderImpl = (JAXBBinder) jaxbBinder; if (clazz == org.eclipse.persistence.jaxb.JAXBBinder.class) { return (T) jaxbBinderImpl; } if (clazz == XMLBinder.class) { return (T) jaxbBinderImpl.getXMLBinder(); } throw new IllegalArgumentException(ExceptionLocalization .buildMessage("jaxb_helper_invalid_target_for_binder", new Object[] { clazz })); } catch (ClassCastException e) { throw new IllegalArgumentException(ExceptionLocalization .buildMessage("jaxb_helper_invalid_binder", new Object[] { jaxbBinder.getClass() })); } } }