/**************************************************************
 * 
 * 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 com.sun.star.uno;


/**
 * The UNO IDL type any is mapped to java type <code>java.lang.Object</code>.
 * <p>
 * In special cases it is necessary to have an explicit any to additionally transport
 * an exact type. For instance if you want to pass an object reference via
 * an interprocess connection using an any, you should use this class to add
 * an explicit interface type, so the remote counterpart doesn't need to invoke
 * a queryInterface).
 * <p>
 * @version 	$Revision: 1.11 $ $ $Date: 2008-04-11 11:11:43 $
 */
public class Any {
	/**
	 * The type of the any.
	 * <p>
	 * @see #getType
	 */
	protected Type  _type;

	/**
	 * The data of the any.
	 * <p>
	 * @see #getObject
	 */
	protected Object _object;
    
    public static final Any VOID = new Any(new Type("void", TypeClass.VOID),
                                           null);
        // do not use Type.VOID here to avoid circular dependencies between
        // static members of Any and Type
    
	/**
	 * Constructs a new any.
	 * <p>
	 * @param   zInterface  the type of the any.
	 * @param   object      the data of the any.
	 * @deprecated as of UDK 2.0
	 */
	public Any(Class zInterface, Object object) {
        this(new Type(zInterface), object);
	}

    /** Constructs a new any with a given type and value
        @param type the UNO type of the any.
        @param object the value of the any.
     */
	public Any(Type type, Object object) {
        if (type.equals(Type.ANY)) {
            throw new IllegalArgumentException("Any cannot contain Any");
        }
		_type   = type;
		_object = object;
	}

    /**
       Complete a UNO <code>ANY</code> (make sure it is wrapped up as an
       <code>Any</code> instance).

       @param any a Java value representing a UNO <code>ANY</code> value.

       @return a complete Java value (that is, an <code>Any</code> instance)
       representing the same UNO <code>ANY</code> value as the given argument.

       @since UDK 3.2.3
    */
    public static final Any complete(Object any) {
        return any instanceof Any
            ? (Any) any
            : new Any(
                new Type(any == null ? XInterface.class : any.getClass()), any);
    }

	/**
	 * Gets the type of the value within the any.
	 * <p>
	 * @return   the type of the value within the any.
	 */
	public Type getType() {
		return _type;
	}

	/**
	 * Gets the value within the any.
	 * <p>
	 * @return   gets the value within the any.
	 */
	public Object getObject() {
		return _object;
	}

    // @see java.lang.Object#equals
    public boolean equals(Object obj) {
        return obj instanceof Any && _type.equals(((Any) obj)._type)
            && (_object == null
                ? ((Any) obj)._object == null
                : _object.equals(((Any) obj)._object));
    }

    // @see java.lang.Object#hashCode
    public int hashCode() {
        return _type.hashCode() * 13
            + (_object == null ? 0 : _object.hashCode());
    }

    // @see java.lang.Object#toString
    public String toString() {
        return "Any[" + _type + ", " + _object + "]";
    }
}
