2 * ============LICENSE_START====================================================
\r
4 * ===========================================================================
\r
5 * Copyright (c) 2018 AT&T Intellectual Property. All rights reserved.
\r
6 * ===========================================================================
\r
7 * Licensed under the Apache License, Version 2.0 (the "License");
\r
8 * you may not use this file except in compliance with the License.
\r
9 * You may obtain a copy of the License at
\r
11 * http://www.apache.org/licenses/LICENSE-2.0
\r
13 * Unless required by applicable law or agreed to in writing, software
\r
14 * distributed under the License is distributed on an "AS IS" BASIS,
\r
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
\r
16 * See the License for the specific language governing permissions and
\r
17 * limitations under the License.
\r
18 * ============LICENSE_END====================================================
\r
25 * Created on: Apr 10, 2009
\r
26 * Created by: Jonathan
\r
28 * Revamped to do away with ThreadLocal 5/27/2011, JonathanGathman
\r
30 * (c) 2009 SBC Knowledge Ventures, L.P. All rights reserved.
\r
31 *******************************************************************
\r
32 * RESTRICTED - PROPRIETARY INFORMATION The Information contained
\r
33 * herein is for use only by authorized employees of AT&T Services,
\r
34 * Inc., and authorized Affiliates of AT&T Services, Inc., and is
\r
35 * not for general distribution within or outside the respective
\r
37 *******************************************************************
\r
39 package org.onap.aaf.misc.env.jaxb;
\r
41 import java.io.OutputStream;
\r
42 import java.io.StringWriter;
\r
43 import java.io.Writer;
\r
44 import java.util.HashMap;
\r
45 import java.util.Map;
\r
47 import javax.xml.bind.JAXBContext;
\r
48 import javax.xml.bind.JAXBElement;
\r
49 import javax.xml.bind.JAXBException;
\r
50 import javax.xml.bind.Marshaller;
\r
51 import javax.xml.namespace.QName;
\r
53 import org.onap.aaf.misc.env.APIException;
\r
54 import org.onap.aaf.misc.env.LogTarget;
\r
55 import org.onap.aaf.misc.env.util.Pool;
\r
56 import org.onap.aaf.misc.env.util.Pool.Pooled;
\r
59 * JAXBmar classes are inexpensive for going in and out of scope
\r
60 * and have been made thread safe via Pooling
\r
65 public class JAXBmar {
\r
66 // Need to store off possible JAXBContexts based on Class, which will be stored in Creator
\r
67 private static Map<Class<?>[],Pool<PMarshaller>> pools = new HashMap<Class<?>[], Pool<PMarshaller>>();
\r
69 // Handle Marshaller class setting of properties only when needed
\r
70 private class PMarshaller {
\r
71 private Marshaller m;
\r
75 public PMarshaller(Marshaller marshaller) throws JAXBException {
\r
77 m.setProperty(Marshaller.JAXB_ENCODING, "UTF-8");
\r
78 m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, p = false);
\r
79 m.setProperty(Marshaller.JAXB_FRAGMENT, f = false);
\r
82 public Marshaller get(boolean pretty, boolean fragment) throws JAXBException {
\r
84 m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, p = pretty);
\r
87 m.setProperty(Marshaller.JAXB_FRAGMENT, f = fragment);
\r
93 private class Creator implements Pool.Creator<PMarshaller> {
\r
94 private JAXBContext jc;
\r
95 private String name;
\r
96 public Creator(Class<?>[] classes) throws JAXBException {
\r
97 jc = JAXBContext.newInstance(classes);
\r
98 name = "JAXBmar: " + classes[0].getName();
\r
102 public PMarshaller create() throws APIException {
\r
104 return new PMarshaller(jc.createMarshaller());
\r
105 } catch (JAXBException e) {
\r
106 throw new APIException(e);
\r
110 public String toString() {
\r
115 public void reuse(PMarshaller pm) {
\r
120 public void destroy(PMarshaller pm) {
\r
125 public boolean isValid(PMarshaller t) {
\r
130 //TODO isn't UTF-8 a standard string somewhere for encoding?
\r
131 private boolean fragment= false;
\r
132 private boolean pretty=false;
\r
133 private QName qname;
\r
135 private Pool<PMarshaller> mpool; // specific Pool associated with constructed Classes
\r
136 private Class<?> cls;
\r
138 private Pool<PMarshaller> getPool(Class<?> ... classes) throws JAXBException {
\r
139 Pool<PMarshaller> mp;
\r
140 synchronized(pools) {
\r
141 mp = pools.get(classes);
\r
143 pools.put(classes,mp = new Pool<PMarshaller>(new Creator(classes)));
\r
149 public JAXBmar(Class<?>... classes) throws JAXBException {
\r
151 mpool = getPool(classes);
\r
155 public JAXBmar(QName theQname, Class<?>... classes) throws JAXBException {
\r
157 mpool = getPool(classes);
\r
161 @SuppressWarnings("unchecked")
\r
162 public<O> O marshal(LogTarget lt,O o, Writer writer, boolean ... options) throws JAXBException, APIException {
\r
163 boolean pretty, fragment;
\r
164 pretty = options.length>0?options[0]:this.pretty;
\r
165 fragment = options.length>1?options[1]:this.fragment;
\r
166 Pooled<PMarshaller> m = mpool.get(lt);
\r
169 m.content.get(pretty,fragment).marshal(o, writer);
\r
171 m.content.get(pretty,fragment).marshal(
\r
172 new JAXBElement<O>(qname, (Class<O>)cls, o ),
\r
181 @SuppressWarnings("unchecked")
\r
182 public<O> O marshal(LogTarget lt, O o, OutputStream os, boolean ... options) throws JAXBException, APIException {
\r
183 boolean pretty, fragment;
\r
184 pretty = options.length>0?options[0]:this.pretty;
\r
185 fragment = options.length>1?options[1]:this.fragment;
\r
186 Pooled<PMarshaller> m = mpool.get(lt);
\r
189 m.content.get(pretty,fragment).marshal(o, os);
\r
191 m.content.get(pretty,fragment).marshal(
\r
192 new JAXBElement<O>(qname, (Class<O>)cls, o ),os);
\r
200 public<O> O marshal(LogTarget lt, O o, Writer writer, Class<O> clss) throws JAXBException, APIException {
\r
201 Pooled<PMarshaller> m = mpool.get(lt);
\r
204 m.content.get(pretty,fragment).marshal(o, writer);
\r
206 m.content.get(pretty,fragment).marshal(
\r
207 new JAXBElement<O>(qname, clss, o),writer);
\r
216 public<O> O marshal(LogTarget lt, O o, OutputStream os, Class<O> clss) throws JAXBException, APIException {
\r
217 Pooled<PMarshaller> m = mpool.get(lt);
\r
220 m.content.get(pretty,fragment).marshal(o, os);
\r
222 m.content.get(pretty,fragment).marshal(
\r
223 new JAXBElement<O>(qname, clss, o ),os);
\r
234 public Class<?> getMarshalClass() {
\r
238 public<O> String stringify(LogTarget lt, O o) throws JAXBException, APIException {
\r
239 StringWriter sw = new StringWriter();
\r
241 return sw.toString();
\r
244 public JAXBmar pretty(boolean pretty) {
\r
245 this.pretty = pretty;
\r
249 public JAXBmar asFragment(boolean fragment) {
\r
250 this.fragment = fragment;
\r