package net.jangaroo.jooc.model;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
/**
* A model of an ActionScript class or interface.
*/
public class ClassModel extends AbstractAnnotatedModel implements NamespacedModel {
private boolean isInterface = false;
private boolean isFinal = false;
private boolean isDynamic = false;
private String namespace = PUBLIC;
private String superclass = null;
private List<String> interfaces = new ArrayList<String>();
private List<MemberModel> members = new ArrayList<MemberModel>();
public ClassModel() {
}
public ClassModel(String name) {
super(name);
}
public ClassModel(String name, String superclass) {
super(name);
this.superclass = superclass;
}
public String getNamespace() {
return namespace;
}
public void setNamespace(String namespace) {
this.namespace = namespace;
}
public boolean isFinal() {
return isFinal;
}
public void setFinal(boolean aFinal) {
isFinal = aFinal;
}
public boolean isDynamic() {
return isDynamic;
}
public void setDynamic(boolean dynamic) {
isDynamic = dynamic;
}
public boolean isInterface() {
return isInterface;
}
public void setInterface(boolean value) {
this.isInterface = value;
}
public String getSuperclass() {
return superclass;
}
public void setSuperclass(String superclass) {
this.superclass = superclass;
}
public List<String> getInterfaces() {
return Collections.unmodifiableList(interfaces);
}
public void setInterfaces(List<String> interfaces) {
this.interfaces = interfaces;
}
public void addInterface(String interfaceName) {
interfaces.add(interfaceName);
}
public List<MemberModel> getMembers() {
return Collections.unmodifiableList(members);
}
public void setMembers(List<MemberModel> members) {
this.members = members;
}
public void addMember(MemberModel member) {
MemberModel oldMember = getMember(member.isStatic(), member.getName());
if (oldMember != null) {
if (oldMember.isProperty()) {
PropertyModel oldPropertyModel = (PropertyModel)oldMember;
if (member.isGetter()) {
oldMember = oldPropertyModel.getGetter();
} else if (member.isSetter()) {
oldMember = oldPropertyModel.getSetter();
}
}
if (oldMember != null) {
if (oldMember.equals(member)) {
return;
}
throw new IllegalArgumentException("Someone tried to add a different " + (member.isStatic() ? "static " : "") + "member called " + member.getName() + " to class " + getName());
}
}
if (member.isProperty()) {
PropertyModel propertyModel = (PropertyModel)member;
addIfNotNull(propertyModel.getGetter());
addIfNotNull(propertyModel.getSetter());
} else {
members.add(member);
}
}
private void addIfNotNull(MethodModel method) {
if (method != null) {
members.add(method);
}
}
public PropertyModel getProperty(boolean isStatic, String name) {
MemberModel member = getMember(isStatic, name);
return member != null && member.isProperty() ? (PropertyModel)member : null;
}
public MemberModel getMember(String name) {
return getMember(false, name);
}
public MemberModel getStaticMember(String name) {
return getMember(true, name);
}
private MemberModel getMember(boolean isStatic, String name) {
MemberModel member = getMethodOrField(isStatic, name);
if (member != null && member.isAccessor()) {
MethodModel counterpart = getMethod(isStatic, member.isGetter() ? MethodType.SET : MethodType.GET, name);
return new PropertyModel((MethodModel)member, counterpart);
}
return member;
}
private MemberModel getMethodOrField(boolean isStatic, String name) {
for (MemberModel memberModel : members) {
if (memberModel.isStatic() == isStatic && name.equals(memberModel.getName())) {
return memberModel;
}
}
return null;
}
public boolean removeMember(MemberModel memberModel) {
return members.remove(memberModel);
}
public MethodModel getConstructor() {
return getMethod(getName());
}
public MethodModel getStaticMethod(String name) {
return getStaticMethod(null, name);
}
public MethodModel getStaticMethod(MethodType methodType, String name) {
return getMethod(false, methodType, name);
}
public MethodModel getMethod(String name) {
return getMethod(false, name);
}
public MethodModel getMethod(MethodType methodType, String name) {
return getMethod(false, methodType, name);
}
private MethodModel getMethod(boolean isStatic, String name) {
return getMethod(isStatic, null, name);
}
private MethodModel getMethod(boolean isStatic, MethodType methodType, String name) {
for (MemberModel memberModel : members) {
if (memberModel.isMethod() && ((MethodModel)memberModel).getMethodType() == methodType
&& memberModel.isStatic() == isStatic && name.equals(memberModel.getName())) {
return (MethodModel)memberModel;
}
}
return null;
}
public MethodModel createConstructor() {
MethodModel constructor = new MethodModel(getName(), null);
addMember(constructor);
return constructor;
}
@Override
public void visit(ModelVisitor visitor) {
visitor.visitClass(this);
}
}