/*******************************************************************************
 * Copyright (c) 2000, 2011 IBM Corporation and others.
 *
 * This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License 2.0
 * which accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
 *
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.jdt.internal.debug.core.model;

import java.util.Collections;
import java.util.List;

import org.eclipse.debug.core.DebugException;
import org.eclipse.debug.core.model.IValue;
import org.eclipse.jdt.core.Signature;
import org.eclipse.jdt.debug.core.IJavaFieldVariable;
import org.eclipse.jdt.debug.core.IJavaObject;
import org.eclipse.jdt.debug.core.IJavaThread;
import org.eclipse.jdt.debug.core.IJavaType;
import org.eclipse.jdt.debug.core.IJavaValue;
import org.eclipse.jdt.debug.core.IJavaVariable;

import com.ibm.icu.text.MessageFormat;

/**
 * Represents a value of "null"
 */
public class JDINullValue extends JDIObjectValue {

	/**
	 * Constructor
	 *
	 * @param target
	 */
	public JDINullValue(JDIDebugTarget target) {
		super(target, null);
	}

	/**
	 * @see org.eclipse.jdt.internal.debug.core.model.JDIValue#getVariablesList()
	 */
	@Override
	protected List<IJavaVariable> getVariablesList() {
		return Collections.EMPTY_LIST;
	}

	/**
	 * @see IValue#getReferenceTypeName()
	 */
	@Override
	public String getReferenceTypeName() {
		return "null"; //$NON-NLS-1$
	}

	/**
	 * @see IValue#getValueString()
	 */
	@Override
	public String getValueString() {
		return "null"; //$NON-NLS-1$
	}

	/**
	 * @see IJavaValue#getSignature()
	 */
	@Override
	public String getSignature() {
		return null;
	}

	/**
	 * @see IJavaValue#getArrayLength()
	 */
	@Override
	public int getArrayLength() {
		return -1;
	}

	/**
	 * @see IJavaValue#getJavaType()
	 */
	@Override
	public IJavaType getJavaType() {
		return null;
	}

	/**
	 * @see Object#equals(Object)
	 */
	@Override
	public boolean equals(Object obj) {
		return obj instanceof JDINullValue;
	}

	/**
	 * @see Object#hashCode()
	 */
	@Override
	public int hashCode() {
		return getClass().hashCode();
	}

	/**
	 * @see java.lang.Object#toString()
	 */
	@Override
	public String toString() {
		return "null"; //$NON-NLS-1$
	}

	/**
	 * @see org.eclipse.jdt.internal.debug.core.model.JDIObjectValue#getField(java.lang.String,
	 *      boolean)
	 */
	@Override
	public IJavaFieldVariable getField(String name, boolean superField) {
		return null;
	}

	/**
	 * @see org.eclipse.jdt.internal.debug.core.model.JDIObjectValue#getField(java.lang.String,
	 *      java.lang.String)
	 */
	@Override
	public IJavaFieldVariable getField(String name, String typeSignature) {
		return null;
	}

	/**
	 * @see org.eclipse.jdt.internal.debug.core.model.JDIObjectValue#getWaitingThreads()
	 */
	@Override
	public IJavaThread[] getWaitingThreads() {
		return null;
	}

	/**
	 * @see org.eclipse.jdt.internal.debug.core.model.JDIObjectValue#getOwningThread()
	 */
	@Override
	public IJavaThread getOwningThread() {
		return null;
	}

	/**
	 * @see org.eclipse.jdt.internal.debug.core.model.JDIObjectValue#getReferringObjects(long)
	 */
	@Override
	public IJavaObject[] getReferringObjects(long max) {
		return new IJavaObject[0];
	}

	/**
	 * @see org.eclipse.jdt.internal.debug.core.model.JDIObjectValue#sendMessage(java.lang.String,
	 *      java.lang.String, org.eclipse.jdt.debug.core.IJavaValue[],
	 *      org.eclipse.jdt.debug.core.IJavaThread, boolean)
	 */
	@Override
	public IJavaValue sendMessage(String selector, String signature,
			IJavaValue[] args, IJavaThread thread, boolean superSend)
			throws DebugException {
		return npe(selector, signature);
	}

	/**
	 * @see org.eclipse.jdt.internal.debug.core.model.JDIObjectValue#sendMessage(java.lang.String,
	 *      java.lang.String, org.eclipse.jdt.debug.core.IJavaValue[],
	 *      org.eclipse.jdt.debug.core.IJavaThread, java.lang.String)
	 */
	@Override
	public IJavaValue sendMessage(String selector, String signature,
			IJavaValue[] args, IJavaThread thread, String typeSignature)
			throws DebugException {
		return npe(selector, signature);
	}

	/**
	 * Creates an artificial NPE for display to the user as an error message
	 *
	 * @param selector
	 * @param signature
	 * @return
	 * @throws DebugException
	 */
	private IJavaValue npe(String selector, String signature)
			throws DebugException {
		StringBuilder buffer = new StringBuilder();
		buffer.append(selector);
		String[] parameterTypes = Signature.getParameterTypes(signature);
		buffer.append('(');
		for (int i = 0; i < parameterTypes.length; i++) {
			buffer.append(Signature.getSignatureSimpleName(parameterTypes[i]
					.replace('/', '.')));
			if (i + 1 < parameterTypes.length) {
				buffer.append(", "); //$NON-NLS-1$
			}
		}
		buffer.append(')');
		requestFailed(MessageFormat.format(
				JDIDebugModelMessages.JDINullValue_0,
				buffer.toString()), new NullPointerException());
		return null;
	}

	/*
	 * (non-Javadoc)
	 *
	 * @see
	 * org.eclipse.jdt.internal.debug.core.model.JDIObjectValue#disableCollection
	 * ()
	 */
	@Override
	public void disableCollection() throws DebugException {
		// Do nothing for null values
	}

	/*
	 * (non-Javadoc)
	 *
	 * @see
	 * org.eclipse.jdt.internal.debug.core.model.JDIObjectValue#enableCollection
	 * ()
	 */
	@Override
	public void enableCollection() throws DebugException {
		// Do nothing for null values
	}

	/*
	 * (non-Javadoc)
	 *
	 * @see org.eclipse.jdt.internal.debug.core.model.JDIValue#isNull()
	 */
	@Override
	public boolean isNull() {
		return true;
	}

}
