package sharpen.xobotos.api.interop; import com.thoughtworks.xstream.annotations.XStreamAlias; import com.thoughtworks.xstream.annotations.XStreamAsAttribute; import com.thoughtworks.xstream.annotations.XStreamImplicit; import com.thoughtworks.xstream.annotations.XStreamOmitField; import sharpen.xobotos.api.AbstractReference; import sharpen.xobotos.api.interop.marshal.MarshalInfo.MarshalEntry; import sharpen.xobotos.config.ConfigurationException; import sharpen.xobotos.config.annotations.AttributeReference; import java.util.ArrayList; import java.util.Collections; import java.util.List; @XStreamAlias(value = "signature") public class Signature extends AbstractReference { @XStreamAlias("return-type") private ReturnInfo _returnType; @XStreamImplicit(itemFieldName = "parameter") private List<ParameterInfo> _parameters; @XStreamAsAttribute @XStreamAlias("implicit-instance") private boolean _implicitInstance; public static class TypeInfo { @XStreamOmitField @AttributeReference("marshal") public MarshalEntry marshal; } public static class ReturnInfo extends TypeInfo { } public enum Mode { REMOVE, INSTANCE, IN, OUT, REF } public enum Flags { ALLOW_NULL, ELEMENT } public static class ParameterInfo extends TypeInfo { @XStreamAsAttribute public int index; @XStreamAsAttribute @XStreamAlias("mode") public Mode mode; @XStreamAsAttribute @XStreamAlias("flags") public Flags flags; private Object readResolve() { if (flags == Flags.ELEMENT) throw new ConfigurationException("Cannot directly use Flags.ELEMENT!"); return this; } } public ReturnInfo getReturnInfo() { return _returnType; } public ParameterInfo getParameterInfo(int pos) { if (_parameters != null) { int index = 0; for (final ParameterInfo info : _parameters) { if (info.index > 0) index = info.index; if (index == pos) return info; ++index; } } return new ParameterInfo(); } public boolean implicitInstance() { return _implicitInstance; } public List<MarshalEntry> getAllMarshalInfos() { List<MarshalEntry> list = new ArrayList<MarshalEntry>(); if (_returnType != null) list.add(_returnType.marshal); if (_parameters != null) { for (final ParameterInfo info : _parameters) { list.add(info.marshal); } } return Collections.unmodifiableList(list); } }