blob: 1da333f22551cba0cbbcb8af55bb062b52ebcc20 [file] [log] [blame]
/*******************************************************************************
* 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
* Jesper Steen Møller <jesper@selskabet.org> - Bug 430839
*******************************************************************************/
package org.eclipse.jdt.internal.debug.core.model;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.eclipse.debug.core.DebugException;
import org.eclipse.jdt.debug.core.IJavaClassType;
import org.eclipse.jdt.debug.core.IJavaInterfaceType;
import org.eclipse.jdt.debug.core.IJavaThread;
import org.eclipse.jdt.debug.core.IJavaValue;
import com.ibm.icu.text.MessageFormat;
import com.sun.jdi.ClassType;
import com.sun.jdi.InterfaceType;
import com.sun.jdi.Method;
import com.sun.jdi.Value;
/**
* The interface of an object in a debug target.
*/
public class JDIInterfaceType extends JDIReferenceType implements
IJavaInterfaceType {
/**
* Constructs a new interface type on the given target referencing the
* specified interface type.
*/
public JDIInterfaceType(JDIDebugTarget target, InterfaceType type) {
super(target, type);
}
/*
* (non-Javadoc)
*
* @see org.eclipse.jdt.debug.core.IJavaInterfaceType#getImplementors()
*/
@Override
public IJavaClassType[] getImplementors() throws DebugException {
try {
List<ClassType> implementorList = ((InterfaceType) getUnderlyingType())
.implementors();
List<JDIType> javaClassTypeList = new ArrayList<JDIType>(implementorList.size());
Iterator<ClassType> iterator = implementorList.iterator();
while (iterator.hasNext()) {
ClassType classType = iterator.next();
if (classType != null) {
javaClassTypeList.add(JDIType.createType(
getJavaDebugTarget(), classType));
}
}
IJavaClassType[] javaClassTypeArray = new IJavaClassType[javaClassTypeList
.size()];
javaClassTypeArray = javaClassTypeList
.toArray(javaClassTypeArray);
return javaClassTypeArray;
} catch (RuntimeException re) {
targetRequestFailed(
MessageFormat.format(
JDIDebugModelMessages.JDIClassType_exception_while_retrieving_superclass,
re.toString()), re);
}
return new IJavaClassType[0];
}
/*
* (non-Javadoc)
*
* @see org.eclipse.jdt.debug.core.IJavaInterfaceType#getSubInterfaces()
*/
@Override
public IJavaInterfaceType[] getSubInterfaces() throws DebugException {
try {
List<InterfaceType> subList = ((InterfaceType) getUnderlyingType())
.subinterfaces();
List<JDIType> javaInterfaceTypeList = new ArrayList<JDIType>(subList.size());
Iterator<InterfaceType> iterator = subList.iterator();
while (iterator.hasNext()) {
InterfaceType interfaceType = iterator.next();
if (interfaceType != null) {
javaInterfaceTypeList.add(JDIType.createType(
getJavaDebugTarget(), interfaceType));
}
}
IJavaInterfaceType[] javaInterfaceTypeArray = new IJavaInterfaceType[javaInterfaceTypeList
.size()];
javaInterfaceTypeArray = javaInterfaceTypeList
.toArray(javaInterfaceTypeArray);
return javaInterfaceTypeArray;
} catch (RuntimeException re) {
targetRequestFailed(
MessageFormat.format(
JDIDebugModelMessages.JDIClassType_exception_while_retrieving_superclass,
re.toString()), re);
}
return new IJavaInterfaceType[0];
}
/*
* (non-Javadoc)
*
* @see org.eclipse.jdt.debug.core.IJavaInterfaceType#getSuperInterfaces()
*/
@Override
public IJavaInterfaceType[] getSuperInterfaces() throws DebugException {
try {
List<InterfaceType> superList = ((InterfaceType) getUnderlyingType())
.superinterfaces();
List<JDIType> javaInterfaceTypeList = new ArrayList<JDIType>(superList.size());
Iterator<InterfaceType> iterator = superList.iterator();
while (iterator.hasNext()) {
InterfaceType interfaceType = iterator.next();
if (interfaceType != null) {
javaInterfaceTypeList.add(JDIType.createType(
getJavaDebugTarget(), interfaceType));
}
}
IJavaInterfaceType[] javaInterfaceTypeArray = new IJavaInterfaceType[javaInterfaceTypeList
.size()];
javaInterfaceTypeArray = javaInterfaceTypeList
.toArray(javaInterfaceTypeArray);
return javaInterfaceTypeArray;
} catch (RuntimeException re) {
targetRequestFailed(
MessageFormat.format(
JDIDebugModelMessages.JDIClassType_exception_while_retrieving_superclass,
re.toString()), re);
}
return new IJavaInterfaceType[0];
}
/*
* (non-Javadoc)
*
* @see
* org.eclipse.jdt.debug.core.IJavaInterfaceType#sendMessage(java.lang.String,
* java.lang.String, org.eclipse.jdt.debug.core.IJavaValue[],
* org.eclipse.jdt.debug.core.IJavaThread)
*/
@Override
public IJavaValue sendMessage(String selector, String signature,
IJavaValue[] args, IJavaThread thread) throws DebugException {
if (getUnderlyingType() instanceof InterfaceType) {
InterfaceType iface = (InterfaceType) getUnderlyingType();
JDIThread javaThread = (JDIThread) thread;
List<Value> arguments = convertArguments(args);
Method method = null;
try {
List<Method> methods = iface.methodsByName(selector, signature);
if (methods.isEmpty()) {
requestFailed(
MessageFormat.format(
JDIDebugModelMessages.JDIClassType_Type_does_not_implement_selector,
selector, signature), null);
} else {
method = methods.get(0);
}
} catch (RuntimeException e) {
targetRequestFailed(
MessageFormat.format(
JDIDebugModelMessages.JDIClassType_exception_while_performing_method_lookup_for_selector,
e.toString(), selector, signature), e);
}
Value result = javaThread.invokeMethod(iface, method, arguments);
return JDIValue.createValue(getJavaDebugTarget(), result);
}
requestFailed(
JDIDebugModelMessages.JDIClassType_Type_is_not_a_class_type,
null);
// execution will not fall through to here,
// as #requestFailed will throw an exception
return null;
}
}