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;
018
019 import java.io.File;
020 import java.io.OutputStream;
021 import java.io.Writer;
022 import java.io.IOException;
023 import java.io.Reader;
024 import java.io.InputStream;
025 import java.net.URI;
026 import java.net.URL;
027 import java.net.URLConnection;
028 import java.net.URISyntaxException;
029 import java.net.MalformedURLException;
030 import java.beans.Introspector;
031
032 import javax.xml.transform.Result;
033 import javax.xml.transform.Source;
034 import javax.xml.transform.stream.StreamResult;
035 import javax.xml.transform.stream.StreamSource;
036 import javax.xml.bind.annotation.XmlRootElement;
037 import javax.xml.namespace.QName;
038
039 final public class JAXB {
040
041 private JAXB() {
042 }
043
044 public static void marshal(Object object, File file) {
045 if (file == null) {
046 throw new IllegalStateException("No file is given");
047 }
048 marshal(object, new StreamResult(file));
049 }
050
051 public static void marshal(Object object, OutputStream os) {
052 if (os == null) {
053 throw new IllegalStateException("No output stream is given");
054 }
055 marshal(object, new StreamResult(os));
056 }
057
058 public static void marshal(Object object, Writer writer) {
059 if (writer == null) {
060 throw new IllegalStateException("No writer is given");
061 }
062 marshal(object, new StreamResult(writer));
063 }
064
065 public static void marshal(Object object, String str) {
066 if (str == null) {
067 throw new IllegalStateException("No string destination is given");
068 }
069 try {
070 marshal(object, new URI(str));
071 } catch (URISyntaxException e) {
072 marshal(object, new File(str));
073 }
074 }
075
076 public static void marshal(Object object, URI uri) {
077 if (uri == null) {
078 throw new IllegalStateException("No uri is given");
079 }
080 try {
081 marshal(object, uri.toURL());
082 } catch (IOException e) {
083 throw new DataBindingException(e);
084 }
085 }
086
087 public static void marshal(Object object, URL url) {
088 if (url == null) {
089 throw new IllegalStateException("No url is given");
090 }
091 try {
092 URLConnection con = url.openConnection();
093 con.setDoOutput(true);
094 con.setDoInput(false);
095 con.connect();
096 marshal(object, new StreamResult(con.getOutputStream()));
097 } catch (IOException e) {
098 throw new DataBindingException(e);
099 }
100 }
101
102 public static void marshal(Object object, Result result) {
103 try {
104 JAXBContext context;
105 if (object instanceof JAXBElement) {
106 context = getContext(((JAXBElement<?>) object).getDeclaredType());
107 } else {
108 Class<?> clazz = object.getClass();
109 XmlRootElement r = clazz.getAnnotation(XmlRootElement.class);
110 if (r == null) {
111 // we need to infer the name
112 object = new JAXBElement(new QName(Introspector.decapitalize(clazz.getSimpleName())),
113 clazz, object);
114 }
115 context = getContext(clazz);
116 }
117 Marshaller m = context.createMarshaller();
118 m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT,true);
119 m.marshal(object, result);
120 } catch (JAXBException e) {
121 throw new DataBindingException(e);
122 }
123 }
124
125 public static <T> T unmarshal(File file, Class<T> type) {
126 if (file == null) {
127 throw new IllegalStateException("No file is given");
128 }
129 return unmarshal(new StreamSource(file), type);
130 }
131
132 public static <T> T unmarshal(URL url, Class<T> type) {
133 if (url == null) {
134 throw new IllegalStateException("No url is given");
135 }
136 return unmarshal(new StreamSource(url.toExternalForm()), type);
137 }
138
139 public static <T> T unmarshal(URI uri, Class<T> type) {
140 if (uri == null) {
141 throw new IllegalStateException("No uri is given");
142 }
143 try {
144 return unmarshal(uri.toURL(), type);
145 } catch (MalformedURLException e) {
146 throw new DataBindingException(e);
147 }
148 }
149
150 public static <T> T unmarshal(String str, Class<T> type) {
151 if (str == null) {
152 throw new IllegalStateException("No string destination is given");
153 }
154 try {
155 return unmarshal(new URI(str), type);
156 } catch (URISyntaxException e) {
157 return unmarshal(new File(str), type);
158 }
159 }
160
161 public static <T> T unmarshal(InputStream is, Class<T> type) {
162 if (is == null) {
163 throw new IllegalStateException("No input stream is given");
164 }
165 return unmarshal(new StreamSource(is), type);
166 }
167
168 public static <T> T unmarshal(Reader reader, Class<T> type) {
169 if (reader == null) {
170 throw new IllegalStateException("No reader is given");
171 }
172 return unmarshal(new StreamSource(reader), type);
173 }
174
175 public static <T> T unmarshal(Source source, Class<T> type) {
176 try {
177 JAXBElement<T> item = getContext(type).createUnmarshaller().unmarshal(source, type);
178 return item.getValue();
179 } catch (JAXBException e) {
180 throw new DataBindingException(e);
181 }
182 }
183
184 private static <T> JAXBContext getContext(Class<T> type) throws JAXBException {
185 return JAXBContext.newInstance(type);
186 }
187
188
189 }