| /** |
| * |
| * Licensed to the Apache Software Foundation (ASF) under one or more |
| * contributor license agreements. See the NOTICE file distributed with |
| * this work for additional information regarding copyright ownership. |
| * The ASF licenses this file to You under the Apache License, Version 2.0 |
| * (the "License"); you may not use this file except in compliance with |
| * the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| package org.apache.openejb.jee; |
| |
| import javax.xml.bind.JAXBContext; |
| import javax.xml.bind.JAXBException; |
| import java.util.Map; |
| import java.util.concurrent.TimeUnit; |
| import java.util.logging.Level; |
| |
| public final class JAXBContextFactory { |
| private static final boolean USE_FAST_BOOT = "true".equals(System.getProperty("openejb.jaxb.fastBoot", "true")); |
| private static final String FAST_BOOT = "com.sun.xml.bind.v2.runtime.JAXBContextImpl.fastBoot"; |
| |
| private static final java.util.logging.Logger log = java.util.logging.Logger.getLogger(JAXBContextFactory.class.getName()); |
| // private static boolean useSXC = false; |
| |
| private static String setFastBoot() { |
| final String fastBoot = System.getProperty(FAST_BOOT); |
| if (USE_FAST_BOOT) { |
| System.setProperty(FAST_BOOT, Boolean.TRUE.toString()); |
| } |
| return fastBoot; |
| } |
| |
| private static void resetFastBoot(final String fastBoot) { |
| if (USE_FAST_BOOT) { |
| if (fastBoot == null) { |
| System.clearProperty(FAST_BOOT); |
| } else { |
| System.setProperty(FAST_BOOT, fastBoot); |
| } |
| } |
| } |
| |
| public static JAXBContext newInstance(final String s) throws JAXBException { |
| // if (useSXC) { |
| // try { |
| // Sxc.newInstance(s); |
| // } catch (NoClassDefFoundError e) { |
| // } |
| // } |
| final Event event = Event.start(s); |
| try { |
| final String fastBoot = setFastBoot(); |
| try { |
| return JAXBContext.newInstance(s); |
| } finally { |
| resetFastBoot(fastBoot); |
| } |
| } finally { |
| event.stop(); |
| } |
| } |
| |
| public static JAXBContext newInstance(final String s, final ClassLoader classLoader) throws JAXBException { |
| // if (useSXC) { |
| // try { |
| // return Sxc.newInstance(s, classLoader); |
| // } catch (NoClassDefFoundError e) { |
| // } |
| // } |
| |
| final Event event = Event.start(s); |
| try { |
| final String fastBoot = setFastBoot(); |
| try { |
| return JAXBContext.newInstance(s, classLoader); |
| } finally { |
| resetFastBoot(fastBoot); |
| } |
| } finally { |
| event.stop(); |
| } |
| } |
| |
| public static JAXBContext newInstance(final String s, final ClassLoader classLoader, final Map<String, ?> properties) throws JAXBException { |
| // if (useSXC) { |
| // try { |
| // return Sxc.newInstance(s, classLoader, properties); |
| // } catch (NoClassDefFoundError e) { |
| // } |
| // } |
| |
| final Event event = Event.start(s); |
| try { |
| final String fastBoot = setFastBoot(); |
| try { |
| return JAXBContext.newInstance(s, classLoader, properties); |
| } finally { |
| resetFastBoot(fastBoot); |
| } |
| } finally { |
| event.stop(); |
| } |
| } |
| |
| public static JAXBContext newInstance(final Class... classes) throws JAXBException { |
| // if (useSXC) { |
| // try { |
| // return Sxc.newInstance(classes); |
| // } catch (NoClassDefFoundError e) { |
| // } |
| // } |
| final StringBuilder sb = new StringBuilder(); |
| for (final Class clazz : classes) { |
| sb.append(clazz.getName()); |
| sb.append(","); |
| } |
| sb.deleteCharAt(sb.length() - 1); |
| final Event event = Event.start(sb.toString()); |
| try { |
| final String fastBoot = setFastBoot(); |
| try { |
| return JAXBContext.newInstance(classes); |
| } catch (final LinkageError ignore) { |
| return JAXBContext.newInstance(classes); |
| } finally { |
| resetFastBoot(fastBoot); |
| } |
| } finally { |
| event.stop(); |
| } |
| } |
| |
| public static JAXBContext newInstance(final Class[] classes, final Map<String, ?> properties) throws JAXBException { |
| // if (useSXC) { |
| // try { |
| // return Sxc.newInstance(classes, properties); |
| // } catch (NoClassDefFoundError e) { |
| // } |
| // } |
| |
| final StringBuilder sb = new StringBuilder(); |
| for (final Class clazz : classes) { |
| sb.append(clazz.getName()); |
| sb.append(","); |
| } |
| sb.deleteCharAt(sb.length() - 1); |
| final Event event = Event.start(sb.toString()); |
| try { |
| final String fastBoot = setFastBoot(); |
| try { |
| return JAXBContext.newInstance(classes, properties); |
| } finally { |
| resetFastBoot(fastBoot); |
| } |
| } finally { |
| event.stop(); |
| } |
| } |
| |
| // public static class Sxc { |
| // public static JAXBContext newInstance(String s) throws JAXBException { |
| // ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); |
| // if (classLoader == null) classLoader = JAXBContextFactory.class.getClassLoader(); |
| // return com.envoisolutions.sxc.jaxb.JAXBContextImpl.newInstance(s, classLoader, Collections.singletonMap("com.envoisolutions.sxc.generate", "false")); |
| // } |
| // |
| // public static JAXBContext newInstance(String s, ClassLoader classLoader) throws JAXBException { |
| // return com.envoisolutions.sxc.jaxb.JAXBContextImpl.newInstance(s, classLoader, Collections.singletonMap("com.envoisolutions.sxc.generate", "false")); |
| // } |
| // |
| // public static JAXBContext newInstance(String s, ClassLoader classLoader, Map<String, ?> properties) throws JAXBException { |
| // if (properties == null) properties = new TreeMap<String, Object>(); |
| // // hack because intellij is being stupid |
| // ((Map<String, Object>) properties).put("com.envoisolutions.sxc.generate", "false"); |
| // return com.envoisolutions.sxc.jaxb.JAXBContextImpl.newInstance(s, classLoader, properties); |
| // } |
| // |
| // public static JAXBContext newInstance(Class... classes) throws JAXBException { |
| // JAXBContext jaxbContext = null; |
| // jaxbContext = com.envoisolutions.sxc.jaxb.JAXBContextImpl.newInstance(classes, Collections.singletonMap("com.envoisolutions.sxc.generate", "false")); |
| // return jaxbContext; |
| // } |
| // |
| // public static JAXBContext newInstance(Class[] classes, Map<String, ?> properties) throws JAXBException { |
| // if (properties == null) properties = new TreeMap<String, Object>(); |
| // // hack because intellij is being stupid |
| // ((Map<String, Object>) properties).put("com.envoisolutions.sxc.generate", "false"); |
| // return com.envoisolutions.sxc.jaxb.JAXBContextImpl.newInstance(classes, properties); |
| // } |
| // } |
| |
| |
| private static class Event { |
| protected final long start = System.nanoTime(); |
| private final String description; |
| |
| private Event(final String description) { |
| this.description = description; |
| } |
| |
| public static Event start(final String description) { |
| return new Event(description); |
| } |
| |
| public void stop() { |
| log.log(Level.FINE, String.format("JAXBContext.newInstance %s %s", TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - this.start), this.description)); |
| } |
| } |
| } |