You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by us...@apache.org on 2015/07/20 11:07:51 UTC

svn commit: r1691893 - in /lucene/dev/trunk/solr: ./ contrib/analytics/src/java/org/apache/solr/analytics/accumulator/ contrib/analytics/src/java/org/apache/solr/analytics/accumulator/facet/ contrib/analytics/src/java/org/apache/solr/analytics/expressi...

Author: uschindler
Date: Mon Jul 20 09:07:50 2015
New Revision: 1691893

URL: http://svn.apache.org/r1691893
Log:
SOLR-7803: Prevent class loading deadlock in TrieDateField; refactor date formatting and parsing out of TrieDateField and move to static utility class DateFormatUtil

Added:
    lucene/dev/trunk/solr/core/src/java/org/apache/solr/util/DateFormatUtil.java   (with props)
Modified:
    lucene/dev/trunk/solr/CHANGES.txt
    lucene/dev/trunk/solr/contrib/analytics/src/java/org/apache/solr/analytics/accumulator/BasicAccumulator.java
    lucene/dev/trunk/solr/contrib/analytics/src/java/org/apache/solr/analytics/accumulator/FacetingAccumulator.java
    lucene/dev/trunk/solr/contrib/analytics/src/java/org/apache/solr/analytics/accumulator/facet/FieldFacetAccumulator.java
    lucene/dev/trunk/solr/contrib/analytics/src/java/org/apache/solr/analytics/expression/ExpressionFactory.java
    lucene/dev/trunk/solr/contrib/analytics/src/java/org/apache/solr/analytics/statistics/StatsCollectorSupplierFactory.java
    lucene/dev/trunk/solr/contrib/analytics/src/java/org/apache/solr/analytics/util/AnalyticsParsers.java
    lucene/dev/trunk/solr/contrib/analytics/src/java/org/apache/solr/analytics/util/RangeEndpointCalculator.java
    lucene/dev/trunk/solr/contrib/analytics/src/java/org/apache/solr/analytics/util/valuesource/ConstDateSource.java
    lucene/dev/trunk/solr/contrib/analytics/src/java/org/apache/solr/analytics/util/valuesource/DateFieldSource.java
    lucene/dev/trunk/solr/contrib/analytics/src/java/org/apache/solr/analytics/util/valuesource/FilterFieldSource.java
    lucene/dev/trunk/solr/contrib/analytics/src/test/org/apache/solr/analytics/expression/ExpressionTest.java
    lucene/dev/trunk/solr/core/src/java/org/apache/solr/core/SolrDeletionPolicy.java
    lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/CdcrReplicatorState.java
    lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/PingRequestHandler.java
    lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/component/DateFacetProcessor.java
    lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/component/PivotFacetValue.java
    lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/component/RangeFacetRequest.java
    lucene/dev/trunk/solr/core/src/java/org/apache/solr/response/TextResponseWriter.java
    lucene/dev/trunk/solr/core/src/java/org/apache/solr/schema/DateRangeField.java
    lucene/dev/trunk/solr/core/src/java/org/apache/solr/schema/TrieDateField.java
    lucene/dev/trunk/solr/core/src/java/org/apache/solr/schema/TrieField.java
    lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/ValueSourceParser.java
    lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/facet/FacetRange.java
    lucene/dev/trunk/solr/core/src/java/org/apache/solr/update/processor/DocExpirationUpdateProcessorFactory.java
    lucene/dev/trunk/solr/core/src/test/org/apache/solr/TestTrie.java
    lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/TestCloudPivotFacet.java
    lucene/dev/trunk/solr/core/src/test/org/apache/solr/request/SimpleFacetsTest.java
    lucene/dev/trunk/solr/core/src/test/org/apache/solr/schema/DateFieldTest.java
    lucene/dev/trunk/solr/core/src/test/org/apache/solr/update/processor/AtomicUpdatesTest.java
    lucene/dev/trunk/solr/test-framework/src/java/org/apache/solr/BaseDistributedSearchTestCase.java
    lucene/dev/trunk/solr/test-framework/src/java/org/apache/solr/SolrTestCaseJ4.java

Modified: lucene/dev/trunk/solr/CHANGES.txt
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/CHANGES.txt?rev=1691893&r1=1691892&r2=1691893&view=diff
==============================================================================
--- lucene/dev/trunk/solr/CHANGES.txt (original)
+++ lucene/dev/trunk/solr/CHANGES.txt Mon Jul 20 09:07:50 2015
@@ -339,6 +339,10 @@ Other Changes
 
 * SOLR-7805: Update Kite Morphlines to 1.1.0 (Mark Miller)
 
+* SOLR-7803: Prevent class loading deadlock in TrieDateField; refactor date
+  formatting and parsing out of TrieDateField and move to static utility class
+  DateFormatUtil.  (Markus Heiden, Uwe Schindler)
+
 ==================  5.2.1 ==================
 
 Consult the LUCENE_CHANGES.txt file for additional, low level, changes in this release

Modified: lucene/dev/trunk/solr/contrib/analytics/src/java/org/apache/solr/analytics/accumulator/BasicAccumulator.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/contrib/analytics/src/java/org/apache/solr/analytics/accumulator/BasicAccumulator.java?rev=1691893&r1=1691892&r2=1691893&view=diff
==============================================================================
--- lucene/dev/trunk/solr/contrib/analytics/src/java/org/apache/solr/analytics/accumulator/BasicAccumulator.java (original)
+++ lucene/dev/trunk/solr/contrib/analytics/src/java/org/apache/solr/analytics/accumulator/BasicAccumulator.java Mon Jul 20 09:07:50 2015
@@ -34,9 +34,9 @@ import org.apache.solr.analytics.statist
 import org.apache.solr.common.SolrException;
 import org.apache.solr.common.SolrException.ErrorCode;
 import org.apache.solr.common.util.NamedList;
-import org.apache.solr.schema.TrieDateField;
 import org.apache.solr.search.DocSet;
 import org.apache.solr.search.SolrIndexSearcher;
