import java.util.LinkedHashMap;
import java.util.Map;
+import javax.annotation.concurrent.GuardedBy;
+
import org.opendaylight.yangtools.concepts.Identifiable;
import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier.PathArgument;
import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
import com.google.common.base.Optional;
+import com.google.common.base.Predicate;
+import com.google.common.primitives.UnsignedLong;
/**
* Node Modification Node and Tree
*/
public class NodeModification implements StoreTreeNode<NodeModification>, Identifiable<PathArgument> {
+ public static final Predicate<NodeModification> IS_TERMINAL_PREDICATE = new Predicate<NodeModification>() {
+ @Override
+ public boolean apply(final NodeModification input) {
+ return input.getModificationType() == ModificationType.WRITE || input.getModificationType() == ModificationType.DELETE;
+ }
+ };
private final PathArgument identifier;
private ModificationType modificationType = ModificationType.UNMODIFIED;
private NormalizedNode<?, ?> value;
- private StoreMetadataNode snapshotCache;
+ private UnsignedLong subtreeVersion;
+ private Optional<StoreMetadataNode> snapshotCache;
private final Map<PathArgument, NodeModification> childModification;
+ @GuardedBy("this")
private boolean sealed = false;
protected NodeModification(final PathArgument identifier, final Optional<StoreMetadataNode> original) {
*/
public synchronized NodeModification modifyChild(final PathArgument child) {
checkSealed();
+ clearSnapshot();
if(modificationType == ModificationType.UNMODIFIED) {
updateModificationType(ModificationType.SUBTREE_MODIFIED);
}
*/
public synchronized void delete() {
checkSealed();
+ clearSnapshot();
updateModificationType(ModificationType.DELETE);
childModification.clear();
this.value = null;
*/
public synchronized void write(final NormalizedNode<?, ?> value) {
checkSealed();
+ clearSnapshot();
updateModificationType(ModificationType.WRITE);
childModification.clear();
this.value = value;
}
+ @GuardedBy("this")
private void checkSealed() {
checkState(!sealed, "Node Modification is sealed. No further changes allowed.");
}
public synchronized void seal() {
sealed = true;
+ clearSnapshot();
for(NodeModification child : childModification.values()) {
child.seal();
}
snapshotCache = null;
}
+ public Optional<StoreMetadataNode> storeSnapshot(final Optional<StoreMetadataNode> snapshot) {
+ snapshotCache = snapshot;
+ return snapshot;
+ }
+
+ public Optional<Optional<StoreMetadataNode>> getSnapshotCache() {
+ return Optional.fromNullable(snapshotCache);
+ }
+
public boolean hasAdditionalModifications() {
return !childModification.isEmpty();
}
- public void updateModificationType(final ModificationType type) {
+ @GuardedBy("this")
+ private void updateModificationType(final ModificationType type) {
modificationType = type;
clearSnapshot();
}
@Override
public String toString() {
return "NodeModification [identifier=" + identifier + ", modificationType="
- + modificationType + ", value=" + value + ", childModification=" + childModification + "]";
+ + modificationType + ", childModification=" + childModification + "]";
}
public static NodeModification createUnmodified(final StoreMetadataNode metadataTree) {