/* * Copyright (c) 1998-2011 Caucho Technology -- all rights reserved * * This file is part of Resin(R) Open Source * * Each copy or derived work must preserve the copyright notice and this * notice unmodified. * * Resin Open Source is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * Resin Open Source 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, or any warranty * of NON-INFRINGEMENT. See the GNU General Public License for more * details. * * You should have received a copy of the GNU General Public License * along with Resin Open Source; if not, write to the * * Free Software Foundation, Inc. * 59 Temple Place, Suite 330 * Boston, MA 02111-1307 USA * * @author Scott Ferguson */ package javax.xml.bind; import java.util.*; import java.io.*; import java.net.*; import java.lang.ref.*; import javax.xml.transform.*; import javax.xml.transform.stream.*; public final class JAXB { private static WeakHashMap<Class,SoftReference<JAXBContext>> _contextMap = new WeakHashMap<Class,SoftReference<JAXBContext>>(); public static void marshal(Object obj, File xml) { try { getContext(obj).createMarshaller().marshal(obj, xml); } catch (RuntimeException e) { throw e; } catch (Exception e) { throw new DataBindingException(e); } } public static void marshal(Object obj, URL xml) { try { URLConnection conn = xml.openConnection(); conn.setDoInput(false); conn.setDoOutput(false); conn.connect(); OutputStream os = conn.getOutputStream(); try { StreamResult result = new StreamResult(os); marshal(obj, result); } finally { os.close(); } } catch (RuntimeException e) { throw e; } catch (Exception e) { throw new DataBindingException(e); } } public static void marshal(Object obj, URI xml) { try { marshal(obj, xml.toURL()); } catch (RuntimeException e) { throw e; } catch (Exception e) { throw new DataBindingException(e); } } public static void marshal(Object obj, String xml) { try { StreamResult result = new StreamResult(xml); getContext(obj).createMarshaller().marshal(obj, result); } catch (RuntimeException e) { throw e; } catch (Exception e) { throw new DataBindingException(e); } } public static void marshal(Object obj, OutputStream xml) { try { getContext(obj).createMarshaller().marshal(obj, xml); } catch (RuntimeException e) { throw e; } catch (Exception e) { throw new DataBindingException(e); } } public static void marshal(Object obj, Writer xml) { try { getContext(obj).createMarshaller().marshal(obj, xml); } catch (RuntimeException e) { throw e; } catch (Exception e) { throw new DataBindingException(e); } } public static void marshal(Object obj, Result xml) { try { getContext(obj).createMarshaller().marshal(obj, xml); } catch (RuntimeException e) { throw e; } catch (Exception e) { throw new DataBindingException(e); } } public static <T> T unmarshal(File xml, Class<T> type) { try { return (T) getContext(type).createUnmarshaller().unmarshal(xml); } catch (RuntimeException e) { throw e; } catch (Exception e) { throw new DataBindingException(e); } } public static <T> T unmarshal(URL url, Class<T> type) { try { return (T) getContext(type).createUnmarshaller().unmarshal(url); } catch (RuntimeException e) { throw e; } catch (Exception e) { throw new DataBindingException(e); } } public static <T> T unmarshal(URI uri, Class<T> type) { try { return unmarshal(uri.toURL(), type); } catch (RuntimeException e) { throw e; } catch (Exception e) { throw new DataBindingException(e); } } public static <T> T unmarshal(String xml, Class<T> type) { try { StreamSource source = new StreamSource(xml); return (T) getContext(type).createUnmarshaller().unmarshal(source); } catch (RuntimeException e) { throw e; } catch (Exception e) { throw new DataBindingException(e); } } public static <T> T unmarshal(InputStream xml, Class<T> type) { try { return (T) getContext(type).createUnmarshaller().unmarshal(xml); } catch (RuntimeException e) { throw e; } catch (Exception e) { throw new DataBindingException(e); } } public static <T> T unmarshal(Reader xml, Class<T> type) { try { return (T) getContext(type).createUnmarshaller().unmarshal(xml); } catch (RuntimeException e) { throw e; } catch (Exception e) { throw new DataBindingException(e); } } public static <T> T unmarshal(Source xml, Class<T> type) { try { return (T) getContext(type).createUnmarshaller().unmarshal(xml); } catch (RuntimeException e) { throw e; } catch (Exception e) { throw new DataBindingException(e); } } private static JAXBContext getContext(Object obj) throws JAXBException { if (obj instanceof JAXBElement) { JAXBElement elt = (JAXBElement) obj; return getContext(elt.getDeclaredType()); } else return getContext(obj.getClass()); } private static JAXBContext getContext(Class cl) throws JAXBException { SoftReference<JAXBContext> ref = _contextMap.get(cl); JAXBContext context = null; if (ref != null) context = ref.get(); if (context == null) { context = JAXBContext.newInstance(cl); _contextMap.put(cl, new SoftReference<JAXBContext>(context)); } return context; } }