package sharpen.xobotos.api.interop;
import com.thoughtworks.xstream.annotations.XStreamAlias;
import com.thoughtworks.xstream.annotations.XStreamAsAttribute;
import com.thoughtworks.xstream.annotations.XStreamImplicit;
import sharpen.xobotos.api.AbstractReference;
import sharpen.xobotos.config.ConfigurationException;
import java.util.Collections;
import java.util.List;
@XStreamAlias(value = "native-method")
public class NativeMethod extends AbstractReference implements IncludeFileProvider {
@XStreamAlias("signature")
private Signature _signature;
@XStreamAsAttribute
@XStreamAlias("name")
private String _name;
@XStreamAsAttribute
@XStreamAlias("kind")
private Kind _kind;
@XStreamAsAttribute
@XStreamAlias("native-name")
private String _nativeName;
@XStreamAlias("class")
private String _nativeClass;
@XStreamAsAttribute
@XStreamAlias("return-void")
private boolean _returnVoid;
@XStreamImplicit(itemFieldName = "include")
private List<String> _includes;
public String getName() {
return _name;
}
public String getNativeName() {
return _nativeName;
}
public Kind getKind() {
return _kind;
}
public String getNativeClass() {
return _nativeClass;
}
public Signature getSignature() {
return _signature;
}
protected Object readResolve() {
if (_signature == null)
_signature = new Signature();
if (_kind == null)
_kind = Kind.STATIC;
switch (_kind) {
case STATIC:
case PROXY:
break;
case CONSTRUCTOR:
if (_nativeClass != null)
throw new ConfigurationException("Cannot use <class> for constructors");
break;
case INSTANCE:
if (_nativeClass != null)
throw new ConfigurationException("Cannot use <class> for instance methods");
break;
case DESTRUCTOR:
if (_nativeClass != null)
throw new ConfigurationException("Cannot use <class> for destructors");
break;
default:
throw new ConfigurationException("Invalid native method kind.");
}
return this;
}
public boolean returnVoid() {
if (_kind == Kind.DESTRUCTOR)
return true;
else if (_kind == Kind.CONSTRUCTOR)
return false;
return _returnVoid;
}
@XStreamAlias("kind")
public enum Kind {
STATIC,
PROXY,
INSTANCE,
CONSTRUCTOR,
DESTRUCTOR
}
@Override
public List<String> getIncludes() {
return _includes != null ? Collections.unmodifiableList(_includes) : null;
}
}