/*
 * Copyright (C) 2011 Citrix Systems, Inc.  All rights reserved.
 * 
 * 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 com.cloud.bridge.util;

import java.sql.Timestamp;
import java.util.Calendar;
import java.util.Date;

import org.apache.axis2.databinding.utils.ConverterUtil;

/**
 * @author John Zucker
 * Custom subclass of org.apache.axis2.databinding.utils.ConverterUtil, i.e. the data conversion utility for
 * databindings in the ADB framework of Axis2.  The purpose of a custom class is to provide specific value
 * format conversions for certain datatypes, especially dates, timestamps and calendars for which the default
 * is inappropriate.  For these simple cases, the return value is of type String.
 * Converter methods to go from 1. simple type -> String 2. simple type -> Object 3. String ->
 * simpletype 4. Object list -> array
 */


public class DatabindingConverterUtil extends ConverterUtil {

    // Custom behaviour for java.util.Date
	public static String convertToString(Date dateValue) 
	{
		
		return (new ISO8601SimpleDateTimeFormat()).format(dateValue);
	 }
    
	// Custom behaviour for java.util.Calendar
	public static String convertToString(Calendar calendarValue) 
	{
		
		return (new ISO8601SimpleDateTimeFormat()).format(calendarValue.getTime());
	 }

    // Custom behaviour for java.sql.Timestamp
	public static String convertToString(Timestamp timestampValue) 
	{
		
		return timestampValue.toString();
	 }
	
	// Otherwise String convertToString(Object any) is handled by invoker (which happens to be superclass).
	// No need to reference super explicitly because it is the invoker of static methods 
	// @see org.apache.axis2.databinding.utils.ConverterUtil
	
	
}
