/**
 * Copyright (C) 2009-2012 the original author or authors.
 * See the notice.md file distributed with this work for additional
 * information regarding copyright ownership.
 *
 * Licensed 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.fusesource.restygwt.client;


import org.fusesource.restygwt.client.dispatcher.DefaultDispatcher;

import com.google.gwt.core.client.GWT;
import com.google.gwt.i18n.shared.TimeZone;

/**
 * Provides ability to set the default date format and service root (defaults to
 * GWT.getModuleBaseURL()).
 *
 *
 * @author <a href="http://www.acuedo.com">Dave Finch</a>
 *
 */
public class Defaults {

    private static Dispatcher dispatcher = DefaultDispatcher.INSTANCE;

    private static String serviceRoot = GWT.getModuleBaseURL();
    private static String dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSZ";
    private static boolean dateFormatHasTimeZone = true;
    private static TimeZone timeZone = null;
    private static boolean ignoreJsonNulls = false;
    // patch TNY: timeout ms,
    // if >-1, used in Method class to set timeout
    private static int requestTimeout = -1;
    private static boolean byteArraysToBase64 = false;

    private static ExceptionMapper exceptionMapper = new ExceptionMapper();

    public static String getServiceRoot() {
        return serviceRoot;
    }

    /**
     * sets the URL prepended to the value of Path annotations.
     *
     * @param serviceRoot
     */
    public static void setServiceRoot(String serviceRoot) {
        // GWT.getModuleBaseURL() is guaranteed to end with a slash, so should any custom service root
        if (!serviceRoot.endsWith("/")) {
            serviceRoot += "/";
        }
        Defaults.serviceRoot = serviceRoot;
    }
    
    /**
     * Gets the format used when encoding and decoding Dates. Defaults to
     * {@code "yyyy-MM-dd'T'HH:mm:ss.SSSZ"}. If the date format is set to
     * {@code null}, dates will be encoded and decoded as timestamps
     * (the number of milliseconds since the Unix epoch, 1970-01-01). 
     * 
     * @return the date format string
     * @see com.google.gwt.i18n.shared.DateTimeFormat DateTimeFormat
     */
    public static String getDateFormat() {
        return dateFormat;
    }

    /**
     * Sets the format used when encoding and decoding Dates. If the date
     * format is set to {@code null}, dates will be encoded and decoded as
     * timestamps (the number of milliseconds since the Unix epoch,
     * 1970-01-01). 
     *
     * @param dateFormat the date format string
     * @see com.google.gwt.i18n.shared.DateTimeFormat DateTimeFormat
     */
    public static void setDateFormat(String dateFormat) {
        Defaults.dateFormat = dateFormat;
        dateFormatHasTimeZone = false;
        
        if (dateFormat != null) {
            for (int i = 0; i < dateFormat.length(); i++) {
                char ch = dateFormat.charAt(i);

                if (ch == 'Z' || ch == 'z' || ch == 'V' || ch == 'v') {
                    dateFormatHasTimeZone = true;
                    break;
                }
            }
        }
    }
    
    /* package */ static boolean dateFormatHasTimeZone() {
        return dateFormatHasTimeZone;
    }
    
    /**
     * Gets the timezone used when encoding and decoding Dates.
     * <p>
     * The timezone is only taken into consideration if the date format string
     * does not contain a timezone field. If the timezone is set to
     * {@code null}, the browser's default (local) timezone will be used.
     * 
     * @return the date format timezone (null for local timezone)
     */
    public static TimeZone getTimeZone() {
        return timeZone;
    }

    /**
     * Gets the timezone used when encoding and decoding Dates.
     * <p>
     * The timezone is only taken into consideration if the date format string
     * does not contain a timezone field. If the timezone is set to null, the
     * browser's default (local) timezone will be used.
     * 
     * @param timeZone the new timezone (use null for local timezone)
     */
    public static void setDateFormat(TimeZone timeZone) {
        Defaults.timeZone = timeZone;
    }

    /**
     * Indicates whether or not nulls will be ignored during JSON marshalling.
     */
    public static boolean doesIgnoreJsonNulls() {
        return ignoreJsonNulls;
    }

    public static void ignoreJsonNulls() {
        ignoreJsonNulls = true;
    }

    public static void dontIgnoreJsonNulls() {
        ignoreJsonNulls = false;
    }

    public static final int getRequestTimeout() {
        return requestTimeout;
    }

    public static final void setRequestTimeout(int requestTimeout) {
        Defaults.requestTimeout = requestTimeout;
    }

    /**
    * @return the byteArraysToBase64
    */
   public static boolean isByteArraysToBase64() {
       return byteArraysToBase64;
   }

   /**
    * @param byteArraysToBase64 the byteArraysToBase64 to set
    */
   public static void setByteArraysToBase64(boolean byteArraysToBase64) {
       Defaults.byteArraysToBase64 = byteArraysToBase64;
   }

   /**
     * Sets the default dispatcher used by Method instances.
     *
     * @param value
     */
    public static void setDispatcher(Dispatcher value) {
        dispatcher = value;
    }

    /**
     * Returns the default dispatcher.
     *
     * @return
     */
    public static Dispatcher getDispatcher() {
        return dispatcher;
    }

    /**
     * Gets the default ExceptionMapper
     * @return
     */
    public static ExceptionMapper getExceptionMapper() {
        return exceptionMapper;
    }

    /**
     * Sets the default ExceptionMapper
     * @param exceptionMapper the new ExceptionMapper to be used by all requests
     */
    public static void setExceptionMapper(ExceptionMapper exceptionMapper) {
        Defaults.exceptionMapper = exceptionMapper;
    }
}

@@ -4592,26 +4592,24 @@
 void set
-DateFormat
+TimeZone
 (TimeZon

correct naming of the setTimeZone method [skip ci]