// TODO Wrap Arguments so that exception thrown to indicate invalid value // can be caught and presented to the user. // e.g. valueA now = fred, valueB can only be ethal or freda // // Arguments list members (count as well as values) can change depending on // values of other arguments. // So say, 1 argument firstly which is file name to another list of // arguments to then display. // OpenWEB // model file change throws exception saying reload required // pipistrelle reconises exception_openweb type and reloads automatically static List <UIConnection> DeserializeConnectionsV2(opr opr, List <UIModel> models, DirectoryInfo oprPath) { List <UIConnection> connections = new List <UIConnection>(); if (opr.connections == null) { return(connections); } Dictionary <string, UIAdaptedOutputItem> adaptedOutputs = new Dictionary <string, UIAdaptedOutputItem>(); UIInputItem target; UIModel uiSourceModel, uiTargetModel; UIConnection uiConnection; Dictionary <string, UIOutputItem> sources = new Dictionary <string, UIOutputItem>(); Dictionary <string, UIInputItem> targets = new Dictionary <string, UIInputItem>(); List <Link> links = new List <Link>(); foreach (oprConnection connection in opr.connections) { if (!connection.source_model_indexSpecified || !connection.target_model_indexSpecified) { throw new NotImplementedException("Incompletly specified connections"); } uiSourceModel = models[connection.source_model_index]; uiTargetModel = models[connection.target_model_index]; uiConnection = new UIConnection(uiSourceModel, uiTargetModel); connections.Add(uiConnection); sources.Clear(); targets.Clear(); foreach (ITimeSpaceOutput item in uiSourceModel.LinkableComponent.Outputs) { sources.Add(item.Id, new UIOutputItem(item)); } foreach (ITimeSpaceInput item in uiTargetModel.LinkableComponent.Inputs) { targets.Add(item.Id, new UIInputItem(item)); } # region delete later //nDecorators = connection.decorators != null ? connection.decorators.Length : 0; //ids = new string[nDecorators]; //oprFactories = new oprConnectionDecoratorFactory[nDecorators]; //oprArguments = new oprConnectionDecoratorArgument[nDecorators][]; //for (int n = 0; n < nDecorators; ++n) //{ // ids[n] = connection.decorators[n].item_id; // oprFactories[n] = connection.decorators[n].factory; // oprArguments[n] = connection.decorators[n].arguments; //} #endregion links = new List <Link>(); foreach (oprConnectionLink oprLink in connection.links) { target = targets[oprLink.target_item_id]; oprSourceItem srcItem = oprLink.source_item_id; List <UIOutputItem> sourcesm = new List <UIOutputItem>(); UIOutputItem source = BuildOutputItemChain(uiSourceModel.LinkableComponent, srcItem, connection.decorators, sources, adaptedOutputs, oprPath, target); foreach (oprSourceItem item in oprLink.source_item_ids) { UIOutputItem tempSrc = BuildOutputItemChain(uiSourceModel.LinkableComponent, item, connection.decorators, sources, adaptedOutputs, oprPath, target); sourcesm.Add(tempSrc); } // Just telling target about most decorated source, // not the intermediates (& visa versa). // Probably the safest option re ensuring UI works // in maximum number of cases. // Thats what the UIOuputItem.Parent attribute is for! // TODO ADH: However, might want // to make explicit in Standard? if (target.ExchangeItem is IBaseMultiInput) { IBaseMultiInput mtarget = (IBaseMultiInput)target.ExchangeItem; foreach (UIOutputItem tempout in sourcesm) { mtarget.AddProvider(tempout); tempout.AddConsumer(mtarget); } } else { target.Provider = source; source.AddConsumer(target); } Link tempLink = new Link(sourcesm, target); //tempLink.Source = source; links.Add(tempLink); } uiConnection.Links = links; }
static oprConnectionLink[] Links(UIConnection connection, List <UIAdaptedOutputItem> allAdaptersInConnection) { oprConnectionLink[] links = new oprConnectionLink[connection.Links.Count]; UIOutputItem source; for (int n = 0; n < connection.Links.Count; ++n) { Link link = connection.Links[n]; source = link.Source; oprConnectionLink oprLink = new oprConnectionLink() { target_item_id = link.Target.Id }; oprSourceItem source_item = new oprSourceItem() { source_item_id = source.Id, source_item_is_adaptedoutput = source is UIAdaptedOutputItem, source_item_adpatedoutput_index = source is UIAdaptedOutputItem?allAdaptersInConnection.IndexOf(source as UIAdaptedOutputItem) : -1, }; oprLink.source_item_id = source_item; source = source.Parent; while (source != null) { oprSourceItem tempItem = new oprSourceItem() { source_item_id = source.Id, source_item_is_adaptedoutput = source is UIAdaptedOutputItem, source_item_adpatedoutput_index = source is UIAdaptedOutputItem?allAdaptersInConnection.IndexOf(source as UIAdaptedOutputItem) : -1, }; source_item.parent_item_id = tempItem; source_item = tempItem; source = source.Parent; } oprSourceItem[] source_items = new oprSourceItem[link.Sources.Count]; for (int i = 0; i < source_items.Length; i++) { source = link.Sources[i]; source_item = new oprSourceItem() { source_item_id = source.Id, source_item_is_adaptedoutput = source is UIAdaptedOutputItem, source_item_adpatedoutput_index = source is UIAdaptedOutputItem?allAdaptersInConnection.IndexOf(source as UIAdaptedOutputItem) : -1, }; source = source.Parent; source_items[i] = source_item; while (source != null) { oprSourceItem tempItem = new oprSourceItem() { source_item_id = source.Id, source_item_is_adaptedoutput = source is UIAdaptedOutputItem, source_item_adpatedoutput_index = source is UIAdaptedOutputItem?allAdaptersInConnection.IndexOf(source as UIAdaptedOutputItem) : -1, }; source_item.parent_item_id = tempItem; source_item = tempItem; source = source.Parent; } } oprLink.source_item_ids = source_items; links[n] = oprLink; } return(links); }