blob: bfda86124262acda865817fd0facbc26c67071fd [file] [log] [blame]
/**
*
* 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));
}
}
}