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); }
/** * 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); }