package com.jpexs.decompiler.flash.action;
import com.jpexs.decompiler.flash.ecma.Undefined;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
*
* @author JPEXS
*/
public class ActionScriptObject implements Cloneable {
protected Map<Integer, Object> properties = new HashMap<>();
protected Map<String, Object> members = new HashMap<>();
protected Object extendsObj;
protected List<Object> implementsObjs = new ArrayList<>();
public void clearMembers() {
for (Object o : members.values()) {
if (o instanceof ActionScriptObject) {
((ActionScriptObject) o).clear();
}
}
members.clear();
}
public void clearProperties() {
properties.clear();
}
public void clear() {
clearMembers();
clearProperties();
}
public List<Object> getImplementsObjs() {
return implementsObjs;
}
public void setImplementsObjs(List<Object> implementsObjs) {
this.implementsObjs = implementsObjs;
}
public void setExtendsObj(Object extendsObj) {
this.extendsObj = extendsObj;
}
public Object getExtendsObj() {
return extendsObj;
}
public void removeMember(String path) {
String pathParts[];
if (path.startsWith("/")) {
pathParts = path.substring(1).split("/");
} else {
pathParts = path.split(".");
}
ActionScriptObject obj = this;
for (int i = 0; i < pathParts.length; i++) {
String part = pathParts[i];
Object member = obj.getMember(part);
if (i == pathParts.length - 1) {
obj.members.remove(part);
} else if (member instanceof ActionScriptObject) {
obj = (ActionScriptObject) member;
} else {
break;
}
}
}
public List<String> enumerate() {
return new ArrayList<>(members.keySet());
}
public void setProperty(int index, Object value) {
properties.put(index, value);
}
public Object getProperty(int index) {
if (!properties.containsKey(index)) {
return Undefined.INSTANCE;
}
return properties.get(index);
}
public void setMember(String path, Object value) {
String pathParts[];
if (path.startsWith("/")) {
pathParts = path.substring(1).split("/");
} else {
pathParts = path.split(".");
}
ActionScriptObject obj = this;
for (int i = 0; i < pathParts.length; i++) {
String part = pathParts[i];
Object member = obj.getMember(part);
if (i == pathParts.length - 1) {
obj.members.put(part, value);
} else if (member instanceof ActionScriptObject) {
obj = (ActionScriptObject) member;
} else {
break;
}
}
}
@Override
public Object clone() {
try {
return super.clone();
} catch (CloneNotSupportedException ex) {
//ignore
}
return null;
}
public String getMemberPath(Object obj) {
if (obj == this) {
return "";
}
for (String memberName : members.keySet()) {
Object member = members.get(memberName);
if (member == obj) {
return memberName;
}
if (member instanceof ActionScriptObject) {
String ret = ((ActionScriptObject) member).getMemberPath(obj);
if (ret != null) {
return memberName + "." + ret;
}
}
}
return null;
}
protected Object getThisMember(String name) {
return members.get(name);
}
public Object getMember(String path) {
String pathParts[];
if (path.startsWith("/")) {
pathParts = path.substring(1).split("/");
} else {
pathParts = path.split(".");
}
ActionScriptObject obj = this;
for (int i = 0; i < pathParts.length; i++) {
String part = pathParts[i];
if (i == pathParts.length - 1) {
return obj.getThisMember(part);
} else {
Object member = obj.getMember(part);
if (member instanceof ActionScriptObject) {
obj = (ActionScriptObject) member;
} else {
break;
}
}
}
return null;
}
}