1 /* |
1 /* |
2 * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved. |
2 * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved. |
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
4 * |
4 * |
5 * This code is free software; you can redistribute it and/or modify it |
5 * This code is free software; you can redistribute it and/or modify it |
6 * under the terms of the GNU General Public License version 2 only, as |
6 * under the terms of the GNU General Public License version 2 only, as |
7 * published by the Free Software Foundation. Oracle designates this |
7 * published by the Free Software Foundation. Oracle designates this |
151 } else { |
151 } else { |
152 out.writeCharacters(value.toString()); |
152 out.writeCharacters(value.toString()); |
153 } |
153 } |
154 } |
154 } |
155 |
155 |
156 |
|
157 /** |
156 /** |
158 * Reference to FI's XMLStreamWriter class, if FI can be loaded. |
157 * Reference to FI's XMLStreamWriter class, if FI can be loaded. |
159 */ |
158 */ |
160 private static final Class FI_STAX_WRITER_CLASS = initFIStAXWriterClass(); |
159 private static final Class FI_STAX_WRITER_CLASS = initFIStAXWriterClass(); |
161 private static final Constructor<? extends XmlOutput> FI_OUTPUT_CTOR = initFastInfosetOutputClass(); |
160 private static final Constructor<? extends XmlOutput> FI_OUTPUT_CTOR = initFastInfosetOutputClass(); |
162 |
161 |
163 private static Class initFIStAXWriterClass() { |
162 private static Class initFIStAXWriterClass() { |
164 try { |
163 try { |
165 ClassLoader loader = getClassLoader(); |
164 Class<?> llfisw = Class.forName("com.sun.xml.internal.org.jvnet.fastinfoset.stax.LowLevelFastInfosetStreamWriter"); |
166 Class llfisw = Class.forName("com.sun.xml.internal.org.jvnet.fastinfoset.stax.LowLevelFastInfosetStreamWriter", true, loader); |
165 Class<?> sds = Class.forName("com.sun.xml.internal.fastinfoset.stax.StAXDocumentSerializer"); |
167 Class sds = loader.loadClass("com.sun.xml.internal.fastinfoset.stax.StAXDocumentSerializer"); |
|
168 // Check if StAXDocumentSerializer implements LowLevelFastInfosetStreamWriter |
166 // Check if StAXDocumentSerializer implements LowLevelFastInfosetStreamWriter |
169 if (llfisw.isAssignableFrom(sds)) |
167 if (llfisw.isAssignableFrom(sds)) |
170 return sds; |
168 return sds; |
171 else |
169 else |
172 return null; |
170 return null; |
177 |
175 |
178 private static Constructor<? extends XmlOutput> initFastInfosetOutputClass() { |
176 private static Constructor<? extends XmlOutput> initFastInfosetOutputClass() { |
179 try { |
177 try { |
180 if (FI_STAX_WRITER_CLASS == null) |
178 if (FI_STAX_WRITER_CLASS == null) |
181 return null; |
179 return null; |
182 ClassLoader loader = getClassLoader(); |
180 Class c = Class.forName("com.sun.xml.internal.bind.v2.runtime.output.FastInfosetStreamWriterOutput"); |
183 Class c = Class.forName("com.sun.xml.internal.bind.v2.runtime.output.FastInfosetStreamWriterOutput", true, loader); |
|
184 return c.getConstructor(FI_STAX_WRITER_CLASS, JAXBContextImpl.class); |
181 return c.getConstructor(FI_STAX_WRITER_CLASS, JAXBContextImpl.class); |
185 } catch (Throwable e) { |
182 } catch (Throwable e) { |
186 return null; |
183 return null; |
187 } |
184 } |
188 } |
185 } |
193 private static final Class STAXEX_WRITER_CLASS = initStAXExWriterClass(); |
190 private static final Class STAXEX_WRITER_CLASS = initStAXExWriterClass(); |
194 private static final Constructor<? extends XmlOutput> STAXEX_OUTPUT_CTOR = initStAXExOutputClass(); |
191 private static final Constructor<? extends XmlOutput> STAXEX_OUTPUT_CTOR = initStAXExOutputClass(); |
195 |
192 |
196 private static Class initStAXExWriterClass() { |
193 private static Class initStAXExWriterClass() { |
197 try { |
194 try { |
198 ClassLoader loader = getClassLoader(); |
195 return Class.forName("com.sun.xml.internal.org.jvnet.staxex.XMLStreamWriterEx"); |
199 return Class.forName("com.sun.xml.internal.org.jvnet.staxex.XMLStreamWriterEx",true,loader); |
|
200 } catch (Throwable e) { |
196 } catch (Throwable e) { |
201 return null; |
197 return null; |
202 } |
198 } |
203 } |
199 } |
204 |
200 |
205 private static Constructor<? extends XmlOutput> initStAXExOutputClass() { |
201 private static Constructor<? extends XmlOutput> initStAXExOutputClass() { |
206 try { |
202 try { |
207 ClassLoader loader = getClassLoader(); |
203 Class c = Class.forName("com.sun.xml.internal.bind.v2.runtime.output.StAXExStreamWriterOutput"); |
208 Class c = Class.forName("com.sun.xml.internal.bind.v2.runtime.output.StAXExStreamWriterOutput",true, loader); |
|
209 return c.getConstructor(STAXEX_WRITER_CLASS); |
204 return c.getConstructor(STAXEX_WRITER_CLASS); |
210 } catch (Throwable e) { |
205 } catch (Throwable e) { |
211 return null; |
206 return null; |
212 } |
207 } |
213 } |
208 } |
214 |
209 |
215 private static ClassLoader getClassLoader() { |
|
216 ClassLoader cl = SecureLoader.getClassClassLoader(UnmarshallerImpl.class); |
|
217 if (cl == null) { |
|
218 cl = SecureLoader.getContextClassLoader(); |
|
219 } |
|
220 return cl; |
|
221 } |
|
222 |
|
223 } |
210 } |