| /* |
| * 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.solr.util; |
| |
| import java.util.TimeZone; |
| import java.util.Set; |
| import java.util.HashSet; |
| import java.util.Collections; |
| import java.util.Arrays; |
| |
| import java.util.regex.Pattern; |
| import java.util.regex.Matcher; |
| |
| import org.apache.solr.common.SolrException; |
| |
| /** |
| * Simple utilities for working with TimeZones |
| * @see java.util.TimeZone |
| */ |
| public final class TimeZoneUtils { |
| |
| private TimeZoneUtils() { |
| // :NOOP: |
| } |
| |
| /** |
| * An immutable Set of all TimeZone IDs supported by the TimeZone class |
| * at the moment the TimeZoneUtils was initialized. |
| * |
| * @see TimeZone#getAvailableIDs |
| */ |
| public static final Set<String> KNOWN_TIMEZONE_IDS |
| = Collections.unmodifiableSet(new HashSet<> |
| (Arrays.asList(TimeZone.getAvailableIDs()))); |
| |
| /** |
| * This method is provided as a replacement for TimeZone.getTimeZone but |
| * without the annoying behavior of returning "GMT" for gibberish input. |
| * <p> |
| * This method will return null unless the input is either: |
| * </p> |
| * <ul> |
| * <li>Included in the set of known TimeZone IDs</li> |
| * <li>A "CustomID" specified as a numeric offset from "GMT"</li> |
| * </ul> |
| * |
| * @param ID Either a TimeZone ID found in KNOWN_TIMEZONE_IDS, or a "CustomID" specified as a GMT offset. |
| * @return A TimeZone object corresponding to the input, or null if no such TimeZone is supported. |
| * @see #KNOWN_TIMEZONE_IDS |
| * @see TimeZone |
| */ |
| public static final TimeZone getTimeZone(final String ID) { |
| if (null == ID) return null; |
| if (KNOWN_TIMEZONE_IDS.contains(ID)) return TimeZone.getTimeZone(ID); |
| |
| Matcher matcher = CUSTOM_ID_REGEX.matcher(ID); |
| if (matcher.matches()) { |
| int hour = Integer.parseInt(matcher.group(1)); |
| if (hour < 0 || 23 < hour) return null; |
| |
| final String minStr = matcher.group(2); |
| if (null != minStr) { |
| int min = Integer.parseInt(minStr); |
| if (min < 0 || 59 < min) return null; |
| } |
| return TimeZone.getTimeZone(ID); |
| } |
| return null; |
| } |
| |
| private static Pattern CUSTOM_ID_REGEX = Pattern.compile("GMT(?:\\+|\\-)(\\d{1,2})(?::?(\\d{2}))?"); |
| |
| /** |
| * Parse the specified timezone ID. If null input then return UTC. If we can't resolve it then |
| * throw an exception. Does not return null. |
| */ |
| public static TimeZone parseTimezone(String tzStr) { |
| if (tzStr != null) { |
| TimeZone tz = getTimeZone(tzStr); |
| if (null == tz) { |
| throw new SolrException(SolrException.ErrorCode.BAD_REQUEST, |
| "Solr JVM does not support TZ: " + tzStr); |
| } |
| return tz; |
| } else { |
| return DateMathParser.UTC; //TODO move to TimeZoneUtils |
| } |
| } |
| } |