src/share/jaxws_classes/com/sun/xml/internal/bind/DatatypeConverterImpl.java

changeset 514
29a761eaff0d
parent 368
0989ad8c0860
child 637
9c07ef4934dd
     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

mercurial