+import org.apache.solr.util.DateFormatUtil;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -143,7 +143,7 @@ public class BasicAccumulator extends Va
       if (expressionName.equals(expressionNames[count])) {
         Comparable value = expressions[count].getValue();
         if (value.getClass().equals(Date.class)) {
-          return TrieDateField.formatExternal((Date)value);
+          return DateFormatUtil.formatExternal((Date)value);
         } else {
           return value.toString();
         }

Modified: lucene/dev/trunk/solr/contrib/analytics/src/java/org/apache/solr/analytics/accumulator/FacetingAccumulator.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/contrib/analytics/src/java/org/apache/solr/analytics/accumulator/FacetingAccumulator.java?rev=1691893&r1=1691892&r2=1691893&view=diff
==============================================================================
--- lucene/dev/trunk/solr/contrib/analytics/src/java/org/apache/solr/analytics/accumulator/FacetingAccumulator.java (original)
+++ lucene/dev/trunk/solr/contrib/analytics/src/java/org/apache/solr/analytics/accumulator/FacetingAccumulator.java Mon Jul 20 09:07:50 2015
@@ -57,11 +57,11 @@ import org.apache.solr.common.SolrExcept
 import org.apache.solr.common.util.NamedList;
 import org.apache.solr.request.SolrQueryRequest;
 import org.apache.solr.schema.SchemaField;
-import org.apache.solr.schema.TrieDateField;
 import org.apache.solr.search.DocSet;
 import org.apache.solr.search.QParser;
 import org.apache.solr.search.SolrIndexSearcher;
 import org.apache.solr.search.SyntaxError;
+import org.apache.solr.util.DateFormatUtil;
 
 import com.google.common.collect.Iterables;
 
@@ -377,7 +377,7 @@ public class FacetingAccumulator extends
         if (expressionName.equals(expressionNames[count])) {
           Comparable value = facetExpressions[count].getValue();
           if (value.getClass().equals(Date.class)) {
-            return TrieDateField.formatExternal((Date)value);
+            return DateFormatUtil.formatExternal((Date)value);
           } else {
             return value.toString();
           }
@@ -431,7 +431,7 @@ public class FacetingAccumulator extends
         if (expressionName.equals(expressionNames[count])) {
           Comparable value = facetExpressions[count].getValue();
           if (value.getClass().equals(Date.class)) {
-            return TrieDateField.formatExternal((Date)value);
+            return DateFormatUtil.formatExternal((Date)value);
           } else {
             return value.toString();
           }

Modified: lucene/dev/trunk/solr/contrib/analytics/src/java/org/apache/solr/analytics/accumulator/facet/FieldFacetAccumulator.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/contrib/analytics/src/java/org/apache/solr/analytics/accumulator/facet/FieldFacetAccumulator.java?rev=1691893&r1=1691892&r2=1691893&view=diff
==============================================================================
--- lucene/dev/trunk/solr/contrib/analytics/src/java/org/apache/solr/analytics/accumulator/facet/FieldFacetAccumulator.java (original)
+++ lucene/dev/trunk/solr/contrib/analytics/src/java/org/apache/solr/analytics/accumulator/facet/FieldFacetAccumulator.java Mon Jul 20 09:07:50 2015
@@ -33,8 +33,8 @@ import org.apache.solr.analytics.util.An
 import org.apache.solr.common.SolrException;
 import org.apache.solr.common.SolrException.ErrorCode;
 import org.apache.solr.common.util.NamedList;
+import org.apache.solr.schema.DateValueFieldType;
 import org.apache.solr.schema.SchemaField;
-import org.apache.solr.schema.TrieDateField;
 import org.apache.solr.search.SolrIndexSearcher;
 
 /**
@@ -67,7 +67,7 @@ public class FieldFacetAccumulator exten
     }
     this.multiValued = schemaField.multiValued();
     this.numField = schemaField.getType().getNumericType()!=null;
-    this.dateField = schemaField.getType().getClass().equals(TrieDateField.class);
+    this.dateField = schemaField.getType() instanceof DateValueFieldType;
     this.parent = parent;  
     this.parser = AnalyticsParsers.getParser(schemaField.getType().getClass());
   }

Modified: lucene/dev/trunk/solr/contrib/analytics/src/java/org/apache/solr/analytics/expression/ExpressionFactory.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/contrib/analytics/src/java/org/apache/solr/analytics/expression/ExpressionFactory.java?rev=1691893&r1=1691892&r2=1691893&view=diff
==============================================================================
--- lucene/dev/trunk/solr/contrib/analytics/src/java/org/apache/solr/analytics/expression/ExpressionFactory.java (original)
+++ lucene/dev/trunk/solr/contrib/analytics/src/java/org/apache/solr/analytics/expression/ExpressionFactory.java Mon Jul 20 09:07:50 2015
@@ -25,7 +25,7 @@ import org.apache.solr.analytics.statist
 import org.apache.solr.analytics.util.AnalyticsParams;
 import org.apache.solr.common.SolrException;
 import org.apache.solr.common.SolrException.ErrorCode;
-import org.apache.solr.schema.TrieDateField;
+import org.apache.solr.util.DateFormatUtil;
 
 public class ExpressionFactory {
 
@@ -83,7 +83,7 @@ public class ExpressionFactory {
       }
     } else if (topOperation.equals(AnalyticsParams.CONSTANT_DATE)) {
       try {
-        return new ConstantDateExpression(TrieDateField.parseDate(operands));
+        return new ConstantDateExpression(DateFormatUtil.parseDate(operands));
       } catch (ParseException e) {
         throw new SolrException(ErrorCode.BAD_REQUEST, "The constant "+operands+" cannot be converted into a date.",e);
       }

Modified: lucene/dev/trunk/solr/contrib/analytics/src/java/org/apache/solr/analytics/statistics/StatsCollectorSupplierFactory.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/contrib/analytics/src/java/org/apache/solr/analytics/statistics/StatsCollectorSupplierFactory.java?rev=1691893&r1=1691892&r2=1691893&view=diff
==============================================================================
--- lucene/dev/trunk/solr/contrib/analytics/src/java/org/apache/solr/analytics/statistics/StatsCollectorSupplierFactory.java (original)
+++ lucene/dev/trunk/solr/contrib/analytics/src/java/org/apache/solr/analytics/statistics/StatsCollectorSupplierFactory.java Mon Jul 20 09:07:50 2015
@@ -67,6 +67,7 @@ import org.apache.solr.schema.TrieDouble
 import org.apache.solr.schema.TrieFloatField;
 import org.apache.solr.schema.TrieIntField;
 import org.apache.solr.schema.TrieLongField;
+import org.apache.solr.util.DateFormatUtil;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -443,7 +444,7 @@ public class StatsCollectorSupplierFacto
       }
     } else if ( src instanceof DateFieldSource || src instanceof MultiDateFunction) {
       try {
-        defaultObject = TrieDateField.parseDate(arguments[1]);
+        defaultObject = DateFormatUtil.parseDate(arguments[1]);
       } catch (ParseException e) {
         throw new SolrException(ErrorCode.BAD_REQUEST,"The filter value "+arguments[1]+" cannot be converted into a date.",e);
       }
@@ -578,7 +579,7 @@ public class StatsCollectorSupplierFacto
         throw new SolrException(ErrorCode.BAD_REQUEST,"The constant date declaration ["+expressionString+"] does not have exactly 1 argument.");
       }
       try {
-        return new ConstDateSource(TrieDateField.parseDate(operands));
+        return new ConstDateSource(DateFormatUtil.parseDate(operands));
       } catch (ParseException e) {
         throw new SolrException(ErrorCode.BAD_REQUEST,"The constant "+operands+" cannot be converted into a date.",e);
       }

Modified: lucene/dev/trunk/solr/contrib/analytics/src/java/org/apache/solr/analytics/util/AnalyticsParsers.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/contrib/analytics/src/java/org/apache/solr/analytics/util/AnalyticsParsers.java?rev=1691893&r1=1691892&r2=1691893&view=diff
==============================================================================
--- lucene/dev/trunk/solr/contrib/analytics/src/java/org/apache/solr/analytics/util/AnalyticsParsers.java (original)
+++ lucene/dev/trunk/solr/contrib/analytics/src/java/org/apache/solr/analytics/util/AnalyticsParsers.java Mon Jul 20 09:07:50 2015
@@ -29,6 +29,7 @@ import org.apache.solr.schema.TrieDouble
 import org.apache.solr.schema.TrieFloatField;
 import org.apache.solr.schema.TrieIntField;
 import org.apache.solr.schema.TrieLongField;
+import org.apache.solr.util.DateFormatUtil;
 
 /** 
  * Class to hold the parsers used for Solr Analytics.
@@ -148,7 +149,7 @@ public class AnalyticsParsers {
     @SuppressWarnings("deprecation")
     public String parse(BytesRef bytes) throws IOException {
       try {
-        return TrieDateField.formatExternal(new Date(NumericUtils.prefixCodedToLong(bytes)));
+        return DateFormatUtil.formatExternal(new Date(NumericUtils.prefixCodedToLong(bytes)));
       } catch (NumberFormatException e) {
         throw new IOException("The byte array "+Arrays.toString(bytes.bytes)+" cannot be converted to a date.");
       }
@@ -156,7 +157,7 @@ public class AnalyticsParsers {
     @SuppressWarnings("deprecation")
     @Override
     public String parseNum(long l) {
-      return ""+TrieDateField.formatExternal(new Date(l));
+      return ""+DateFormatUtil.formatExternal(new Date(l));
     }
   };
   

Modified: lucene/dev/trunk/solr/contrib/analytics/src/java/org/apache/solr/analytics/util/RangeEndpointCalculator.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/contrib/analytics/src/java/org/apache/solr/analytics/util/RangeEndpointCalculator.java?rev=1691893&r1=1691892&r2=1691893&view=diff
==============================================================================
--- lucene/dev/trunk/solr/contrib/analytics/src/java/org/apache/solr/analytics/util/RangeEndpointCalculator.java (original)
+++ lucene/dev/trunk/solr/contrib/analytics/src/java/org/apache/solr/analytics/util/RangeEndpointCalculator.java Mon Jul 20 09:07:50 2015
@@ -32,6 +32,7 @@ import org.apache.solr.schema.SchemaFiel
 import org.apache.solr.schema.TrieDateField;
 import org.apache.solr.schema.TrieField;
 import org.apache.solr.util.DateMathParser;
+import org.apache.solr.util.DateFormatUtil;
 
 
 public abstract class RangeEndpointCalculator<T extends Comparable<T>> {
@@ -332,12 +333,12 @@ public abstract class RangeEndpointCalcu
     
     @Override
     public String formatValue(Date val) {
-      return ((TrieDateField)field.getType()).toExternal(val);
+      return DateFormatUtil.formatExternal(val);
     }
     
     @Override
     protected Date parseVal(String rawval) {
-      return ((TrieDateField)field.getType()).parseMath(now, rawval);
+      return DateFormatUtil.parseMath(now, rawval);
     }
     
     @Override

Modified: lucene/dev/trunk/solr/contrib/analytics/src/java/org/apache/solr/analytics/util/valuesource/ConstDateSource.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/contrib/analytics/src/java/org/apache/solr/analytics/util/valuesource/ConstDateSource.java?rev=1691893&r1=1691892&r2=1691893&view=diff
==============================================================================
--- lucene/dev/trunk/solr/contrib/analytics/src/java/org/apache/solr/analytics/util/valuesource/ConstDateSource.java (original)
+++ lucene/dev/trunk/solr/contrib/analytics/src/java/org/apache/solr/analytics/util/valuesource/ConstDateSource.java Mon Jul 20 09:07:50 2015
@@ -28,7 +28,7 @@ import org.apache.lucene.queries.functio
 import org.apache.lucene.util.mutable.MutableValue;
 import org.apache.lucene.util.mutable.MutableValueDate;
 import org.apache.solr.analytics.util.AnalyticsParams;
-import org.apache.solr.schema.TrieDateField;
+import org.apache.solr.util.DateFormatUtil;
 
 /**
  * <code>ConstDateSource</code> returns a constant date for all documents
@@ -47,7 +47,7 @@ public class ConstDateSource extends Con
   @SuppressWarnings("deprecation")
   @Override
   public String description() {
-    return name()+"(" + TrieDateField.formatExternal(new Date(getLong())) + ")";
+    return name()+"(" + DateFormatUtil.formatExternal(new Date(getLong())) + ")";
   }
 
   protected String name() {
@@ -84,7 +84,7 @@ public class ConstDateSource extends Con
       @SuppressWarnings("deprecation")
       @Override
       public String strVal(int doc) {
-        return TrieDateField.formatExternal(new Date(longVal(doc)));
+        return DateFormatUtil.formatExternal(new Date(longVal(doc)));
       }
       @Override
       public boolean boolVal(int doc) {

Modified: lucene/dev/trunk/solr/contrib/analytics/src/java/org/apache/solr/analytics/util/valuesource/DateFieldSource.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/contrib/analytics/src/java/org/apache/solr/analytics/util/valuesource/DateFieldSource.java?rev=1691893&r1=1691892&r2=1691893&view=diff
==============================================================================
--- lucene/dev/trunk/solr/contrib/analytics/src/java/org/apache/solr/analytics/util/valuesource/DateFieldSource.java (original)
+++ lucene/dev/trunk/solr/contrib/analytics/src/java/org/apache/solr/analytics/util/valuesource/DateFieldSource.java Mon Jul 20 09:07:50 2015
@@ -32,7 +32,7 @@ import org.apache.lucene.util.BytesRef;
 import org.apache.lucene.util.NumericUtils;
 import org.apache.lucene.util.mutable.MutableValue;
 import org.apache.lucene.util.mutable.MutableValueDate;
-import org.apache.solr.schema.TrieDateField;
+import org.apache.solr.util.DateFormatUtil;
 
 /**
  * Extends {@link LongFieldSource} to have a field source that takes in 
@@ -54,7 +54,7 @@ public class DateFieldSource extends Lon
 
   @SuppressWarnings("deprecation")
   public String longToString(long val) {
-    return TrieDateField.formatExternal((Date)longToObject(val));
+    return DateFormatUtil.formatExternal((Date)longToObject(val));
   }
 
   @Override

Modified: lucene/dev/trunk/solr/contrib/analytics/src/java/org/apache/solr/analytics/util/valuesource/FilterFieldSource.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/contrib/analytics/src/java/org/apache/solr/analytics/util/valuesource/FilterFieldSource.java?rev=1691893&r1=1691892&r2=1691893&view=diff
==============================================================================
--- lucene/dev/trunk/solr/contrib/analytics/src/java/org/apache/solr/analytics/util/valuesource/FilterFieldSource.java (original)
+++ lucene/dev/trunk/solr/contrib/analytics/src/java/org/apache/solr/analytics/util/valuesource/FilterFieldSource.java Mon Jul 20 09:07:50 2015
@@ -26,7 +26,7 @@ import org.apache.lucene.queries.functio
 import org.apache.lucene.queries.function.ValueSource;
 import org.apache.lucene.util.mutable.MutableValue;
 import org.apache.solr.analytics.util.AnalyticsParams;
-import org.apache.solr.schema.TrieDateField;
+import org.apache.solr.util.DateFormatUtil;
 
 /**
  * <code>DefaultIsMissingFieldSource</code> wraps a field source to return missing values 
@@ -50,7 +50,7 @@ public class FilterFieldSource extends V
   @Override
   public String description() {
     if (missValue.getClass().equals(Date.class)) {
-      return name()+"("+source.description()+","+TrieDateField.formatExternal((Date)missValue)+")";
+      return name()+"("+source.description()+","+DateFormatUtil.formatExternal((Date)missValue)+")";
     } else {
       return name()+"("+source.description()+","+missValue.toString()+")";
     }

Modified: lucene/dev/trunk/solr/contrib/analytics/src/test/org/apache/solr/analytics/expression/ExpressionTest.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/contrib/analytics/src/test/org/apache/solr/analytics/expression/ExpressionTest.java?rev=1691893&r1=1691892&r2=1691893&view=diff
==============================================================================
--- lucene/dev/trunk/solr/contrib/analytics/src/test/org/apache/solr/analytics/expression/ExpressionTest.java (original)
+++ lucene/dev/trunk/solr/contrib/analytics/src/test/org/apache/solr/analytics/expression/ExpressionTest.java Mon Jul 20 09:07:50 2015
@@ -23,8 +23,8 @@ import org.apache.lucene.util.IOUtils;
 import org.apache.solr.SolrTestCaseJ4;
 import org.apache.solr.analytics.AbstractAnalyticsStatsTest;
 import org.apache.solr.request.SolrQueryRequest;
-import org.apache.solr.schema.TrieDateField;
 import org.apache.solr.util.DateMathParser;
+import org.apache.solr.util.DateFormatUtil;
 import org.junit.BeforeClass;
 import org.junit.Test;
 
@@ -162,15 +162,15 @@ public class ExpressionTest extends Abst
   public void dateMathTest() throws Exception {
     String math = (String) getStatResult("dmr", "cme", VAL_TYPE.STRING);
     DateMathParser date = new DateMathParser();
-    date.setNow(TrieDateField.parseDate((String) getStatResult("dmr", "median", VAL_TYPE.DATE)));
+    date.setNow(DateFormatUtil.parseDate((String) getStatResult("dmr", "median", VAL_TYPE.DATE)));
     String dateMath = (String) getStatResult("dmr", "dmme", VAL_TYPE.DATE);
-    assertEquals(getRawResponse(), TrieDateField.parseDate(dateMath), date.parseMath(math));
+    assertEquals(getRawResponse(), DateFormatUtil.parseDate(dateMath), date.parseMath(math));
 
     math = (String) getStatResult("dmr", "cma", VAL_TYPE.STRING);
     date = new DateMathParser();
-    date.setNow(TrieDateField.parseDate((String) getStatResult("dmr", "max", VAL_TYPE.DATE)));
+    date.setNow(DateFormatUtil.parseDate((String) getStatResult("dmr", "max", VAL_TYPE.DATE)));
     dateMath = (String) getStatResult("dmr", "dmma", VAL_TYPE.DATE);
-    assertEquals(getRawResponse(), TrieDateField.parseDate(dateMath), date.parseMath(math));
+    assertEquals(getRawResponse(), DateFormatUtil.parseDate(dateMath), date.parseMath(math));
   }
 
   @Test

Modified: lucene/dev/trunk/solr/core/src/java/org/apache/solr/core/SolrDeletionPolicy.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/java/org/apache/solr/core/SolrDeletionPolicy.java?rev=1691893&r1=1691892&r2=1691893&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/java/org/apache/solr/core/SolrDeletionPolicy.java (original)
+++ lucene/dev/trunk/solr/core/src/java/org/apache/solr/core/SolrDeletionPolicy.java Mon Jul 20 09:07:50 2015
@@ -21,8 +21,8 @@ import org.apache.lucene.index.IndexDele
 import org.apache.lucene.store.Directory;
 import org.apache.lucene.store.FSDirectory;
 import org.apache.solr.common.util.NamedList;
-import org.apache.solr.schema.TrieDateField;
 import org.apache.solr.util.DateMathParser;
+import org.apache.solr.util.DateFormatUtil;
 import org.apache.solr.util.plugin.NamedListInitializedPlugin;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -174,7 +174,7 @@ public class SolrDeletionPolicy extends
         try {
           if (maxCommitAge != null) {
             if (maxCommitAgeTimeStamp==-1) {
-              DateMathParser dmp = new DateMathParser(TrieDateField.UTC, Locale.ROOT);
+              DateMathParser dmp = new DateMathParser(DateFormatUtil.UTC, Locale.ROOT);
               maxCommitAgeTimeStamp = dmp.parseMath(maxCommitAge).getTime();
             }
             if (IndexDeletionPolicyWrapper.getCommitTimestamp(commit) < maxCommitAgeTimeStamp) {

Modified: lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/CdcrReplicatorState.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/CdcrReplicatorState.java?rev=1691893&r1=1691892&r2=1691893&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/CdcrReplicatorState.java (original)
+++ lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/CdcrReplicatorState.java Mon Jul 20 09:07:50 2015
@@ -18,9 +18,9 @@ package org.apache.solr.handler;
  */
 
 import org.apache.solr.client.solrj.impl.CloudSolrClient;
-import org.apache.solr.schema.TrieDateField;
 import org.apache.solr.update.CdcrUpdateLog;
 import org.apache.solr.update.UpdateLog;
+import org.apache.solr.util.DateFormatUtil;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -133,7 +133,7 @@ class CdcrReplicatorState {
       Iterator<ErrorQueueEntry> it = errorsQueue.iterator();
       while (it.hasNext()) {
         ErrorQueueEntry entry = it.next();
-        lastErrors.add(new String[]{TrieDateField.formatExternal(new Date(entry.timestamp)), entry.type.toLower()});
+        lastErrors.add(new String[]{DateFormatUtil.formatExternal(new Date(entry.timestamp)), entry.type.toLower()});
       }
     }
     return lastErrors;
@@ -145,7 +145,7 @@ class CdcrReplicatorState {
   String getTimestampOfLastProcessedOperation() {
     if (logReader != null && logReader.getLastVersion() != -1) {
       // Shift back to the right by 20 bits the version number - See VersionInfo#getNewClock
-      return TrieDateField.formatExternal(new Date(logReader.getLastVersion() >> 20));
+      return DateFormatUtil.formatExternal(new Date(logReader.getLastVersion() >> 20));
     }
     return new String();
   }

Modified: lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/PingRequestHandler.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/PingRequestHandler.java?rev=1691893&r1=1691892&r2=1691893&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/PingRequestHandler.java (original)
+++ lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/PingRequestHandler.java Mon Jul 20 09:07:50 2015
@@ -29,14 +29,12 @@ import org.apache.solr.common.params.Mod
 import org.apache.solr.common.params.SolrParams;
 import org.apache.solr.common.util.NamedList;
 import org.apache.solr.core.SolrCore;
-import org.apache.solr.schema.TrieDateField;
+import org.apache.solr.util.DateFormatUtil;
 import org.apache.solr.util.plugin.SolrCoreAware;
 import org.apache.solr.request.SolrQueryRequest;
 import org.apache.solr.request.SolrRequestHandler;
 import org.apache.solr.response.SolrQueryResponse;
-
 import org.apache.commons.io.FileUtils;
-
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -275,7 +273,7 @@ public class PingRequestHandler extends
       try {
         // write out when the file was created
         FileUtils.write(healthcheck, 
-                        TrieDateField.formatExternal(new Date()), "UTF-8");
+                        DateFormatUtil.formatExternal(new Date()), "UTF-8");
       } catch (IOException e) {
         throw new SolrException(SolrException.ErrorCode.SERVER_ERROR, 
                                 "Unable to write healthcheck flag file", e);

Modified: lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/component/DateFacetProcessor.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/component/DateFacetProcessor.java?rev=1691893&r1=1691892&r2=1691893&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/component/DateFacetProcessor.java (original)
+++ lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/component/DateFacetProcessor.java Mon Jul 20 09:07:50 2015
@@ -30,12 +30,14 @@ import org.apache.solr.common.util.Named
 import org.apache.solr.common.util.SimpleOrderedMap;
 import org.apache.solr.request.SimpleFacets;
 import org.apache.solr.request.SolrQueryRequest;
+import org.apache.solr.schema.FieldType;
 import org.apache.solr.schema.IndexSchema;
 import org.apache.solr.schema.SchemaField;
 import org.apache.solr.schema.TrieDateField;
 import org.apache.solr.search.DocSet;
 import org.apache.solr.search.SyntaxError;
 import org.apache.solr.util.DateMathParser;
+import org.apache.solr.util.DateFormatUtil;
 
 /**
  * Process date facets
@@ -78,12 +80,11 @@ public class DateFacetProcessor extends
           (SolrException.ErrorCode.BAD_REQUEST,
               "Can not date facet on a field which is not a TrieDateField: " + f);
     }
-    final TrieDateField ft = (TrieDateField) sf.getType();
     final String startS
         = required.getFieldParam(f, FacetParams.FACET_DATE_START);
     final Date start;
     try {
-      start = ft.parseMath(null, startS);
+      start = DateFormatUtil.parseMath(null, startS);
     } catch (SolrException e) {
       throw new SolrException
           (SolrException.ErrorCode.BAD_REQUEST,
@@ -93,7 +94,7 @@ public class DateFacetProcessor extends
         = required.getFieldParam(f, FacetParams.FACET_DATE_END);
     Date end; // not final, hardend may change this
     try {
-      end = ft.parseMath(null, endS);
+      end = DateFormatUtil.parseMath(null, endS);
     } catch (SolrException e) {
       throw new SolrException
           (SolrException.ErrorCode.BAD_REQUEST,
@@ -126,7 +127,7 @@ public class DateFacetProcessor extends
       Date low = start;
       while (low.before(end)) {
         dmp.setNow(low);
-        String label = ft.toExternal(low);
+        String label = DateFormatUtil.formatExternal(low);
 
         Date high = dmp.parseMath(gap);
         if (end.before(high)) {
@@ -246,7 +247,9 @@ public class DateFacetProcessor extends
   @Deprecated
   protected int rangeCount(ParsedParams parsed, SchemaField sf, Date low, Date high,
                            boolean iLow, boolean iHigh) throws IOException {
-    Query rangeQ = ((TrieDateField) (sf.getType())).getRangeQuery(null, sf, low, high, iLow, iHigh);
+    String lowStr = (low == null) ? null : DateFormatUtil.formatExternal(low);
+    String highStr = (high == null) ? null : DateFormatUtil.formatExternal(high);
+    Query rangeQ = sf.getType().getRangeQuery(null, sf, lowStr, highStr, iLow, iHigh);
     return searcher.numDocs(rangeQ, parsed.docs);
   }
 }

Modified: lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/component/PivotFacetValue.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/component/PivotFacetValue.java?rev=1691893&r1=1691892&r2=1691893&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/component/PivotFacetValue.java (original)
+++ lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/component/PivotFacetValue.java Mon Jul 20 09:07:50 2015
@@ -27,7 +27,7 @@ import java.util.Map;
 import org.apache.solr.common.params.FacetParams;
 import org.apache.solr.common.util.NamedList;
 import org.apache.solr.common.util.SimpleOrderedMap;
-import org.apache.solr.schema.TrieDateField;
+import org.apache.solr.util.DateFormatUtil;
 import org.apache.solr.util.PivotListEntry;
 
 /**
@@ -93,7 +93,7 @@ public class PivotFacetValue {
     if (null == value) {
       out.add(null);
     } else if (value instanceof Date) {
-      out.add(TrieDateField.formatExternal((Date) value));
+      out.add(DateFormatUtil.formatExternal((Date) value));
     } else {
       out.add(value.toString());
     }

Modified: lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/component/RangeFacetRequest.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/component/RangeFacetRequest.java?rev=1691893&r1=1691892&r2=1691893&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/component/RangeFacetRequest.java (original)
+++ lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/component/RangeFacetRequest.java Mon Jul 20 09:07:50 2015
@@ -39,6 +39,7 @@ import org.apache.solr.schema.SchemaFiel
 import org.apache.solr.schema.TrieDateField;
 import org.apache.solr.schema.TrieField;
 import org.apache.solr.util.DateMathParser;
+import org.apache.solr.util.DateFormatUtil;
 
 /**
  * Encapsulates a single facet.range request along with all its parameters. This class
@@ -707,12 +708,12 @@ public class RangeFacetRequest extends F
 
     @Override
     public String formatValue(Date val) {
-      return ((TrieDateField) field.getType()).toExternal(val);
+      return DateFormatUtil.formatExternal(val);
     }
 
     @Override
     protected Date parseVal(String rawval) {
-      return ((TrieDateField) field.getType()).parseMath(now, rawval);
+      return DateFormatUtil.parseMath(now, rawval);
     }
 
     @Override
@@ -743,7 +744,7 @@ public class RangeFacetRequest extends F
 
     @Override
     public String formatValue(Date val) {
-      return TrieDateField.formatExternal(val);
+      return DateFormatUtil.formatExternal(val);
     }
 
     @Override

Modified: lucene/dev/trunk/solr/core/src/java/org/apache/solr/response/TextResponseWriter.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/java/org/apache/solr/response/TextResponseWriter.java?rev=1691893&r1=1691892&r2=1691893&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/java/org/apache/solr/response/TextResponseWriter.java (original)
+++ lucene/dev/trunk/solr/core/src/java/org/apache/solr/response/TextResponseWriter.java Mon Jul 20 09:07:50 2015
@@ -30,7 +30,7 @@ import org.apache.solr.common.EnumFieldV
 import org.apache.solr.common.SolrDocument;
 import org.apache.solr.common.SolrDocumentList;
 import org.apache.solr.common.util.Base64;
-import org.apache.solr.schema.TrieDateField;
+import org.apache.solr.util.DateFormatUtil;
 import org.apache.solr.util.FastWriter;
 import org.apache.solr.common.util.NamedList;
 import org.apache.solr.request.SolrQueryRequest;
@@ -327,7 +327,7 @@ public abstract class TextResponseWriter
 
 
   public void writeDate(String name, Date val) throws IOException {
-    writeDate(name, TrieDateField.formatExternal(val));
+    writeDate(name, DateFormatUtil.formatExternal(val));
   }
   
 

Modified: lucene/dev/trunk/solr/core/src/java/org/apache/solr/schema/DateRangeField.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/java/org/apache/solr/schema/DateRangeField.java?rev=1691893&r1=1691892&r2=1691893&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/java/org/apache/solr/schema/DateRangeField.java (original)
+++ lucene/dev/trunk/solr/core/src/java/org/apache/solr/schema/DateRangeField.java Mon Jul 20 09:07:50 2015
@@ -24,6 +24,7 @@ import java.util.List;
 import java.util.Map;
 
 import com.spatial4j.core.shape.Shape;
+
 import org.apache.lucene.index.StorableField;
 import org.apache.lucene.search.Query;
 import org.apache.lucene.spatial.prefix.NumberRangePrefixTreeStrategy;
@@ -37,6 +38,7 @@ import org.apache.solr.common.params.Sol
 import org.apache.solr.request.SolrRequestInfo;
 import org.apache.solr.search.QParser;
 import org.apache.solr.search.SyntaxError;
+import org.apache.solr.util.DateFormatUtil;
 
 /**
  * A field for indexed dates and date ranges. It's mostly compatible with TrieDateField.
@@ -50,8 +52,6 @@ public class DateRangeField extends Abst
 
   private static final DateRangePrefixTree tree = DateRangePrefixTree.INSTANCE;
 
-  private static final TrieDateField trieDateField = new TrieDateField();//used for utility methods
-
   @Override
   protected void init(IndexSchema schema, Map<String, String> args) {
     super.init(schema, args);
@@ -76,7 +76,7 @@ public class DateRangeField extends Abst
       if (unitShape.getLevel() == tree.getMaxLevels()) {
         //fully precise date. We can be fully compatible with TrieDateField.
         Date date = tree.toCalendar(unitShape).getTime();
-        return TrieDateField.formatExternal(date);
+        return DateFormatUtil.formatExternal(date);
       }
     }
     return (shapeStr == null ? shape.toString() : shapeStr);//we don't normalize ranges here; should we?
@@ -101,7 +101,7 @@ public class DateRangeField extends Abst
     if (str.startsWith("NOW") || str.lastIndexOf('Z') >= 0) {
       //use Solr standard date format parsing rules.
       //TODO parse a Calendar instead of a Date, rounded according to DateMath syntax.
-      Date date = trieDateField.parseMath(null, str);
+      Date date = DateFormatUtil.parseMath(null, str);
       Calendar cal = tree.newCal();
       cal.setTime(date);
       return cal;
@@ -116,9 +116,9 @@ public class DateRangeField extends Abst
     }
   }
 
-  /** For easy compatibility with {@link TrieDateField#parseMath(Date, String)}. */
+  /** For easy compatibility with {@link DateFormatUtil#parseMath(Date, String)}. */
   public Date parseMath(Date now, String rawval) {
-    return trieDateField.parseMath(now, rawval);
+    return DateFormatUtil.parseMath(now, rawval);
   }
 
   @Override
@@ -128,7 +128,7 @@ public class DateRangeField extends Abst
       if (unitShape.getLevel() == tree.getMaxLevels()) {
         //fully precise date. We can be fully compatible with TrieDateField.
         Date date = tree.toCalendar(unitShape).getTime();
-        return TrieDateField.formatExternal(date);
+        return DateFormatUtil.formatExternal(date);
       }
     }
     return shape.toString();//range shape

Modified: lucene/dev/trunk/solr/core/src/java/org/apache/solr/schema/TrieDateField.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/java/org/apache/solr/schema/TrieDateField.java?rev=1691893&r1=1691892&r2=1691893&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/java/org/apache/solr/schema/TrieDateField.java (original)
+++ lucene/dev/trunk/solr/core/src/java/org/apache/solr/schema/TrieDateField.java Mon Jul 20 09:07:50 2015
@@ -17,27 +17,12 @@
 
 package org.apache.solr.schema;
 
-import org.apache.solr.common.SolrException;
-import org.apache.solr.common.util.DateUtil;
-import org.apache.solr.request.SolrQueryRequest;
-import org.apache.solr.search.QParser;
+import java.util.Date;
+
+import org.apache.lucene.index.StorableField;
 import org.apache.solr.update.processor.TimestampUpdateProcessorFactory; //jdoc
+import org.apache.solr.util.DateFormatUtil;
 import org.apache.solr.util.DateMathParser;
-import org.apache.lucene.index.StorableField;
-import org.apache.lucene.search.Query;
-import org.apache.lucene.search.NumericRangeQuery;
-
-import java.text.DateFormat;
-import java.text.DecimalFormat;
-import java.text.DecimalFormatSymbols;
-import java.text.FieldPosition;
-import java.text.NumberFormat;
-import java.text.ParseException;
-import java.text.ParsePosition;
-import java.text.SimpleDateFormat;
-import java.util.Locale;
-import java.util.Date;
-import java.util.TimeZone;
 
 /**
  * FieldType that can represent any Date/Time with millisecond precision.
@@ -101,257 +86,19 @@ import java.util.TimeZone;
  */
 public class TrieDateField extends TrieField implements DateValueFieldType {
   {
-    type = TrieTypes.DATE;
+    this.type = TrieTypes.DATE;
   }
   
-  public static final TimeZone UTC = TimeZone.getTimeZone("UTC");
-
-  /**
-   * Fixed TimeZone (UTC) needed for parsing/formatting Dates in the
-   * canonical representation.
-   */
-  protected static final TimeZone CANONICAL_TZ = UTC;
-  /**
-   * Fixed Locale needed for parsing/formatting Milliseconds in the
-   * canonical representation.
-   */
-  protected static final Locale CANONICAL_LOCALE = Locale.ROOT;
-
-  protected static final String NOW = "NOW";
-  protected static final char Z = 'Z';
-
-
-  /**
-   * Parses a String which may be a date (in the standard format)
-   * followed by an optional math expression.
-   * @param now an optional fixed date to use as "NOW" in the DateMathParser
-   * @param val the string to parse
-   */
-  public Date parseMath(Date now, String val) {
-    String math = null;
-    final DateMathParser p = new DateMathParser();
-
-    if (null != now) p.setNow(now);
-
-    if (val.startsWith(NOW)) {
-      math = val.substring(NOW.length());
-    } else {
-      final int zz = val.indexOf(Z);
-      if (0 < zz) {
-        math = val.substring(zz+1);
-        try {
-          // p.setNow(toObject(val.substring(0,zz)));
-          p.setNow(parseDate(val.substring(0,zz+1)));
-        } catch (ParseException e) {
-          throw new SolrException(SolrException.ErrorCode.BAD_REQUEST,
-                                  "Invalid Date in Date Math String:'" + val + '\'', e);
-        }
-      } else {
-        throw new SolrException(SolrException.ErrorCode.BAD_REQUEST,
-                                "Invalid Date String:'" +val+'\'');
-      }
-    }
-
-    if (null == math || math.equals("")) {
-      return p.getNow();
-    }
-
-    try {
-      return p.parseMath(math);
-    } catch (ParseException e) {
-      throw new SolrException(SolrException.ErrorCode.BAD_REQUEST,
-                              "Invalid Date Math String:'" +val+'\'',e);
-    }
-  }
-
-  /**
-   * Thread safe method that can be used by subclasses to format a Date
-   * without the trailing 'Z'.
-   */
-  protected String formatDate(Date d) {
-    return fmtThreadLocal.get().format(d);
-  }
-
-  /**
-   * Return the standard human readable form of the date
-   */
-  public static String formatExternal(Date d) {
-    return fmtThreadLocal.get().format(d) + Z;
-  }
-
-  /**
-   * @see #formatExternal
-   */
-  public String toExternal(Date d) {
-    return formatExternal(d);
-  }
-
-  /**
-   * Thread safe method that can be used by subclasses to parse a Date
-   * without the trailing 'Z'
-   */
-  public static Date parseDate(String s) throws ParseException {
-    return fmtThreadLocal.get().parse(s);
-  }
-
-  /** Parse a date string in the standard format, or any supported by DateUtil.parseDate */
-  public Date parseDateLenient(String s, SolrQueryRequest req) throws ParseException {
-    // request could define timezone in the future
-    try {
-      return fmtThreadLocal.get().parse(s);
-    } catch (Exception e) {
-      return DateUtil.parseDate(s);
-    }
-  }
-
-  /**
-   * Parses a String which may be a date
-   * followed by an optional math expression.
-   * @param now an optional fixed date to use as "NOW" in the DateMathParser
-   * @param val the string to parse
-   */
-  public Date parseMathLenient(Date now, String val, SolrQueryRequest req) {
-    String math = null;
-    final DateMathParser p = new DateMathParser();
-
-    if (null != now) p.setNow(now);
-
-    if (val.startsWith(NOW)) {
-      math = val.substring(NOW.length());
-    } else {
-      final int zz = val.indexOf(Z);
-      if (0 < zz) {
-        math = val.substring(zz+1);
-        try {
-          // p.setNow(toObject(val.substring(0,zz)));
-          p.setNow(parseDateLenient(val.substring(0,zz+1), req));
-        } catch (ParseException e) {
-          throw new SolrException(SolrException.ErrorCode.BAD_REQUEST,
-                                  "Invalid Date in Date Math String: '" + val + '\'', e);
-        }
-      } else {
-        throw new SolrException(SolrException.ErrorCode.BAD_REQUEST,
-                                "Invalid Date String: '" +val+'\'');
-      }
-    }
-
-    if (null == math || math.equals("")) {
-      return p.getNow();
-    }
-
-    try {
-      return p.parseMath(math);
-    } catch (ParseException e) {
-      throw new SolrException(SolrException.ErrorCode.BAD_REQUEST,
-                              "Invalid Date Math String: '" +val+'\'',e);
-    }
-  }
-
-  /**
-   * Thread safe DateFormat that can <b>format</b> in the canonical
-   * ISO8601 date format, not including the trailing "Z" (since it is
-   * left off in the internal indexed values)
-   */
-  private final static ThreadLocalDateFormat fmtThreadLocal
-      = new ThreadLocalDateFormat(new ISO8601CanonicalDateFormat());
-
-  private static class ISO8601CanonicalDateFormat extends SimpleDateFormat {
-
-    protected NumberFormat millisParser
-        = NumberFormat.getIntegerInstance(CANONICAL_LOCALE);
-
-    protected NumberFormat millisFormat = new DecimalFormat
-        (".###", new DecimalFormatSymbols(CANONICAL_LOCALE));
-
-    public ISO8601CanonicalDateFormat() {
-      super("yyyy-MM-dd'T'HH:mm:ss", CANONICAL_LOCALE);
-      this.setTimeZone(CANONICAL_TZ);
-    }
-
-    @Override
-    public Date parse(String i, ParsePosition p) {
-      /* delegate to SimpleDateFormat for easy stuff */
-      Date d = super.parse(i, p);
-      int milliIndex = p.getIndex();
-      /* worry about the milliseconds ourselves */
-      if (null != d &&
-          -1 == p.getErrorIndex() &&
-          milliIndex + 1 < i.length() &&
-          '.' == i.charAt(milliIndex)) {
-        p.setIndex(++milliIndex); // NOTE: ++ to chomp '.'
-        Number millis = millisParser.parse(i, p);
-        if (-1 == p.getErrorIndex()) {
-          int endIndex = p.getIndex();
-          d = new Date(d.getTime()
-              + (long)(millis.doubleValue() * Math.pow(10, (3 - endIndex + milliIndex))));
-        }
-      }
-      return d;
-    }
-
-    @Override
-    public StringBuffer format(Date d, StringBuffer toAppendTo, FieldPosition pos) {
-      /* delegate to SimpleDateFormat for easy stuff */
-      super.format(d, toAppendTo, pos);
-      /* worry about the milliseconds ourselves */
-      long millis = d.getTime() % 1000l;
-      if (0L == millis) {
-        return toAppendTo;
-      }
-      if (millis < 0L) {
-        // original date was prior to epoch
-        millis += 1000L;
-      }
-      int posBegin = toAppendTo.length();
-      toAppendTo.append(millisFormat.format(millis / 1000d));
-      if (DateFormat.MILLISECOND_FIELD == pos.getField()) {
-        pos.setBeginIndex(posBegin);
-        pos.setEndIndex(toAppendTo.length());
-      }
-      return toAppendTo;
-    }
-
-    @Override
-    public DateFormat clone() {
-      ISO8601CanonicalDateFormat c = (ISO8601CanonicalDateFormat)super.clone();
-      c.millisParser = NumberFormat.getIntegerInstance(CANONICAL_LOCALE);
-      c.millisFormat = new DecimalFormat(".###", new DecimalFormatSymbols(CANONICAL_LOCALE));
-      return c;
-    }
-  }
-
-  private static class ThreadLocalDateFormat extends ThreadLocal<DateFormat> {
-    DateFormat proto;
-    public ThreadLocalDateFormat(DateFormat d) {
-      super();
-      proto = d;
-    }
-    @Override
-    protected DateFormat initialValue() {
-      return (DateFormat)proto.clone();
-    }
-  }
-
   @Override
   public Date toObject(StorableField f) {
     return (Date)super.toObject(f);
   }
 
-  /** TrieDateField specific range query */
-  public Query getRangeQuery(QParser parser, SchemaField sf, Date min, Date max, boolean minInclusive, boolean maxInclusive) {
-    return NumericRangeQuery.newLongRange(sf.getName(), precisionStep,
-              min == null ? null : min.getTime(),
-              max == null ? null : max.getTime(),
-              minInclusive, maxInclusive);
-  }
-
   @Override
   public Object toNativeType(Object val) {
-    if(val==null) return null;
-    if (val instanceof Date) return  val;
-
-    if (val instanceof String) return parseMath(null,(String)val);
-
+    if (val instanceof String) {
+      return DateFormatUtil.parseMath(null, (String)val);
+    }
     return super.toNativeType(val);
   }
 }

Modified: lucene/dev/trunk/solr/core/src/java/org/apache/solr/schema/TrieField.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/java/org/apache/solr/schema/TrieField.java?rev=1691893&r1=1691892&r2=1691893&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/java/org/apache/solr/schema/TrieField.java (original)
+++ lucene/dev/trunk/solr/core/src/java/org/apache/solr/schema/TrieField.java Mon Jul 20 09:07:50 2015
@@ -54,6 +54,7 @@ import org.apache.lucene.util.mutable.Mu
 import org.apache.solr.common.SolrException;
 import org.apache.solr.response.TextResponseWriter;
 import org.apache.solr.search.QParser;
+import org.apache.solr.util.DateFormatUtil;
 
 /**
  * Provides field types to support for Lucene's {@link
@@ -81,13 +82,6 @@ public class TrieField extends Primitive
   protected int precisionStepArg = TrieField.DEFAULT_PRECISION_STEP;  // the one passed in or defaulted
   protected int precisionStep;     // normalized
   protected TrieTypes type;
-  protected Object missingValue;
-
-  
-  /**
-   * Used for handling date types
-   */
-  static final TrieDateField dateField = new TrieDateField();
 
   @Override
   protected void init(IndexSchema schema, Map<String, String> args) {
@@ -304,7 +298,7 @@ public class TrieField extends Primitive
       return super.getRangeQuery(parser, field, min, max, minInclusive, maxInclusive);
     }
     int ps = precisionStep;
-    Query query = null;
+    Query query;
     final boolean matchOnly = field.hasDocValues() && !field.indexed();
     switch (type) {
       case INTEGER:
@@ -362,13 +356,13 @@ public class TrieField extends Primitive
       case DATE:
         if (matchOnly) {
           query = DocValuesRangeQuery.newLongRange(field.getName(),
-                min == null ? null : dateField.parseMath(null, min).getTime(),
-                max == null ? null : dateField.parseMath(null, max).getTime(),
+                min == null ? null : DateFormatUtil.parseMath(null, min).getTime(),
+                max == null ? null : DateFormatUtil.parseMath(null, max).getTime(),
                 minInclusive, maxInclusive);
         } else {
           query = NumericRangeQuery.newLongRange(field.getName(), ps,
-                min == null ? null : dateField.parseMath(null, min).getTime(),
-                max == null ? null : dateField.parseMath(null, max).getTime(),
+                min == null ? null : DateFormatUtil.parseMath(null, min).getTime(),
+                max == null ? null : DateFormatUtil.parseMath(null, max).getTime(),
                 minInclusive, maxInclusive);
         }
         break;
@@ -432,7 +426,7 @@ public class TrieField extends Primitive
           NumericUtils.longToPrefixCodedBytes(NumericUtils.doubleToSortableLong(Double.parseDouble(s)), 0, result);
           break;
         case DATE:
-          NumericUtils.longToPrefixCodedBytes(dateField.parseMath(null, s).getTime(), 0, result);
+          NumericUtils.longToPrefixCodedBytes(DateFormatUtil.parseMath(null, s).getTime(), 0, result);
           break;
         default:
           throw new SolrException(SolrException.ErrorCode.SERVER_ERROR, "Unknown type for trie field: " + type);
@@ -456,7 +450,7 @@ public class TrieField extends Primitive
   @Override
   public String toExternal(StorableField f) {
     return (type == TrieTypes.DATE)
-      ? dateField.toExternal((Date) toObject(f))
+      ? DateFormatUtil.formatExternal((Date) toObject(f))
       : toObject(f).toString();
   }
 
@@ -473,7 +467,7 @@ public class TrieField extends Primitive
       case DOUBLE:
         return Double.toString( NumericUtils.sortableLongToDouble(NumericUtils.prefixCodedToLong(indexedForm)) );
       case DATE:
-        return dateField.toExternal( new Date(NumericUtils.prefixCodedToLong(indexedForm)) );
+        return DateFormatUtil.formatExternal(new Date(NumericUtils.prefixCodedToLong(indexedForm)));
       default:
         throw new SolrException(SolrException.ErrorCode.SERVER_ERROR, "Unknown type for trie field: " + type);
     }
@@ -496,7 +490,7 @@ public class TrieField extends Primitive
         value = Double.toString( NumericUtils.sortableLongToDouble(NumericUtils.prefixCodedToLong(indexedForm)) );
         break;
       case DATE:
-        value = dateField.toExternal( new Date(NumericUtils.prefixCodedToLong(indexedForm)) );
+        value = DateFormatUtil.formatExternal(new Date(NumericUtils.prefixCodedToLong(indexedForm)));
         break;
       default:
         throw new SolrException(SolrException.ErrorCode.SERVER_ERROR, "Unknown type for trie field: " + type);
@@ -654,7 +648,7 @@ public class TrieField extends Primitive
       case DATE:
         Date date = (value instanceof Date)
           ? ((Date)value)
-          : dateField.parseMath(null, value.toString());
+          : DateFormatUtil.parseMath(null, value.toString());
         f = new org.apache.lucene.document.LongField(field.getName(), date.getTime(), ft);
         break;
       default:
@@ -759,12 +753,12 @@ class TrieDateFieldSource extends LongFi
 
   @Override
   public String longToString(long val) {
-    return TrieField.dateField.toExternal(longToObject(val));
+    return DateFormatUtil.formatExternal(longToObject(val));
   }
 
   @Override
   public long externalToLong(String extVal) {
-    return TrieField.dateField.parseMath(null, extVal).getTime();
+    return DateFormatUtil.parseMath(null, extVal).getTime();
   }
 
 }

Modified: lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/ValueSourceParser.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/ValueSourceParser.java?rev=1691893&r1=1691892&r2=1691893&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/ValueSourceParser.java (original)
+++ lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/ValueSourceParser.java Mon Jul 20 09:07:50 2015
@@ -54,6 +54,7 @@ import org.apache.solr.search.function.C
 import org.apache.solr.search.function.OrdFieldSource;
 import org.apache.solr.search.function.ReverseOrdFieldSource;
 import org.apache.solr.search.function.distance.*;
+import org.apache.solr.util.DateFormatUtil;
 import org.apache.solr.util.plugin.NamedListInitializedPlugin;
 
 import java.io.IOException;
@@ -974,8 +975,6 @@ public abstract class ValueSourceParser
 
 
 class DateValueSourceParser extends ValueSourceParser {
-  TrieDateField df = new TrieDateField();
-
   @Override
   public void init(NamedList args) {
   }
@@ -983,7 +982,7 @@ class DateValueSourceParser extends Valu
   public Date getDate(FunctionQParser fp, String arg) {
     if (arg == null) return null;
     if (arg.startsWith("NOW") || (arg.length() > 0 && Character.isDigit(arg.charAt(0)))) {
-      return df.parseMathLenient(null, arg, fp.req);
+      return DateFormatUtil.parseMathLenient(null, arg, fp.req);
     }
     return null;
   }

Modified: lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/facet/FacetRange.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/facet/FacetRange.java?rev=1691893&r1=1691892&r2=1691893&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/facet/FacetRange.java (original)
+++ lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/facet/FacetRange.java Mon Jul 20 09:07:50 2015
@@ -34,6 +34,7 @@ import org.apache.solr.schema.TrieDateFi
 import org.apache.solr.schema.TrieField;
 import org.apache.solr.search.DocSet;
 import org.apache.solr.util.DateMathParser;
+import org.apache.solr.util.DateFormatUtil;
 
 public class FacetRange extends FacetRequest {
   String field;
@@ -533,11 +534,11 @@ class FacetRangeProcessor extends FacetP
 
     @Override
     public String formatValue(Comparable val) {
-      return ((TrieDateField)field.getType()).toExternal( (Date)val );
+      return DateFormatUtil.formatExternal( (Date)val );
     }
     @Override
     protected Date parseStr(String rawval) {
-      return ((TrieDateField)field.getType()).parseMath(now, rawval);
+      return DateFormatUtil.parseMath(now, rawval);
     }
     @Override
     protected Object parseGap(final String rawval) {

Modified: lucene/dev/trunk/solr/core/src/java/org/apache/solr/update/processor/DocExpirationUpdateProcessorFactory.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/java/org/apache/solr/update/processor/DocExpirationUpdateProcessorFactory.java?rev=1691893&r1=1691892&r2=1691893&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/java/org/apache/solr/update/processor/DocExpirationUpdateProcessorFactory.java (original)
+++ lucene/dev/trunk/solr/core/src/java/org/apache/solr/update/processor/DocExpirationUpdateProcessorFactory.java Mon Jul 20 09:07:50 2015
@@ -20,12 +20,13 @@ package org.apache.solr.update.processor
 import java.io.IOException;
 
 import org.apache.solr.common.SolrException;
+
 import static org.apache.solr.common.SolrException.ErrorCode.*;
+
 import org.apache.solr.common.util.NamedList;
 import org.apache.solr.common.SolrInputDocument;
 import org.apache.solr.common.cloud.Replica;
 import org.apache.solr.common.cloud.Slice;
-
 import org.apache.solr.core.CloseHook;
 import org.apache.solr.core.SolrCore;
 import org.apache.solr.core.CoreContainer;
@@ -35,11 +36,11 @@ import org.apache.solr.request.SolrReque
 import org.apache.solr.request.SolrQueryRequest;
 import org.apache.solr.request.LocalSolrQueryRequest;
 import org.apache.solr.response.SolrQueryResponse;
-import org.apache.solr.schema.TrieDateField;
 import org.apache.solr.update.AddUpdateCommand;
 import org.apache.solr.update.CommitUpdateCommand;
 import org.apache.solr.update.DeleteUpdateCommand;
 import org.apache.solr.util.DateMathParser;
+import org.apache.solr.util.DateFormatUtil;
 import org.apache.solr.util.DefaultSolrThreadFactory;
 import org.apache.solr.util.plugin.SolrCoreAware;
 
@@ -402,7 +403,7 @@ public final class DocExpirationUpdatePr
           try {
             DeleteUpdateCommand del = new DeleteUpdateCommand(req);
             del.setQuery("{!cache=false}" + expireField + ":[* TO " +
-                         TrieDateField.formatExternal(SolrRequestInfo.getRequestInfo().getNOW())
+                         DateFormatUtil.formatExternal(SolrRequestInfo.getRequestInfo().getNOW())
                          + "]");
             proc.processDelete(del);
             

Added: lucene/dev/trunk/solr/core/src/java/org/apache/solr/util/DateFormatUtil.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/java/org/apache/solr/util/DateFormatUtil.java?rev=1691893&view=auto
==============================================================================
--- lucene/dev/trunk/solr/core/src/java/org/apache/solr/util/DateFormatUtil.java (added)
+++ lucene/dev/trunk/solr/core/src/java/org/apache/solr/util/DateFormatUtil.java Mon Jul 20 09:07:50 2015
@@ -0,0 +1,258 @@
+package org.apache.solr.util;
+
+/*
+ * 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.
+ */
+
+import java.text.DateFormat;
+import java.text.DecimalFormat;
+import java.text.DecimalFormatSymbols;
+import java.text.FieldPosition;
+import java.text.NumberFormat;
+import java.text.ParseException;
+import java.text.ParsePosition;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.Locale;
+import java.util.TimeZone;
+
+import org.apache.solr.common.SolrException;
+import org.apache.solr.common.util.DateUtil;
+import org.apache.solr.request.SolrQueryRequest;
+
+public final class DateFormatUtil {
+
+  public static final TimeZone UTC = TimeZone.getTimeZone("UTC");
+  /**
+   * Fixed TimeZone (UTC) needed for parsing/formatting Dates in the
+   * canonical representation.
+   */
+  public static final TimeZone CANONICAL_TZ = UTC;
+  /**
+   * Fixed Locale needed for parsing/formatting Milliseconds in the
+   * canonical representation.
+   */
+  public static final Locale CANONICAL_LOCALE = Locale.ROOT;
+  public static final String NOW = "NOW";
+  public static final char Z = 'Z';
+  /**
+   * Thread safe DateFormat that can <b>format</b> in the canonical
+   * ISO8601 date format, not including the trailing "Z" (since it is
+   * left off in the internal indexed values)
+   */
+  public final static ThreadLocalDateFormat FORMAT_THREAD_LOCAL
+      = new ThreadLocalDateFormat(new ISO8601CanonicalDateFormat());
+
+  private DateFormatUtil() {}
+
+  /**
+   * Parses a String which may be a date (in the standard format)
+   * followed by an optional math expression.
+   * @param now an optional fixed date to use as "NOW" in the DateMathParser
+   * @param val the string to parse
+   */
+  public static Date parseMath(Date now, String val) {
+    String math;
+    final DateMathParser p = new DateMathParser();
+  
+    if (null != now) p.setNow(now);
+  
+    if (val.startsWith(NOW)) {
+      math = val.substring(NOW.length());
+    } else {
+      final int zz = val.indexOf(Z);
+      if (0 < zz) {
+        math = val.substring(zz+1);
+        try {
+          // p.setNow(toObject(val.substring(0,zz)));
+          p.setNow(parseDate(val.substring(0,zz+1)));
+        } catch (ParseException e) {
+          throw new SolrException(SolrException.ErrorCode.BAD_REQUEST,
+                                  "Invalid Date in Date Math String:'" + val + '\'', e);
+        }
+      } else {
+        throw new SolrException(SolrException.ErrorCode.BAD_REQUEST,
+                                "Invalid Date String:'" +val+'\'');
+      }
+    }
+  
+    if (null == math || math.equals("")) {
+      return p.getNow();
+    }
+  
+    try {
+      return p.parseMath(math);
+    } catch (ParseException e) {
+      throw new SolrException(SolrException.ErrorCode.BAD_REQUEST,
+                              "Invalid Date Math String:'" +val+'\'',e);
+    }
+  }
+
+  /**
+   * Return the standard human readable form of the date (with trailing 'Z')
+   */
+  public static String formatExternal(Date d) {
+    return FORMAT_THREAD_LOCAL.get().format(d) + Z;
+  }
+
+  /**
+   * Return the standard human readable form of the date
+   */
+  public static String formatDate(Date d) {
+    return FORMAT_THREAD_LOCAL.get().format(d);
+  }
+
+  /**
+   * Thread safe method that can be used to parse a Date
+   * without the trailing 'Z'
+   */
+  public static Date parseDate(String s) throws ParseException {
+    return FORMAT_THREAD_LOCAL.get().parse(s);
+  }
+  
+  /** Parse a date string in the standard format, or any supported by DateUtil.parseDate */
+  public static Date parseDateLenient(String s, SolrQueryRequest req) throws ParseException {
+    // request could define timezone in the future
+    try {
+      return DateFormatUtil.FORMAT_THREAD_LOCAL.get().parse(s);
+    } catch (Exception e) {
+      return DateUtil.parseDate(s);
+    }
+  }
+
+  /**
+   * Parses a String which may be a date
+   * followed by an optional math expression.
+   * @param now an optional fixed date to use as "NOW" in the DateMathParser
+   * @param val the string to parse
+   */
+  public static Date parseMathLenient(Date now, String val, SolrQueryRequest req) {
+    String math;
+    final DateMathParser p = new DateMathParser();
+
+    if (null != now) p.setNow(now);
+
+    if (val.startsWith(DateFormatUtil.NOW)) {
+      math = val.substring(DateFormatUtil.NOW.length());
+    } else {
+      final int zz = val.indexOf(DateFormatUtil.Z);
+      if (0 < zz) {
+        math = val.substring(zz+1);
+        try {
+          // p.setNow(toObject(val.substring(0,zz)));
+          p.setNow(parseDateLenient(val.substring(0,zz+1), req));
+        } catch (ParseException e) {
+          throw new SolrException(SolrException.ErrorCode.BAD_REQUEST,
+                                  "Invalid Date in Date Math String: '" + val + '\'', e);
+        }
+      } else {
+        throw new SolrException(SolrException.ErrorCode.BAD_REQUEST,
+                                "Invalid Date String: '" +val+'\'');
+      }
+    }
+
+    if (null == math || math.equals("")) {
+      return p.getNow();
+    }
+
+    try {
+      return p.parseMath(math);
+    } catch (ParseException e) {
+      throw new SolrException(SolrException.ErrorCode.BAD_REQUEST,
+                              "Invalid Date Math String: '" +val+'\'',e);
+    }
+  }
+
+  @SuppressWarnings("serial")
+  static class ISO8601CanonicalDateFormat extends SimpleDateFormat {
+    
+    protected NumberFormat millisParser
+        = NumberFormat.getIntegerInstance(CANONICAL_LOCALE);
+  
+    protected NumberFormat millisFormat = new DecimalFormat
+        (".###", new DecimalFormatSymbols(CANONICAL_LOCALE));
+  
+    public ISO8601CanonicalDateFormat() {
+      super("yyyy-MM-dd'T'HH:mm:ss", CANONICAL_LOCALE);
+      this.setTimeZone(CANONICAL_TZ);
+    }
+  
+    @Override
+    public Date parse(String i, ParsePosition p) {
+      /* delegate to SimpleDateFormat for easy stuff */
+      Date d = super.parse(i, p);
+      int milliIndex = p.getIndex();
+      /* worry about the milliseconds ourselves */
+      if (null != d &&
+          -1 == p.getErrorIndex() &&
+          milliIndex + 1 < i.length() &&
+          '.' == i.charAt(milliIndex)) {
+        p.setIndex(++milliIndex); // NOTE: ++ to chomp '.'
+        Number millis = millisParser.parse(i, p);
+        if (-1 == p.getErrorIndex()) {
+          int endIndex = p.getIndex();
+          d = new Date(d.getTime()
+              + (long)(millis.doubleValue() * Math.pow(10, (3 - endIndex + milliIndex))));
+        }
+      }
+      return d;
+    }
+  
+    @Override
+    public StringBuffer format(Date d, StringBuffer toAppendTo, FieldPosition pos) {
+      /* delegate to SimpleDateFormat for easy stuff */
+      super.format(d, toAppendTo, pos);
+      /* worry about the milliseconds ourselves */
+      long millis = d.getTime() % 1000l;
+      if (0L == millis) {
+        return toAppendTo;
+      }
+      if (millis < 0L) {
+        // original date was prior to epoch
+        millis += 1000L;
+      }
+      int posBegin = toAppendTo.length();
+      toAppendTo.append(millisFormat.format(millis / 1000d));
+      if (DateFormat.MILLISECOND_FIELD == pos.getField()) {
+        pos.setBeginIndex(posBegin);
+        pos.setEndIndex(toAppendTo.length());
+      }
+      return toAppendTo;
+    }
+  
+    @Override
+    public DateFormat clone() {
+      ISO8601CanonicalDateFormat c = (ISO8601CanonicalDateFormat)super.clone();
+      c.millisParser = NumberFormat.getIntegerInstance(CANONICAL_LOCALE);
+      c.millisFormat = new DecimalFormat(".###", new DecimalFormatSymbols(CANONICAL_LOCALE));
+      return c;
+    }
+  }
+
+  public static class ThreadLocalDateFormat extends ThreadLocal<DateFormat> {
+    private final DateFormat proto;
+    
+    public ThreadLocalDateFormat(DateFormat d) {
+      super();
+      proto = d;
+    }
+    
+    @Override
+    protected DateFormat initialValue() {
+      return (DateFormat) proto.clone();
+    }
+  }
+}

Modified: lucene/dev/trunk/solr/core/src/test/org/apache/solr/TestTrie.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/test/org/apache/solr/TestTrie.java?rev=1691893&r1=1691892&r2=1691893&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/test/org/apache/solr/TestTrie.java (original)
+++ lucene/dev/trunk/solr/core/src/test/org/apache/solr/TestTrie.java Mon Jul 20 09:07:50 2015
@@ -18,9 +18,9 @@ package org.apache.solr;
 
 import org.apache.solr.request.SolrQueryRequest;
 import org.apache.solr.schema.FieldType;
-import org.apache.solr.schema.TrieDateField;
 import org.apache.solr.schema.TrieField;
 import org.apache.solr.util.DateMathParser;
+import org.apache.solr.util.DateFormatUtil;
 import org.junit.After;
 import org.junit.BeforeClass;
 import org.junit.Test;
@@ -173,7 +173,7 @@ public class TestTrie extends SolrTestCa
     format.setTimeZone(TimeZone.getTimeZone("UTC"));
 
     assertU(delQ("*:*"));
-    DateMathParser dmp = new DateMathParser(TrieDateField.UTC, Locale.ROOT);
+    DateMathParser dmp = new DateMathParser(DateFormatUtil.UTC, Locale.ROOT);
     String largestDate = "";
     for (int i = 0; i < 10; i++) {
       // index 10 days starting with today
@@ -222,7 +222,7 @@ public class TestTrie extends SolrTestCa
     // For tdate tests
     SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'", Locale.ROOT);
     format.setTimeZone(TimeZone.getTimeZone("UTC"));
-    DateMathParser dmp = new DateMathParser(TrieDateField.UTC, Locale.ROOT);
+    DateMathParser dmp = new DateMathParser(DateFormatUtil.UTC, Locale.ROOT);
 
     for (int i = 0; i < 10; i++) {
       long l = Integer.MAX_VALUE + i*1L;

Modified: lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/TestCloudPivotFacet.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/TestCloudPivotFacet.java?rev=1691893&r1=1691892&r2=1691893&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/TestCloudPivotFacet.java (original)
+++ lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/TestCloudPivotFacet.java Mon Jul 20 09:07:50 2015
@@ -29,7 +29,7 @@ import org.apache.solr.common.params.Mod
 import org.apache.solr.common.params.SolrParams;
 import org.apache.solr.common.params.StatsParams;
 import org.apache.solr.common.util.NamedList;
-import org.apache.solr.schema.TrieDateField;
+import org.apache.solr.util.DateFormatUtil;
 import org.junit.BeforeClass;
 import org.junit.Test;
 import org.slf4j.Logger;
@@ -468,7 +468,7 @@ public class TestCloudPivotFacet extends
     // otherwise, build up a term filter...
     String prefix = "{!term f=" + constraint.getField() + "}";
     if (value instanceof Date) {
-      return prefix + TrieDateField.formatExternal((Date)value);
+      return prefix + DateFormatUtil.formatExternal((Date)value);
     } else {
       return prefix + value;
     }

Modified: lucene/dev/trunk/solr/core/src/test/org/apache/solr/request/SimpleFacetsTest.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/test/org/apache/solr/request/SimpleFacetsTest.java?rev=1691893&r1=1691892&r2=1691893&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/test/org/apache/solr/request/SimpleFacetsTest.java (original)
+++ lucene/dev/trunk/solr/core/src/test/org/apache/solr/request/SimpleFacetsTest.java Mon Jul 20 09:07:50 2015
@@ -36,7 +36,7 @@ import org.apache.solr.common.params.Mod
 import org.apache.solr.common.util.NamedList;
 import org.apache.solr.response.SolrQueryResponse;
 import org.apache.solr.schema.SchemaField;
-import org.apache.solr.schema.TrieDateField;
+import org.apache.solr.util.DateFormatUtil;
 import org.apache.solr.util.TimeZoneUtils;
 import org.junit.BeforeClass;
 import org.junit.Test;
@@ -2992,8 +2992,8 @@ public class SimpleFacetsTest extends So
     }
     int gapNum = random().nextInt(100) + 1;
     
-    params.add(FacetParams.FACET_RANGE_START, TrieDateField.formatExternal(dates[0]));
-    params.add(FacetParams.FACET_RANGE_END, TrieDateField.formatExternal(dates[1]));
+    params.add(FacetParams.FACET_RANGE_START, DateFormatUtil.formatExternal(dates[0]));
+    params.add(FacetParams.FACET_RANGE_END, DateFormatUtil.formatExternal(dates[1]));
     params.add(FacetParams.FACET_RANGE_GAP, String.format(Locale.ROOT, "+%d%s", gapNum, gapUnit));
     addCommonRandomRangeParams(params);
     params.add(FacetParams.FACET_RANGE, field);

Modified: lucene/dev/trunk/solr/core/src/test/org/apache/solr/schema/DateFieldTest.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/test/org/apache/solr/schema/DateFieldTest.java?rev=1691893&r1=1691892&r2=1691893&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/test/org/apache/solr/schema/DateFieldTest.java (original)
+++ lucene/dev/trunk/solr/core/src/test/org/apache/solr/schema/DateFieldTest.java Mon Jul 20 09:07:50 2015
@@ -22,7 +22,7 @@ import org.apache.solr.SolrTestCaseJ4;
 import org.apache.solr.core.SolrConfig;
 import org.apache.solr.core.SolrResourceLoader;
 import org.apache.solr.util.DateMathParser;
-
+import org.apache.solr.util.DateFormatUtil;
 import org.junit.BeforeClass;
 import org.junit.Ignore;
 
@@ -34,7 +34,7 @@ import java.util.TimeZone;
 import java.util.Locale;
 
 public class DateFieldTest extends SolrTestCaseJ4 {
-  public static TimeZone UTC = TimeZone.getTimeZone("UTC");
+  public static TimeZone UTC = DateFormatUtil.UTC;
   private final String testInstanceDir = TEST_HOME() + File.separator + "collection1";
   private final String testConfHome = testInstanceDir + File.separator + "conf"+ File.separator;
   private TrieDateField f = null;
@@ -54,11 +54,11 @@ public class DateFieldTest extends SolrT
   }
 
   public void assertFormatParsed(String expected, String input) throws ParseException {
-    assertEquals("Input: " + input, expected, f.formatDate(f.parseMath(new Date(), input)));
+    assertEquals("Input: " + input, expected, DateFormatUtil.formatDate(DateFormatUtil.parseMath(new Date(), input)));
   }
   
   public void assertFormatDate(String expected, long input) {
-    assertEquals("Input: " + input, expected, f.formatDate(new Date(input)));
+    assertEquals("Input: " + input, expected, DateFormatUtil.formatDate(new Date(input)));
   }
 
   public void testToInternal() throws Exception {
@@ -77,7 +77,7 @@ public class DateFieldTest extends SolrT
     assertFormatParsed("1995-12-31T23:59:59", "1995-12-31T23:59:59.0Z");
 
     // kind of kludgy, but we have other tests for the actual date math
-    assertFormatParsed(f.formatDate(p.parseMath("/DAY")), "NOW/DAY");
+    assertFormatParsed(DateFormatUtil.formatDate(p.parseMath("/DAY")), "NOW/DAY");
 
     // as of Solr 1.3
     assertFormatParsed("1995-12-31T00:00:00", "1995-12-31T23:59:59Z/DAY");
@@ -94,7 +94,7 @@ public class DateFieldTest extends SolrT
     
   public void assertParseMath(long expected, String input) {
     Date d = new Date(0);
-    assertEquals("Input: "+input, expected, f.parseMath(d, input).getTime());
+    assertEquals("Input: "+input, expected, DateFormatUtil.parseMath(d, input).getTime());
   }
   
   // as of Solr1.3
@@ -171,12 +171,12 @@ public class DateFieldTest extends SolrT
   }
 
   protected void assertFormat(final String expected, final long millis) {
-    assertEquals(expected, f.formatDate(new Date(millis)));
+    assertEquals(expected, DateFormatUtil.formatDate(new Date(millis)));
   }
 
   protected void assertRoundTrip(String canonicalDate) throws Exception {
-    Date d = TrieDateField.parseDate(canonicalDate);
-    String result = TrieDateField.formatExternal(d);
+    Date d = DateFormatUtil.parseDate(canonicalDate);
+    String result = DateFormatUtil.formatExternal(d);
     assertEquals("d:" + d.getTime(), canonicalDate, result);
 
   }

Modified: lucene/dev/trunk/solr/core/src/test/org/apache/solr/update/processor/AtomicUpdatesTest.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/test/org/apache/solr/update/processor/AtomicUpdatesTest.java?rev=1691893&r1=1691892&r2=1691893&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/test/org/apache/solr/update/processor/AtomicUpdatesTest.java (original)
+++ lucene/dev/trunk/solr/core/src/test/org/apache/solr/update/processor/AtomicUpdatesTest.java Mon Jul 20 09:07:50 2015
@@ -7,6 +7,7 @@ import java.util.List;
 import org.apache.solr.SolrTestCaseJ4;
 import org.apache.solr.common.SolrInputDocument;
 import org.apache.solr.schema.TrieDateField;
+import org.apache.solr.util.DateFormatUtil;
 import org.junit.Before;
 import org.junit.BeforeClass;
 import org.junit.Ignore;
@@ -598,45 +599,45 @@ public class AtomicUpdatesTest extends S
     doc = new SolrInputDocument();
     doc.setField("id", "10001");
     TrieDateField trieDF = new TrieDateField();
-    Date tempDate = trieDF.parseMath(null, "2014-02-01T12:00:00Z");
-    doc.setField("dateRemove", new Date[]{trieDF.parseMath(null, "2014-02-01T12:00:00Z"), 
-        trieDF.parseMath(null, "2014-07-02T12:00:00Z"),
-        trieDF.parseMath(null, "2014-02-03T12:00:00Z"),
-        trieDF.parseMath(null, "2014-02-03T12:00:00Z"),
-        trieDF.parseMath(null, "2014-02-04T12:00:00Z")
+    Date tempDate = DateFormatUtil.parseMath(null, "2014-02-01T12:00:00Z");
+    doc.setField("dateRemove", new Date[]{DateFormatUtil.parseMath(null, "2014-02-01T12:00:00Z"), 
+        DateFormatUtil.parseMath(null, "2014-07-02T12:00:00Z"),
+        DateFormatUtil.parseMath(null, "2014-02-03T12:00:00Z"),
+        DateFormatUtil.parseMath(null, "2014-02-03T12:00:00Z"),
+        DateFormatUtil.parseMath(null, "2014-02-04T12:00:00Z")
         });
     assertU(adoc(doc));
 
     doc = new SolrInputDocument();
     doc.setField("id", "10002");
-    doc.setField("dateRemove", new Date[]{trieDF.parseMath(null, "2014-02-01T12:00:00Z"), 
-        trieDF.parseMath(null, "2014-07-02T12:00:00Z"),
-        trieDF.parseMath(null, "2014-02-02T12:00:00Z"),
-        trieDF.parseMath(null, "2014-02-03T12:00:00Z"),
-        trieDF.parseMath(null, "2014-02-04T12:00:00Z")
+    doc.setField("dateRemove", new Date[]{DateFormatUtil.parseMath(null, "2014-02-01T12:00:00Z"), 
+        DateFormatUtil.parseMath(null, "2014-07-02T12:00:00Z"),
+        DateFormatUtil.parseMath(null, "2014-02-02T12:00:00Z"),
+        DateFormatUtil.parseMath(null, "2014-02-03T12:00:00Z"),
+        DateFormatUtil.parseMath(null, "2014-02-04T12:00:00Z")
         });
     assertU(adoc(doc));
 
     doc = new SolrInputDocument();
     doc.setField("id", "10020");
-    doc.setField("dateRemove", new Date[]{trieDF.parseMath(null, "2014-02-01T12:00:00Z"), 
-        trieDF.parseMath(null, "2014-02-03T12:00:00Z"),
-        trieDF.parseMath(null, "2014-02-04T12:00:00Z")
+    doc.setField("dateRemove", new Date[]{DateFormatUtil.parseMath(null, "2014-02-01T12:00:00Z"), 
+        DateFormatUtil.parseMath(null, "2014-02-03T12:00:00Z"),
+        DateFormatUtil.parseMath(null, "2014-02-04T12:00:00Z")
         });
     assertU(adoc(doc));
 
     doc = new SolrInputDocument();
     doc.setField("id", "10021");
-    doc.setField("dateRemove", new Date[]{trieDF.parseMath(null, "2014-02-01T12:00:00Z"), 
-        trieDF.parseMath(null, "2014-02-02T12:00:00Z"),
-        trieDF.parseMath(null, "2014-02-04T12:00:00Z")
+    doc.setField("dateRemove", new Date[]{DateFormatUtil.parseMath(null, "2014-02-01T12:00:00Z"), 
+        DateFormatUtil.parseMath(null, "2014-02-02T12:00:00Z"),
+        DateFormatUtil.parseMath(null, "2014-02-04T12:00:00Z")
         });
     assertU(adoc(doc));
 
     assertU(commit());
 
     assertQ(req("q", "dateRemove:*", "indent", "true"), "//result[@numFound = '4']");
-    String dateString = trieDF.parseMath(null, "2014-02-02T12:00:00Z").toString();
+    String dateString = DateFormatUtil.parseMath(null, "2014-02-02T12:00:00Z").toString();
 //    assertQ(req("q", "dateRemove:"+URLEncoder.encode(dateString, "UTF-8"), "indent", "true"), "//result[@numFound = '3']");
 //    assertQ(req("q", "dateRemove:\"2014-09-02T12:00:00Z\"", "indent", "true"), "//result[@numFound = '3']");
 //    assertQ(req("q", "dateRemove:"+dateString, "indent", "true"), "//result[@numFound = '3']"); //Sun Feb 02 10:00:00 FNT 2014
@@ -646,8 +647,8 @@ public class AtomicUpdatesTest extends S
     doc = new SolrInputDocument();
     doc.setField("id", "10001");
     List<Date> removeList = new ArrayList<Date>();
-    removeList.add(trieDF.parseMath(null, "2014-09-02T12:00:00Z"));
-    removeList.add(trieDF.parseMath(null, "2014-09-03T12:00:00Z"));
+    removeList.add(DateFormatUtil.parseMath(null, "2014-09-02T12:00:00Z"));
+    removeList.add(DateFormatUtil.parseMath(null, "2014-09-03T12:00:00Z"));
 
     doc.setField("dateRemove", ImmutableMap.of("remove", removeList)); //behavior when hitting Solr through ZK
     assertU(adoc(doc));
@@ -659,8 +660,8 @@ public class AtomicUpdatesTest extends S
     doc = new SolrInputDocument();
     doc.setField("id", "10021");
     removeList = new ArrayList<Date>();
-    removeList.add(trieDF.parseMath(null, "2014-09-02T12:00:00Z"));
-    removeList.add(trieDF.parseMath(null, "2014-09-03T12:00:00Z"));
+    removeList.add(DateFormatUtil.parseMath(null, "2014-09-02T12:00:00Z"));
+    removeList.add(DateFormatUtil.parseMath(null, "2014-09-03T12:00:00Z"));
     doc.setField("dateRemove", ImmutableMap.of("remove", removeList)); //behavior when hitting Solr through ZK
     assertU(adoc(doc));
     assertU(commit());
@@ -670,7 +671,7 @@ public class AtomicUpdatesTest extends S
 
     doc = new SolrInputDocument();
     doc.setField("id", "10001");
-    doc.setField("dateRemove", ImmutableMap.of("remove", trieDF.parseMath(null, "2014-09-01T12:00:00Z"))); //behavior when hitting Solr directly
+    doc.setField("dateRemove", ImmutableMap.of("remove", DateFormatUtil.parseMath(null, "2014-09-01T12:00:00Z"))); //behavior when hitting Solr directly
 
     assertU(adoc(doc));
     assertU(commit());

Modified: lucene/dev/trunk/solr/test-framework/src/java/org/apache/solr/BaseDistributedSearchTestCase.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/test-framework/src/java/org/apache/solr/BaseDistributedSearchTestCase.java?rev=1691893&r1=1691892&r2=1691893&view=diff
==============================================================================
--- lucene/dev/trunk/solr/test-framework/src/java/org/apache/solr/BaseDistributedSearchTestCase.java (original)
+++ lucene/dev/trunk/solr/test-framework/src/java/org/apache/solr/BaseDistributedSearchTestCase.java Mon Jul 20 09:07:50 2015
@@ -18,6 +18,7 @@ package org.apache.solr;
  */
 
 import junit.framework.Assert;
+
 import org.apache.commons.io.FileUtils;
 import org.apache.lucene.util.Constants;
 import org.apache.lucene.util.TestUtil;
@@ -37,6 +38,7 @@ import org.apache.solr.common.params.Mod
 import org.apache.solr.common.params.SolrParams;
 import org.apache.solr.common.util.NamedList;
 import org.apache.solr.schema.TrieDateField;
+import org.apache.solr.util.DateFormatUtil;
 import org.eclipse.jetty.servlet.ServletHolder;
 import org.junit.AfterClass;
 import org.junit.BeforeClass;
@@ -48,6 +50,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import javax.servlet.Filter;
+
 import java.io.File;
 import java.io.IOException;
 import java.lang.annotation.ElementType;
@@ -1042,13 +1045,11 @@ public abstract class BaseDistributedSea
   }
 
   public static class RandDate extends RandVal {
-    public static TrieDateField df = new TrieDateField();
-
     @Override
     public Object val() {
       long v = r.nextLong();
       Date d = new Date(v);
-      return df.toExternal(d);
+      return DateFormatUtil.formatExternal(d);
     }
   }
   

Modified: lucene/dev/trunk/solr/test-framework/src/java/org/apache/solr/SolrTestCaseJ4.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/test-framework/src/java/org/apache/solr/SolrTestCaseJ4.java?rev=1691893&r1=1691892&r2=1691893&view=diff
==============================================================================
--- lucene/dev/trunk/solr/test-framework/src/java/org/apache/solr/SolrTestCaseJ4.java (original)
+++ lucene/dev/trunk/solr/test-framework/src/java/org/apache/solr/SolrTestCaseJ4.java Mon Jul 20 09:07:50 2015
@@ -93,10 +93,10 @@ import org.apache.solr.request.SolrQuery
 import org.apache.solr.request.SolrRequestHandler;
 import org.apache.solr.schema.IndexSchema;
 import org.apache.solr.schema.SchemaField;
-import org.apache.solr.schema.TrieDateField;
 import org.apache.solr.search.SolrIndexSearcher;
 import org.apache.solr.servlet.DirectSolrConnection;
 import org.apache.solr.util.AbstractSolrTestCase;
+import org.apache.solr.util.DateFormatUtil;
 import org.apache.solr.util.RevertDefaultThreadHandlerRule;
 import org.apache.solr.util.SSLTestConfig;
 import org.apache.solr.util.TestHarness;
@@ -2087,7 +2087,7 @@ public abstract class SolrTestCaseJ4 ext
    * @see #randomSkewedDate
    */
   public static String randomDate() {
-    return TrieDateField.formatExternal(new Date(random().nextLong()));
+    return DateFormatUtil.formatExternal(new Date(random().nextLong()));
   }
 
   /**