/**
 * 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.lucene.gdata.utils;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
import java.util.Stack;

/**
 * This class uses the {@link java.text.SimpleDateFormat} class to format dates
 * into strings according to given date pattern.
 * <p>
 * As the creation of <tt>SimpleDateFormat</tt> objects is quiet expensive and
 * formating dates is used quiet fequently the objects will be cached and reused
 * in subsequent calls.
 * </p>
 * <p>
 * This implementation is thread safe as it uses {@link java.util.Stack} as a
 * cache
 * </p>
 * 
 * @author Simon Willnauer
 * 
 */
public class DateFormater {
    private final Stack<SimpleDateFormat> objectStack = new Stack<SimpleDateFormat>();
    
    private static final DateFormater formater = new DateFormater();

    /**
     * Date format as it is used in Http Last modified header (Tue, 15 Nov 1994
     * 12:45:26 GMT)
     */
    public final static String HTTP_HEADER_DATE_FORMAT = "EEE, d MMM yyyy HH:mm:ss z";
    /**
     *  Date format as it is used in Http Last modified header (Tue, 15 Nov 1994
     * 12:45:26 +0000)
     */
    public final static String HTTP_HEADER_DATE_FORMAT_TIME_OFFSET = "EEE, d MMM yyyy HH:mm:ss Z";

    protected DateFormater() {
        super();
    }

    /**
     * Formats the given Date into the given date pattern.
     * 
     * @param date -
     *            the date to format
     * @param format -
     *            date pattern
     * @return - the string representation of the given <tt>Date</tt>
     *         according to the given pattern
     */
    public static String formatDate(final Date date, String format) {
        if (date == null || format == null)
            throw new IllegalArgumentException(
                    "given parameters must not be null");
        SimpleDateFormat inst = formater.getFormater();
        inst.applyPattern(format);
        try{
            return inst.format(date);
        }finally{
            formater.returnFomater(inst);
        }
    }
    /**
     * Parses the given string into one of the specified formates
     * @param date - the string to parse
     * @param formates - formates
     * @return a {@link Date} instance representing the given string
     * @throws ParseException - if the string can not be parsed
     */
    public static Date parseDate(final String date, final String...formates) throws ParseException{
        for (int i = 0; i < formates.length; i++) {
            try {
             return parseDate(date,formates[i]);
            } catch (ParseException e) {
                //
            }
        }
        throw new ParseException("Unparseable date: "+date,0);
        
    }
    
    /**
     * Parses the given string into the specified formate
     * @param dateString - the string to parse
     * @param pattern - the expected formate
     * @return a {@link Date} instance representing the given string
     * @throws ParseException - if the string can not be parsed
     */
    public static Date parseDate(final String dateString,String pattern) throws ParseException{
        if(dateString == null|| pattern == null)
            throw new IllegalArgumentException(
            "given parameters must not be null");
        
        SimpleDateFormat inst = formater.getFormater();
        try{
        inst.applyPattern(pattern);
        return inst.parse(dateString);
        }finally{
            formater.returnFomater(inst);
        }
        
    }

    protected SimpleDateFormat getFormater() {
        if (this.objectStack.empty())
            return new SimpleDateFormat(DateFormater.HTTP_HEADER_DATE_FORMAT,Locale.ENGLISH);
        return this.objectStack.pop();
    
    }

    protected void returnFomater(final SimpleDateFormat format) {
        if (this.objectStack.size() <= 25)
            this.objectStack.push(format);
        
    }

}

@@ -976,16 +976,43 @@
 l.Stack;
+%0Aimport java.util.TimeZone;
 %0A%0A/**%0A *
@@ -4437,16 +4437,18 @@
 empty())
+ %7B
 %0A       
@@ -4450,24 +4450,45 @@
         
-  return
+SimpleDateFormat dateFormat =
  new Sim
@@ -4538,16 +4538,17 @@
 _FORMAT,
+ 
 Locale.E
@@ -4554,24 +4554,124 @@
 ENGLISH);%0A  
+        dateFormat.setTimeZone(TimeZone.getTimeZone(%22GMT%22));%0A          return dateFormat;%0A        %7D%0A
       return

LUCENE-1005, apply GMT timeZone to the data formatter so it outputs properly formatted dates