/*******************************************************************************
 * Copyright (c) 2009 Mukul Gandhi, and others
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     Mukul Gandhi - bug 274952 - Initial API and implementation, of xs:long data 
 *                                 type.
 *     Mukul Gandhi - bug 280798 - PsychoPath support for JDK 1.4
 *******************************************************************************/

package org.eclipse.wst.xml.xpath2.processor.internal.types;

import org.eclipse.wst.xml.xpath2.processor.DynamicError;
import org.eclipse.wst.xml.xpath2.processor.ResultSequence;
import org.eclipse.wst.xml.xpath2.processor.ResultSequenceFactory;

import java.math.BigInteger;

public class XSLong extends XSInteger {
	
	private static final String XS_LONG = "xs:long";

	/**
	 * Initializes a representation of 0
	 */
	public XSLong() {
	  this(BigInteger.valueOf(0));
	}
	
	/**
	 * Initializes a representation of the supplied long value
	 * 
	 * @param x
	 *            Long to be stored
	 */
	public XSLong(BigInteger x) {
		super(x);
	}
	
	/**
	 * Retrieves the datatype's full pathname
	 * 
	 * @return "xs:long" which is the datatype's full pathname
	 */
	public String string_type() {
		return XS_LONG;
	}
	
	/**
	 * Retrieves the datatype's name
	 * 
	 * @return "long" which is the datatype's name
	 */
	public String type_name() {
		return "long";
	}
	
	/**
	 * Creates a new ResultSequence consisting of the extractable long in the
	 * supplied ResultSequence
	 * 
	 * @param arg
	 *            The ResultSequence from which the long is to be extracted
	 * @return New ResultSequence consisting of the 'long' supplied
	 * @throws DynamicError
	 */
	public ResultSequence constructor(ResultSequence arg) throws DynamicError {
		ResultSequence rs = ResultSequenceFactory.create_new();

		if (arg.empty())
			return rs;

		// the function conversion rules apply here too. Get the argument
		// and convert it's string value to a long.
		AnyType aat = arg.first();

		try {
			BigInteger bigInt = new BigInteger(aat.string_value());
			
			// doing the range checking
			BigInteger min = BigInteger.valueOf(-9223372036854775808L);
			BigInteger max = BigInteger.valueOf(9223372036854775807L);			

			if (bigInt.compareTo(min) < 0 || bigInt.compareTo(max) > 0) {
			   // invalid input
			   DynamicError.throw_type_error();	
			}
			
			rs.add(new XSLong(bigInt));
			
			return rs;
		} catch (NumberFormatException e) {
			throw DynamicError.cant_cast(null);
		}

	}

}
