1.1 --- a/src/share/jaxws_classes/com/sun/xml/internal/bind/DatatypeConverterImpl.java Tue Feb 11 14:35:59 2014 -0800 1.2 +++ b/src/share/jaxws_classes/com/sun/xml/internal/bind/DatatypeConverterImpl.java Fri Feb 14 10:53:55 2014 +0100 1.3 @@ -1,5 +1,5 @@ 1.4 /* 1.5 - * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. 1.6 + * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved. 1.7 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 1.8 * 1.9 * This code is free software; you can redistribute it and/or modify it 1.10 @@ -27,9 +27,14 @@ 1.11 1.12 import java.math.BigDecimal; 1.13 import java.math.BigInteger; 1.14 +import java.security.AccessController; 1.15 +import java.security.PrivilegedAction; 1.16 import java.util.Calendar; 1.17 +import java.util.Collections; 1.18 import java.util.GregorianCalendar; 1.19 +import java.util.Map; 1.20 import java.util.TimeZone; 1.21 +import java.util.WeakHashMap; 1.22 1.23 import javax.xml.bind.DatatypeConverter; 1.24 import javax.xml.bind.DatatypeConverterInterface; 1.25 @@ -356,7 +361,7 @@ 1.26 1.27 public static GregorianCalendar _parseDateTime(CharSequence s) { 1.28 String val = WhiteSpaceProcessor.trim(s).toString(); 1.29 - return datatypeFactory.newXMLGregorianCalendar(val).toGregorianCalendar(); 1.30 + return getDatatypeFactory().newXMLGregorianCalendar(val).toGregorianCalendar(); 1.31 } 1.32 1.33 public static String _printDateTime(Calendar val) { 1.34 @@ -722,14 +727,30 @@ 1.35 } 1.36 return false; 1.37 } 1.38 - private static final DatatypeFactory datatypeFactory; 1.39 1.40 - static { 1.41 - try { 1.42 - datatypeFactory = DatatypeFactory.newInstance(); 1.43 - } catch (DatatypeConfigurationException e) { 1.44 - throw new Error(e); 1.45 + private static final Map<ClassLoader, DatatypeFactory> DF_CACHE = Collections.synchronizedMap(new WeakHashMap<ClassLoader, DatatypeFactory>()); 1.46 + 1.47 + public static DatatypeFactory getDatatypeFactory() { 1.48 + ClassLoader tccl = AccessController.doPrivileged(new PrivilegedAction<ClassLoader>() { 1.49 + public ClassLoader run() { 1.50 + return Thread.currentThread().getContextClassLoader(); 1.51 + } 1.52 + }); 1.53 + DatatypeFactory df = DF_CACHE.get(tccl); 1.54 + if (df == null) { 1.55 + synchronized (DatatypeConverterImpl.class) { 1.56 + df = DF_CACHE.get(tccl); 1.57 + if (df == null) { // to prevent multiple initialization 1.58 + try { 1.59 + df = DatatypeFactory.newInstance(); 1.60 + } catch (DatatypeConfigurationException e) { 1.61 + throw new Error(Messages.FAILED_TO_INITIALE_DATATYPE_FACTORY.format(),e); 1.62 + } 1.63 + DF_CACHE.put(tccl, df); 1.64 + } 1.65 + } 1.66 } 1.67 + return df; 1.68 } 1.69 1.70 private static final class CalendarFormatter { 1.71 @@ -1045,7 +1066,7 @@ 1.72 1.73 @Deprecated 1.74 public Calendar parseTime(String lexicalXSDTime) { 1.75 - return datatypeFactory.newXMLGregorianCalendar(lexicalXSDTime).toGregorianCalendar(); 1.76 + return getDatatypeFactory().newXMLGregorianCalendar(lexicalXSDTime).toGregorianCalendar(); 1.77 } 1.78 1.79 @Deprecated 1.80 @@ -1055,7 +1076,7 @@ 1.81 1.82 @Deprecated 1.83 public Calendar parseDate(String lexicalXSDDate) { 1.84 - return datatypeFactory.newXMLGregorianCalendar(lexicalXSDDate).toGregorianCalendar(); 1.85 + return getDatatypeFactory().newXMLGregorianCalendar(lexicalXSDDate).toGregorianCalendar(); 1.86 } 1.87 1.88 @Deprecated