示例#1
0
  static {
    // if the property java.time.zone.DefaultZoneRulesProvider is
    // set then its value is the class name of the default provider
    final List<ZoneRulesProvider> loaded = new ArrayList<>();
    AccessController.doPrivileged(
        new PrivilegedAction<>() {
          public Object run() {
            String prop = System.getProperty("java.time.zone.DefaultZoneRulesProvider");
            if (prop != null) {
              try {
                Class<?> c = Class.forName(prop, true, ClassLoader.getSystemClassLoader());
                @SuppressWarnings("deprecation")
                ZoneRulesProvider provider = ZoneRulesProvider.class.cast(c.newInstance());
                registerProvider(provider);
                loaded.add(provider);
              } catch (Exception x) {
                throw new Error(x);
              }
            } else {
              registerProvider(new TzdbZoneRulesProvider());
            }
            return null;
          }
        });

    ServiceLoader<ZoneRulesProvider> sl =
        ServiceLoader.load(ZoneRulesProvider.class, ClassLoader.getSystemClassLoader());
    Iterator<ZoneRulesProvider> it = sl.iterator();
    while (it.hasNext()) {
      ZoneRulesProvider provider;
      try {
        provider = it.next();
      } catch (ServiceConfigurationError ex) {
        if (ex.getCause() instanceof SecurityException) {
          continue; // ignore the security exception, try the next provider
        }
        throw ex;
      }
      boolean found = false;
      for (ZoneRulesProvider p : loaded) {
        if (p.getClass() == provider.getClass()) {
          found = true;
        }
      }
      if (!found) {
        registerProvider0(provider);
        loaded.add(provider);
      }
    }
    // CopyOnWriteList could be slow if lots of providers and each added individually
    PROVIDERS.addAll(loaded);
  }
示例#2
0
 /**
  * Registers a zone rules provider.
  *
  * <p>This adds a new provider to those currently available. A provider supplies rules for one or
  * more zone IDs. A provider cannot be registered if it supplies a zone ID that has already been
  * registered. See the notes on time-zone IDs in {@link ZoneId}, especially the section on using
  * the concept of a "group" to make IDs unique.
  *
  * <p>To ensure the integrity of time-zones already created, there is no way to deregister
  * providers.
  *
  * @param provider the provider to register, not null
  * @throws ZoneRulesException if a zone ID is already registered
  */
 public static void registerProvider(ZoneRulesProvider provider) {
   Objects.requireNonNull(provider, "provider");
   registerProvider0(provider);
   PROVIDERS.add(provider);
 }