/*******************************************************************************
 * Copyright (c) 2000, 2015 IBM Corporation 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:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.jdi.internal;

import java.io.DataInputStream;
import java.io.IOException;

import org.eclipse.jdi.internal.jdwp.JdwpCommandPacket;
import org.eclipse.jdi.internal.jdwp.JdwpID;
import org.eclipse.jdi.internal.jdwp.JdwpReplyPacket;
import org.eclipse.jdi.internal.jdwp.JdwpStringID;

import com.sun.jdi.ObjectCollectedException;
import com.sun.jdi.StringReference;

/**
 * this class implements the corresponding interfaces declared by the JDI
 * specification. See the com.sun.jdi package for more information.
 *
 */
public class StringReferenceImpl extends ObjectReferenceImpl implements
		StringReference {
	/** JDWP Tag. */
	public static final byte tag = JdwpID.STRING_TAG;

	/**
	 * Creates new StringReferenceImpl.
	 */
	public StringReferenceImpl(VirtualMachineImpl vmImpl, JdwpStringID stringID) {
		super("StringReference", vmImpl, stringID); //$NON-NLS-1$
	}

	/**
	 * @returns Value tag.
	 */
	@Override
	public byte getTag() {
		return tag;
	}

	/**
	 * @returns Returns the StringReference as a String.
	 */
	@Override
	public String value() {
		// Note that this information should not be cached.
		initJdwpRequest();
		try {
			JdwpReplyPacket replyPacket = requestVM(JdwpCommandPacket.SR_VALUE,
					this);
			defaultReplyErrorHandler(replyPacket.errorCode());

			DataInputStream replyData = replyPacket.dataInStream();
			String result = readString("value", replyData); //$NON-NLS-1$
			return result;
		} catch (IOException e) {
			defaultIOExceptionHandler(e);
			return null;
		} finally {
			handledJdwpRequest();
		}
	}

	/**
	 * @return Reads JDWP representation and returns new instance.
	 */
	public static StringReferenceImpl read(MirrorImpl target, DataInputStream in)
			throws IOException {
		VirtualMachineImpl vmImpl = target.virtualMachineImpl();
		JdwpStringID ID = new JdwpStringID(vmImpl);
		ID.read(in);
		if (target.fVerboseWriter != null)
			target.fVerboseWriter.println("stringReference", ID.value()); //$NON-NLS-1$

		if (ID.isNull())
			return null;

		StringReferenceImpl mirror = new StringReferenceImpl(vmImpl, ID);
		return mirror;
	}

	/**
	 * @return Returns description of Mirror object.
	 */
	@Override
	public String toString() {
		try {
			return "\"" + value() + "\""; //$NON-NLS-1$ //$NON-NLS-2$
		} catch (ObjectCollectedException e) {
			return JDIMessages.StringReferenceImpl__Garbage_Collected__StringReference__3
					+ idString();
		} catch (Exception e) {
			return fDescription;
		}
	}
}
