예제 #1
0
        // 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;
            }
예제 #2
0
        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);
        }