/**
* 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.schema;
import org.apache.solr.common.SolrException;
import org.apache.solr.response.TextResponseWriter;
import org.apache.solr.response.XMLWriter;
import org.apache.lucene.document.Fieldable;
import org.apache.lucene.search.SortField;
import org.apache.solr.search.function.ValueSource;
import org.apache.solr.search.function.OrdFieldSource;
import org.apache.solr.util.DateMathParser;
import java.util.Map;
import java.io.IOException;
import java.util.Date;
import java.util.TimeZone;
import java.util.Locale;
import java.text.SimpleDateFormat;
import java.text.DateFormat;
import java.text.NumberFormat;
import java.text.ParsePosition;
import java.text.ParseException;
/**
* This class is <b>NOT</b> recommended for new users and should be
* considered <b>UNSUPPORTED</b>.
* <p>
* In Solr 1.2, <tt>DateField</tt> did not enforce
* the canonical representation of the ISO 8601 format when parsing
* incoming data, and did not generation the canonical format when
* generating dates from "Date Math" strings (particularly as
* it pertains to milliseconds ending in trailing zeros) -- As a result
* equivalent dates could not always be compared properly.
* </p>
* <p>
* This class is provided as possible alternative for people who depend on
* the "broken" behavior of DateField in Solr 1.2
* (specificly: accepting any input that ends in a 'Z', and
* formating DateMath expressions using 3 decimals of milliseconds) while
* still supporting some newer functionality of DateField (ie: DateMath on
* explicit strings in addition to "NOW")
* </p>
* <p>
* Users that desire 100% backwards compatibility should consider using
* the Solr 1.2 version of <tt>DateField</tt>
* </p>
*
* @see <a href="https://issues.apache.org/jira/browse/SOLR-552">SOLR-552</a>
* @see <a href="https://issues.apache.org/jira/browse/SOLR-470">SOLR-470</a>
* @see <a href="https://issues.apache.org/jira/browse/SOLR-521">SOLR-521</a>
* @deprecated use {@link DateField}
*/
@Deprecated
public final class LegacyDateField extends DateField {
/**
* Overrides the super class to short circut and do no enforcing of
* the canonical format
*/
public String toInternal(String val) {
final int len=val.length();
if (val.charAt(len-1) == Z) {
// check common case first, simple datetime
// NOTE: not parsed to ensure correctness
return val.substring(0,len-1);
}
return toInternal(parseMath(null, val));
}
/**
* This method returns a DateFormat which does <b>NOT</b> respect the
* ISO 8601 canonical format with regards to trailing zeros in milliseconds,
* instead if always formats milliseconds to 3 decimal points.
*/
protected DateFormat getThreadLocalDateFormat() {
return fmtThreadLocal.get();
}
protected String formatDate(Date d) {
return getThreadLocalDateFormat().format(d);
}
private static ThreadLocalDateFormat fmtThreadLocal
= new ThreadLocalDateFormat();
private static class ThreadLocalDateFormat extends ThreadLocal<DateFormat> {
DateFormat proto;
public ThreadLocalDateFormat() {
super();
SimpleDateFormat tmp =
new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS", Locale.US);
tmp.setTimeZone(UTC);
proto = tmp;
}
protected DateFormat initialValue() {
return (DateFormat) proto.clone();
}
}
}