package net.ion.craken.node;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import net.ion.craken.listener.CDDModifiedEvent;
import net.ion.craken.listener.CDDRemovedEvent;
import net.ion.craken.node.crud.WriteNodeImpl.Touch;
import net.ion.craken.node.crud.tree.Fqn;
import net.ion.craken.node.crud.tree.impl.PropertyId;
import net.ion.craken.node.crud.tree.impl.PropertyValue;
import net.ion.framework.util.ListUtil;
public class TouchedRow {
private WriteNode source;
private Touch touch;
private Fqn target;
private Map<String, Fqn> affected;
private TouchedRow(WriteNode source, Touch touch, Fqn target, Map<String, Fqn> affected) {
this.source = source;
this.touch = touch;
this.target = target;
this.affected = affected ;
}
public final static TouchedRow create(WriteNode source, Touch touch, Fqn target, Map<String, Fqn> affected) {
return new TouchedRow(source, touch, target, affected);
}
public Touch touch() {
return touch;
}
public Fqn target() {
return target;
}
public Map<String, Fqn> affected(){
return Collections.unmodifiableMap(affected) ;
}
public Map<PropertyId, PropertyValue> sourceMap() {
// Debug.line(source, ((WriteNodeImpl)source).tree().getData(Flag.COMMAND_RETRY) ,source.toMap());
return source.toMap();
}
public Map<PropertyId, PropertyValue> value(){
return source.toMap() ;
}
@Override
public boolean equals(Object obj) {
if (!TouchedRow.class.isInstance(obj))
return false;
TouchedRow that = (TouchedRow) obj;
return this.touch == that.touch && this.target.equals(that.target);
}
@Override
public int hashCode() {
return target.hashCode() + touch.ordinal();
}
public String toString() {
return target + ", " + touch;
}
public CDDModifiedEvent modifyEvent() {
return CDDModifiedEvent.create(this) ;
}
public CDDRemovedEvent deleteEvent() {
return CDDRemovedEvent.create(this) ;
}
public CDDRemovedEvent[] deleteChildrenEvent() {
List<CDDRemovedEvent> result = ListUtil.newList() ;
for (Fqn fqn : affected.values()) {
result.add(CDDRemovedEvent.create(fqn));
}
return result.toArray(new CDDRemovedEvent[0]) ;
}
}