/*******************************************************************************
 * Copyright (c) 2005 The Regents of the University of California. 
 * This material was produced under U.S. Government contract W-7405-ENG-36 
 * for Los Alamos National Laboratory, which is operated by the University 
 * of California for the U.S. Department of Energy. The U.S. Government has 
 * rights to use, reproduce, and distribute this software. NEITHER THE 
 * GOVERNMENT NOR THE UNIVERSITY MAKES ANY WARRANTY, EXPRESS OR IMPLIED, OR 
 * ASSUMES ANY LIABILITY FOR THE USE OF THIS SOFTWARE. If software is modified 
 * to produce derivative works, such modified software should be clearly marked, 
 * so as not to confuse it with the version available from LANL.
 * 
 * Additionally, 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
 * 
 * LA-CC 04-115
 *******************************************************************************/
package org.eclipse.ptp.debug.core.pdi.request;

import org.eclipse.ptp.core.util.BitList;
import org.eclipse.ptp.debug.core.pdi.IPDIDebugger;
import org.eclipse.ptp.debug.core.pdi.PDIException;
import org.eclipse.ptp.debug.core.pdi.model.aif.IAIF;


/**
 * @author clement
 *
 */
public abstract class AbstractGetPartialAIFRequest extends AbstractEventResultRequest implements IPDIGetPartialAIFRequest {
	private String expr;
	private String varid;
	private boolean listChildren = false;
	private boolean express = false;
	
	public AbstractGetPartialAIFRequest(BitList tasks, String expr, String varid) {
		this(tasks, expr, varid, false, (varid != null));
	}
	
	public AbstractGetPartialAIFRequest(BitList tasks, String expr, String varid, boolean listChildren) {
		this(tasks, expr, varid, listChildren, false);
	}
	
	public AbstractGetPartialAIFRequest(BitList tasks, String expr, String varid, boolean listChildren, boolean express) {
		super(tasks);
		this.expr = expr;
		this.varid = varid;
		this.listChildren = listChildren;
		this.express = express;
	}
	
	/* (non-Javadoc)
	 * @see org.eclipse.ptp.debug.internal.core.pdi.request.AbstractEventRequest#doExecute(org.eclipse.ptp.debug.core.pdi.IPDIDebugger)
	 */
	public void doExecute(IPDIDebugger debugger) throws PDIException {
		debugger.retrievePartialAIF(tasks, expr, varid, listChildren, express);
	}
	
	/* (non-Javadoc)
	 * @see org.eclipse.ptp.debug.core.pdi.request.IPDIEventRequest#getName()
	 */
	public String getName() {
		return "Get partial aif request";
	}
	
	/* (non-Javadoc)
	 * @see org.eclipse.ptp.debug.core.pdi.request.IPDIGetPartialAIFRequest#getPartialAIF(org.eclipse.ptp.core.util.BitList)
	 */
	public IAIF getPartialAIF(BitList qTasks) throws PDIException {
		waitUntilCompleted(qTasks);
		Object obj = getResult(qTasks);
		if (obj instanceof Object[]) {
			Object[] returnValues = (Object[])obj;
			return (IAIF)returnValues[1];
		}
		throw new PDIException(qTasks, "Variable " + expr + ": No aif found");
	}
	
	/* (non-Javadoc)
	 * @see org.eclipse.ptp.debug.core.pdi.request.IPDIGetPartialAIFRequest#getVarId(org.eclipse.ptp.core.util.BitList)
	 */
	public String getVarId(BitList qTasks) throws PDIException {
		waitUntilCompleted(qTasks);
		Object obj = getResult(qTasks);
		if (obj instanceof Object[]) {
			Object[] returnValues = (Object[])obj;
			return (String)returnValues[0];
		}
		throw new PDIException(qTasks, "Variable ID " + varid + ": No variable ID found");
	}
	
	/* (non-Javadoc)
	 * @see org.eclipse.ptp.debug.internal.core.pdi.request.AbstractEventRequest#toString()
	 */
	public String toString() {
		return getName() + " for tasks " + BitList.showBitList(getTasks()) + ", exp: " + expr + ", var id: " + varid + ", is list children: " + listChildren + ", is express: " + express; 
	}
}
