Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
11/10/14 04:24:04 (9 years ago)
Author:
swagner
Message:

#2205: Implemented review comments

  • renamed GenericPort to MessagePort
  • refactored CanConnectToPort
  • refactored PrepareMessage
  • removed IConnectedPort

Additional changes:

  • added UserDefinedMessagePort
  • refactored CloneConnectedPortParameters to CloneParametersFromPort and moved it to ParameterizedPort
  • added ports to NetworkView
File:
1 moved

Legend:

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

    r11529 r11530  
    2323using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
    2424using System;
     25using System.Collections.Generic;
    2526using System.Drawing;
    2627using System.Linq;
     
    2930
    3031namespace HeuristicLab.Core.Networks {
    31   [Item("GenericPort", "A generic port of an optimization network node.")]
     32  [Item("MessagePort", "A port of a network node for sending and receiving messages.")]
    3233  [StorableClass]
    33   public class GenericPort : ParameterizedPort, IGenericPort, IConnectedPort {
     34  public class MessagePort : ParameterizedPort, IMessagePort {
    3435    public override Image ItemImage {
    3536      get {
     
    4445
    4546    [Storable]
    46     protected IConnectedPort connectedPort;
    47     public IConnectedPort ConnectedPort {
     47    protected IMessagePort connectedPort;
     48    public IMessagePort ConnectedPort {
    4849      get { return connectedPort; }
    4950      set {
     
    8788
    8889    [StorableConstructor]
    89     protected GenericPort(bool deserializing) : base(deserializing) { }
    90     protected GenericPort(GenericPort original, Cloner cloner)
     90    protected MessagePort(bool deserializing) : base(deserializing) { }
     91    protected MessagePort(MessagePort original, Cloner cloner)
    9192      : base(original, cloner) {
    9293      connectedPort = cloner.Clone(original.connectedPort);
     
    9697      RegisterConnectedPortEvents();
    9798    }
    98     public GenericPort()
    99       : base("GenericPort") {
     99    public MessagePort()
     100      : base("MessagePort") {
    100101      portConnectionValid = true;
    101102      logMessages = false;
    102103      messages = new MessageCollection();
    103104    }
    104     public GenericPort(string name)
     105    public MessagePort(string name)
    105106      : base(name) {
    106107      portConnectionValid = true;
     
    108109      messages = new MessageCollection();
    109110    }
    110     public GenericPort(string name, string description)
     111    public MessagePort(string name, string description)
    111112      : base(name, description) {
    112113      portConnectionValid = true;
     
    121122
    122123    public override IDeepCloneable Clone(Cloner cloner) {
    123       return new GenericPort(this, cloner);
     124      return new MessagePort(this, cloner);
    124125    }
    125126
     
    127128      if (port == null) return true;
    128129
    129       var cp = port as IConnectedPort;
    130       if (cp == null) return false;
    131 
    132       // check connected port input parameters
    133       foreach (var input in cp.Parameters.Where(p => p.Type.HasFlag(PortParameterType.Input))) {
    134         IPortParameter param;
    135         Parameters.TryGetValue(input.Name, out param);
    136         if ((param == null) && (input.DefaultValue == null)) return false;
    137         if (!param.Type.HasFlag(PortParameterType.Output)) return false;
    138         if (!input.DataType.IsAssignableFrom(param.DataType)) return false;
    139       }
    140       // check local port input parameters
    141       foreach (var input in Parameters.Where(p => p.Type.HasFlag(PortParameterType.Input))) {
    142         IPortParameter param;
    143         cp.Parameters.TryGetValue(input.Name, out param);
    144         if ((param == null) && (input.DefaultValue == null)) return false;
    145         if (!param.Type.HasFlag(PortParameterType.Output)) return false;
    146         if (!input.DataType.IsAssignableFrom(param.DataType)) return false;
    147       }
     130      var p = port as IMessagePort;
     131      if (p == null) return false;
     132
     133      // check if the local parameters are compatible to the input parameters of the port
     134      if (!ParametersCompatibleToTarget(Parameters, p.Parameters)) return false;
     135      // check if the parameters of the port are compatible to the local input parameters
     136      if (!ParametersCompatibleToTarget(p.Parameters, Parameters)) return false;
     137
    148138      return true;
    149     }
    150     public void CloneConnectedPortParameters() {
    151       Parameters.Clear();
    152       foreach (var p in connectedPort.Parameters) {
    153         var param = (IPortParameter)p.Clone();
    154         if (!(param.Type.HasFlag(PortParameterType.Input) && param.Type.HasFlag(PortParameterType.Output))) {
    155           param.Type = ~param.Type;  // bitwise negation: input -> output, output -> input
    156         }
    157         Parameters.Add(param);
    158       }
    159139    }
    160140
     
    163143      var message = new Message();
    164144
    165       // collect output parameters from local port
    166       message.Values.AddRange(
    167         Parameters
    168           .Where(p => p.Type.HasFlag(PortParameterType.Output))
    169           .Select(p => p.CreateMessageValue())
    170       );
    171 
    172       // collect remaining input parameters from connected port
     145      // collect parameters from local port
     146      message.Values.AddRange(Parameters.Select(p => p.CreateMessageValue()));
     147
     148      // collect remaining parameters from connected port
    173149      if (ConnectedPort != null) {
    174150        message.Values.AddRange(
    175151          ConnectedPort.Parameters
    176             .Where(p => p.Type.HasFlag(PortParameterType.Input) && !message.Values.ContainsKey(p.Name))
     152            .Where(p => !message.Values.ContainsKey(p.Name))
    177153            .Select(p => p.CreateMessageValue())
    178154        );
    179155      }
    180 
    181       // collect output parameters from connected port
    182       if (ConnectedPort != null) {
    183         message.Values.AddRange(
    184           ConnectedPort.Parameters
    185             .Where(p => p.Type.HasFlag(PortParameterType.Output) && !message.Values.ContainsKey(p.Name))
    186             .Select(p => p.CreateMessageValue())
    187         );
    188       }
    189 
    190       // collect remaining input parameters from local port
    191       message.Values.AddRange(
    192         Parameters
    193           .Where(p => p.Type.HasFlag(PortParameterType.Input) && !message.Values.ContainsKey(p.Name))
    194           .Select(p => p.CreateMessageValue())
    195       );
    196156
    197157      return message;
     
    270230    }
    271231    #endregion
     232
     233    #region Helpers
     234    protected virtual bool ParametersCompatibleToTarget(IEnumerable<IPortParameter> source, IEnumerable<IPortParameter> target) {
     235      // checks if the source parameters are compatible to the input parameters of the target
     236      foreach (var input in target.Where(p => p.Type.HasFlag(PortParameterType.Input))) {
     237        var param = source.Where(p => input.Name == p.Name).FirstOrDefault();
     238        if (param == null) {
     239          if (input.DefaultValue == null) return false;
     240        } else {
     241          if (!param.Type.HasFlag(PortParameterType.Output)) return false;
     242          if (!input.DataType.IsAssignableFrom(param.DataType)) return false;
     243        }
     244      }
     245      return true;
     246    }
     247    #endregion
    272248  }
    273249}
Note: See TracChangeset for help on using the changeset viewer.