| Quintiq file version 2.0 | 
| #parent: #root | 
| Method UpdateSnapshotComponent ( | 
|   JSON json | 
| ) | 
| { | 
|   Description: 'Replace the `SnapshotComponent` with the deserialized `SnapshotComponent` from the `JSON`.' | 
|   TextBody: | 
|   [* | 
|     snapshot_deserialize := LibOpt_Snapshot::Deserialize( json, this.Run() ); | 
|      | 
|     // Delete current snapshot | 
|     if( not isnull( this.SnapshotComponent() ) ) | 
|     { | 
|       // Decrease the NrTimesCalled, for deleting the snapshots | 
|       descendants := this.SnapshotComponent().Descendants(); | 
|       descendants.Add( this.SnapshotComponent() ); | 
|       traverse( descendants, Elements.astype( LibOpt_SnapshotComponent ), snapshot ) | 
|       { | 
|         snapshot.Component().NrTimesCalled( snapshot.Component().NrTimesCalled() - 1 ); | 
|       } | 
|       traverse( descendants, Elements.astype( LibOpt_SnapshotSuboptimizer ), snapshot, snapshot.IsRollback() | 
|                                                                                        and not isnull( snapshot.Suboptimizer() ) ) | 
|       { | 
|         snapshot.Suboptimizer().NrOfRollbacks( snapshot.Suboptimizer().NrOfRollbacks() - 1 ); | 
|       } | 
|       this.SnapshotComponent().Delete(); | 
|     } | 
|      | 
|     snapshot_parent := guard( this.Parent().SnapshotComponent(), null( LibOpt_SnapshotComponent ) ); | 
|     snapshot_deserialize.Parent( relset, snapshot_parent ); | 
|     this.SnapshotComponent( relset, snapshot_deserialize.astype( LibOpt_SnapshotComponent ) ); | 
|      | 
|     // Increase the NrTimesCalled, for adding new snapshots | 
|     descendants := snapshot_deserialize.Descendants(); | 
|     descendants.Add( this.SnapshotComponent() ); | 
|     traverse( descendants, Elements.astype( LibOpt_SnapshotComponent ), snapshot ) | 
|     { | 
|       snapshot.Component().NrTimesCalled( snapshot.Component().NrTimesCalled() + 1 ); | 
|     } | 
|     //traverse suboptimizers to update NrOfRollbacks | 
|     traverse( descendants, Elements.astype( LibOpt_SnapshotSuboptimizer ), snapshot ) | 
|     { | 
|       if( snapshot.IsRollback() and this.Component().istype( LibOpt_Suboptimizer ) ) | 
|       { | 
|         subOpt := this.Component().astype( LibOpt_Suboptimizer ); | 
|         subOpt.NrOfRollbacks( subOpt.NrOfRollbacks() + 1 ); | 
|         subOpt.SnapshotSuboptimizer( relinsert, snapshot ); | 
|       } | 
|     } | 
|   *] | 
|   InterfaceProperties { Accessibility: 'Module' } | 
| } |