Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
11/23/14 05:32:41 (9 years ago)
Author:
swagner
Message:

#2205: Continued working on programmable network items

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/Core.Networks/ProgrammableNode.cs

    r11563 r11564  
    2727
    2828namespace HeuristicLab.Core.Networks {
    29   [Item("ProgrammableNode", "A programmable node of a network.")]
     29  [Item("ProgrammableNode", "Abstract base class for programmable nodes of a network.")]
    3030  [StorableClass]
    31   public class ProgrammableNode : ProgrammableNetworkItem, INode {
    32     protected override string CodeTemplate {
    33       get { return ReadCodeTemplate("HeuristicLab.Optimization.Networks.Core.Networks.ProgrammableNodeTemplate.cs"); }
    34     }
    35 
     31  public abstract class ProgrammableNode : ProgrammableNetworkItem, IProgrammableNode {
     32    #region Node Members
    3633    new public INetwork Parent {
    37       get { return (INetwork)base.Parent; }
     34      get { return CompiledNetworkItem.Parent; }
    3835      set {
    3936        // NOTE: never call setter directly as the Parent property is set by the network which contains the node
    40         base.Parent = value;
     37        CompiledNetworkItem.Parent = value;
    4138      }
    42     }
    43     public override IEnumerable<INetworkItem> Children {
    44       get { return base.Children.Concat(Ports.AsEnumerable<INetworkItem>()); }
    4539    }
    4640
     
    4842    private PortCollection ports;
    4943    protected PortCollection Ports {
    50       get { return ports; }
     44      get { return CompiledNetworkItem.Ports; }
    5145    }
    5246    private ReadOnlyKeyedItemCollection<string, IPort> readOnlyPorts;
    5347    IKeyedItemCollection<string, IPort> INode.Ports {
    5448      get {
    55         if (readOnlyPorts == null) readOnlyPorts = ports.AsReadOnly();
     49        if (readOnlyPorts == null) readOnlyPorts = Ports.AsReadOnly();
    5650        return readOnlyPorts;
    5751      }
    5852    }
     53    #endregion
     54
     55    protected override string CodeTemplate {
     56      get { return ReadCodeTemplate("HeuristicLab.Optimization.Networks.Core.Networks.ProgrammableNodeTemplate.cs"); }
     57    }
     58
     59    new protected CompiledProgrammableNode CompiledNetworkItem {
     60      get { return (CompiledProgrammableNode)base.CompiledNetworkItem; }
     61    }
    5962
    6063    [StorableConstructor]
    61     private ProgrammableNode(bool deserializing) : base(deserializing) { }
    62     private ProgrammableNode(ProgrammableNode original, Cloner cloner)
     64    protected ProgrammableNode(bool deserializing) : base(deserializing) { }
     65    protected ProgrammableNode(ProgrammableNode original, Cloner cloner)
    6366      : base(original, cloner) {
    64       ports = cloner.Clone(original.ports);
    65       foreach (var p in Ports)
    66         p.Parent = this;
     67      // ports are cloned in CompiledProgrammableNode
    6768      readOnlyPorts = null;
    68       RegisterPortsEvents();
    6969    }
    70     public ProgrammableNode()
     70    protected ProgrammableNode()
    7171      : base("ProgrammableNode") {
    7272      ports = new PortCollection();
    7373      readOnlyPorts = null;
    74       RegisterPortsEvents();
    7574    }
    76     public ProgrammableNode(string name)
     75    protected ProgrammableNode(string name)
    7776      : base(name) {
    7877      ports = new PortCollection();
    7978      readOnlyPorts = null;
    80       RegisterPortsEvents();
    8179    }
    82     public ProgrammableNode(string name, string description)
     80    protected ProgrammableNode(string name, string description)
    8381      : base(name, description) {
    8482      ports = new PortCollection();
    8583      readOnlyPorts = null;
    86       RegisterPortsEvents();
    8784    }
    88 
    89     [StorableHook(HookType.AfterDeserialization)]
    90     private void AfterDeserialization() {
    91       foreach (var p in Ports)
    92         p.Parent = this;
    93       RegisterPortsEvents();
    94     }
    95 
    96     public override IDeepCloneable Clone(Cloner cloner) {
    97       return new ProgrammableNode(this, cloner);
    98     }
    99 
    100     #region Ports Events
    101     protected virtual void RegisterPortsEvents() {
    102       ports.ItemsAdded += Ports_ItemsAdded;
    103       ports.ItemsRemoved += Ports_ItemsRemoved;
    104       ports.ItemsReplaced += Ports_ItemsReplaced;
    105       ports.CollectionReset += Ports_CollectionReset;
    106     }
    107     protected virtual void Ports_ItemsAdded(object sender, Collections.CollectionItemsChangedEventArgs<IPort> e) {
    108       foreach (var p in e.Items)
    109         p.Parent = this;
    110     }
    111     protected virtual void Ports_ItemsRemoved(object sender, Collections.CollectionItemsChangedEventArgs<IPort> e) {
    112       foreach (var p in e.Items)
    113         p.Parent = null;
    114     }
    115     protected virtual void Ports_ItemsReplaced(object sender, Collections.CollectionItemsChangedEventArgs<IPort> e) {
    116       foreach (var p in e.OldItems)
    117         p.Parent = null;
    118       foreach (var p in e.Items)
    119         p.Parent = this;
    120     }
    121     protected virtual void Ports_CollectionReset(object sender, Collections.CollectionItemsChangedEventArgs<IPort> e) {
    122       foreach (var p in e.OldItems)
    123         p.Parent = null;
    124       foreach (var p in e.Items)
    125         p.Parent = this;
    126     }
    127     #endregion
    12885
    12986    #region CompiledProgrammableNode
    13087    [Item("CompiledProgrammableNode", "Abstract base class for compiled programmable nodes of a network.")]
    13188    public abstract class CompiledProgrammableNode : CompiledProgrammableNetworkItem, INode {
    132       protected new ProgrammableNode Context {
     89      #region Node Members
     90      new public INetwork Parent {
     91        get { return (INetwork)base.Parent; }
     92        set {
     93          // NOTE: never call setter directly as the Parent property is set by the network which contains the node
     94          base.Parent = value;
     95        }
     96      }
     97      public override IEnumerable<INetworkItem> Children {
     98        get { return base.Children.Concat(Ports.AsEnumerable<INetworkItem>()); }
     99      }
     100
     101      public PortCollection Ports {
     102        get { return Context.ports; }
     103      }
     104      IKeyedItemCollection<string, IPort> INode.Ports {
     105        get { return Ports; }
     106      }
     107      #endregion
     108
     109      new protected ProgrammableNode Context {
    133110        get { return (ProgrammableNode)base.Context; }
    134111      }
     
    136113      protected CompiledProgrammableNode(CompiledProgrammableNode original, Cloner cloner)
    137114        : base(original, cloner) {
     115        Context.ports = cloner.Clone(original.Context.ports);
    138116      }
    139117      protected CompiledProgrammableNode(ProgrammableNode context)
     
    141119      }
    142120
    143       #region INode Members
    144       public new INetwork Parent {
    145         get { return Context.Parent; }
    146         set {
    147           // NOTE: never call setter directly as the Parent property is set by the network which contains the node
    148           Context.Parent = value;
     121      protected virtual void MessagePort_MessageReceived(object sender, EventArgs<IMessage, CancellationToken> e) { }
     122
     123      #region Events
     124      public override void RegisterEvents() {
     125        base.RegisterEvents();
     126        Ports.ItemsAdded += Ports_ItemsAdded;
     127        Ports.ItemsRemoved += Ports_ItemsRemoved;
     128        Ports.ItemsReplaced += Ports_ItemsReplaced;
     129        Ports.CollectionReset += Ports_CollectionReset;
     130        foreach (var p in Ports) {
     131          p.Parent = this;
     132          RegisterPortEvents(p);
    149133        }
    150134      }
    151 
    152       public IKeyedItemCollection<string, IPort> Ports {
    153         get { return Context.Ports; }
     135      public override void DeregisterEvents() {
     136        foreach (var p in Ports) {
     137          DeregisterPortEvents(p);
     138          p.Parent = null;
     139        }
     140        Ports.ItemsAdded -= Ports_ItemsAdded;
     141        Ports.ItemsRemoved -= Ports_ItemsRemoved;
     142        Ports.ItemsReplaced -= Ports_ItemsReplaced;
     143        Ports.CollectionReset -= Ports_CollectionReset;
     144        base.DeregisterEvents();
     145      }
     146      protected virtual void Ports_ItemsAdded(object sender, Collections.CollectionItemsChangedEventArgs<IPort> e) {
     147        foreach (var p in e.Items) {
     148          p.Parent = this;
     149          RegisterPortEvents(p);
     150        }
     151      }
     152      protected virtual void Ports_ItemsRemoved(object sender, Collections.CollectionItemsChangedEventArgs<IPort> e) {
     153        foreach (var p in e.Items) {
     154          p.Parent = null;
     155          DeregisterPortEvents(p);
     156        }
     157      }
     158      protected virtual void Ports_ItemsReplaced(object sender, Collections.CollectionItemsChangedEventArgs<IPort> e) {
     159        foreach (var p in e.OldItems) {
     160          p.Parent = null;
     161          DeregisterPortEvents(p);
     162        }
     163        foreach (var p in e.Items) {
     164          p.Parent = this;
     165          RegisterPortEvents(p);
     166        }
     167      }
     168      protected virtual void Ports_CollectionReset(object sender, Collections.CollectionItemsChangedEventArgs<IPort> e) {
     169        foreach (var p in e.OldItems) {
     170          p.Parent = null;
     171          DeregisterPortEvents(p);
     172        }
     173        foreach (var p in e.Items) {
     174          p.Parent = this;
     175          RegisterPortEvents(p);
     176        }
    154177      }
    155178      #endregion
    156179
    157       #region Context Events
    158       protected override void RegisterContextEvents() {
    159         base.RegisterContextEvents();
    160         Context.Ports.ItemsAdded += Ports_ItemsAdded;
    161         Context.Ports.ItemsRemoved += Ports_ItemsRemoved;
    162         Context.Ports.ItemsReplaced += Ports_ItemsReplaced;
    163         Context.Ports.CollectionReset += Ports_CollectionReset;
    164         foreach (var p in Context.Ports)
    165           RegisterPortEvents(p);
    166       }
    167       protected override void DeregisterContextEvents() {
    168         foreach (var p in Context.Ports)
    169           DeregisterPortEvents(p);
    170         Context.Ports.ItemsAdded -= Ports_ItemsAdded;
    171         Context.Ports.ItemsRemoved -= Ports_ItemsRemoved;
    172         Context.Ports.ItemsReplaced -= Ports_ItemsReplaced;
    173         Context.Ports.CollectionReset -= Ports_CollectionReset;
    174         base.DeregisterContextEvents();
    175       }
    176       private void Ports_ItemsAdded(object sender, Collections.CollectionItemsChangedEventArgs<IPort> e) {
    177         foreach (var p in e.Items)
    178           RegisterPortEvents(p);
    179       }
    180       private void Ports_ItemsRemoved(object sender, Collections.CollectionItemsChangedEventArgs<IPort> e) {
    181         foreach (var p in e.Items)
    182           DeregisterPortEvents(p);
    183       }
    184       private void Ports_ItemsReplaced(object sender, Collections.CollectionItemsChangedEventArgs<IPort> e) {
    185         foreach (var p in e.OldItems)
    186           DeregisterPortEvents(p);
    187         foreach (var p in e.Items)
    188           RegisterPortEvents(p);
    189       }
    190       private void Ports_CollectionReset(object sender, Collections.CollectionItemsChangedEventArgs<IPort> e) {
    191         foreach (var p in e.OldItems)
    192           DeregisterPortEvents(p);
    193         foreach (var p in e.Items)
    194           RegisterPortEvents(p);
    195       }
     180      #region Port Events
    196181      protected virtual void RegisterPortEvents(IPort port) {
    197182        var mp = port as IMessagePort;
     
    204189          mp.MessageReceived -= MessagePort_MessageReceived;
    205190      }
    206       protected virtual void MessagePort_MessageReceived(object sender, EventArgs<IMessage, CancellationToken> e) { }
    207191      #endregion
    208192    }
Note: See TracChangeset for help on using the changeset viewer.