package com.t3.xstreamversioned.model;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Objects;
import com.t3.xstreamversioned.version.Version;
public class GenericObject {
private Version currentVersion;
private LinkedHashSet<Integer> children;
private String content;
private String name;
private Map<String, String> xStreamAttributes;
/**
* this internal id this object has
*/
private final int internalId;
private final GenericObjectManager genericObjectManager;
private Integer referencing;
public GenericObject(GenericObjectManager genericObjectManager, int internalId) {
this.children=new LinkedHashSet<>();
this.internalId=internalId;
this.genericObjectManager=genericObjectManager;
}
public Version getCurrentVersion() {
return currentVersion;
}
public Map<String, String> getXStreamAttributes() {
return Collections.unmodifiableMap(xStreamAttributes);
}
public void setVersion(Version version) {
this.currentVersion = version;
xStreamAttributes.put("version", version.toString());
}
public List<GenericObject> getChildren(String name) {
ArrayList<GenericObject> l=new ArrayList<>(children.size());
for(Integer childId:children) {
GenericObject go=genericObjectManager.getObject(childId);
if(Objects.equals(go.getName(),name))
l.add(go);
}
return Collections.unmodifiableList(l);
}
public List<GenericObject> getChildren() {
ArrayList<GenericObject> l=new ArrayList<>(children.size());
for(Integer childId:children)
l.add(genericObjectManager.getObject(childId));
return Collections.unmodifiableList(l);
}
public GenericObject getChild(String name) {
GenericObject result=null;
for(Integer childId:children) {
GenericObject go=genericObjectManager.getObject(childId);
if(Objects.equals(go.getName(),name)) {
if(result==null)
result=go;
else
throw new RuntimeException("There is more than one child with the name "+name);
}
}
return result;
}
public void addChild(GenericObject child) {
children.add(child.getInternalId());
}
public String getName() {
return name;
}
public int getInternalId() {
return internalId;
}
public void setCurrentVersion(Version version) {
this.currentVersion=version;
}
public void setName(String name) {
this.name=name;
}
public void setXStreamAttributes(Map<String, String> xStreamAttributes) {
this.xStreamAttributes=xStreamAttributes;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public GenericObjectManager getObjectManager() {
return genericObjectManager;
}
public void setReferencing(GenericObject ref) {
if(ref==null) {
referencing=null;
xStreamAttributes.remove("reference");
}
else {
this.referencing=ref.getInternalId();
xStreamAttributes.put("reference", Integer.toString(ref.getInternalId()));
}
}
public GenericObject getReferencing() {
return genericObjectManager.getObject(referencing);
}
public void removeChild(GenericObject child) {
children.remove(child);
}
}