static IList <InterfaceSliceType> createApplicationComponentAbstractInterfaceSlices(IList <Tuple <string, string, EnvironmentPortType> > bindings_application)
        {
            int port_counter = 0;

            IList <InterfaceSliceType> slices_list = new List <InterfaceSliceType> ();

            foreach (Tuple <string, string, EnvironmentPortType> binding in bindings_application)
            {
                string port_name       = binding.Item2 + (port_counter++);
                string slice_unit_name = Constants.envUnitName[binding.Item3];

                InterfaceSliceType s = new InterfaceSliceType();
                s.isRef             = port_name;
                s.originRef         = new InterfaceRefType();
                s.originRef.cRef    = port_name;
                s.originRef.iRef    = Constants.envInterfaceName[binding.Item3];
                s.visualDescription = null;
                slices_list.Add(s);
            }

            return(slices_list);
        }
        static void createSystemComponentAbstractUnit(IList <object> body_items,
                                                      IDictionary <string, InstanceType> component_refs,
                                                      IDictionary <ProxyComponentAttribute, string> application_attributes,
                                                      IDictionary <ProxyComponentAttribute, string> workflow_attributes,
                                                      IList <Tuple <string, string, EnvironmentPortType> > bindings_application,
                                                      IList <Tuple <string, string, EnvironmentPortType> > bindings_workflow)
        {
            IDictionary <int, SliceList> unit_mapping = new Dictionary <int, SliceList> ();

            foreach (InstanceType c in component_refs.Values)
            {
                string cRef = c.contextual_type.component_ref;
                foreach (UnitMappingType u in c.unit_mapping)
                {
                    string uRef = u.unit_id;
                    foreach (int n in u.node)
                    {
                        AbstractComponentFunctor acf  = backend.DGAC.BackEnd.acfdao.retrieve_libraryPath(cRef);
                        string   qualified_class_name = backend.DGAC.BackEnd.idao.retrieve(acf.Id_abstract, uRef, 0).Class_name;
                        string[] parts_class_name     = qualified_class_name.Split(new char[] { '.' });
                        string   iRef = parts_class_name[parts_class_name.Length - 1];

                        bool      hasNode       = unit_mapping.ContainsKey(n);
                        SliceList units_at_node = hasNode ? unit_mapping[n] : new SliceList();

                        units_at_node.Value.Add(new Tuple <string, string, string>(cRef, uRef, iRef));
                        if (!hasNode)
                        {
                            unit_mapping.Add(n, units_at_node);
                        }
                    }
                }
            }

            IDictionary <SliceList, IList <int> > slice_mapping = new Dictionary <SliceList, IList <int> > ();

            foreach (KeyValuePair <int, SliceList> r in unit_mapping)
            {
                bool        hasSlice  = slice_mapping.ContainsKey(r.Value);
                IList <int> node_list = hasSlice ? slice_mapping [r.Value] : new List <int> ();
                node_list.Add(r.Key);
                if (!hasSlice)
                {
                    slice_mapping.Add(r.Value, node_list);
                }
            }

            // PEER UNITS
            int unit_counter = 0;

            foreach (KeyValuePair <SliceList, IList <int> > r in slice_mapping)
            {
                string uname = "peer" + (unit_counter++);
                string iname = "IPeer" + (unit_counter++);

                UnitType cu = new UnitType();
                cu.facet            = 0;
                cu.iRef             = iname;
                cu.multiple         = true;
                cu.@private         = false;
                cu.replica          = 0;
                cu.uRef             = uname;
                cu.visibleInterface = true;

                InterfaceType ct = new InterfaceType();
                ct.iRef    = iname;
                ct.nArgs   = 0;
                ct.sources = null;                 //?

                IDictionary <Tuple <string, string, string>, int> slice_counter = new Dictionary <Tuple <string, string, string>, int> ();

                IList <UnitSliceType>      uslices_list = new List <UnitSliceType> ();
                IList <InterfaceSliceType> islices_list = new List <InterfaceSliceType> ();

                foreach (Tuple <string, string, string> slice in r.Key.Value)
                {
                    string cRef = component_refs [slice.Item1].instance_ref;

                    bool hasSlice      = slice_counter.ContainsKey(slice);
                    int  slice_replica = hasSlice ? slice_counter [slice] : 0;
                    if (hasSlice)
                    {
                        slice_counter.Remove(slice);
                    }
                    slice_counter.Add(slice, slice_replica + 1);

                    UnitSliceType us = new UnitSliceType();
                    us.cRef          = cRef;
                    us.uRef          = slice.Item2;
                    us.sliceName     = cRef;
                    us.slice_replica = slice_replica;
                    us.transitive    = false;
                    uslices_list.Add(us);

                    InterfaceSliceType fs = new InterfaceSliceType();
                    fs.isRef          = cRef;
                    fs.originRef      = new InterfaceRefType();
                    fs.originRef.cRef = cRef;
                    fs.originRef.iRef = slice.Item3;
                    islices_list.Add(fs);
                }

                cu.slices = new UnitSliceType[uslices_list.Count];
                uslices_list.CopyTo(cu.slices, 0);

                ct.slice = new InterfaceSliceType[islices_list.Count];
                islices_list.CopyTo(ct.slice, 0);

                body_items.Add(ct);

                body_items.Add(cu);
            }

            IList <UnitSliceType>      uslices_root_list = new List <UnitSliceType> ();
            IList <InterfaceSliceType> islices_root_list = new List <InterfaceSliceType> ();

            // ROOT UNIT
            UnitType ru = new UnitType();

            ru.facet            = 0;
            ru.iRef             = "IRoot";
            ru.multiple         = false;
            ru.@private         = false;
            ru.replica          = 0;
            ru.uRef             = "root";
            ru.visibleInterface = true;

            // APPLICATION UNIT SLICE OF THE ROOT UNIT
            UnitSliceType u_slice_app = new UnitSliceType();

            u_slice_app.cRef          = application_attributes[ProxyComponentAttribute.INNER_COMPONENT_NAME];
            u_slice_app.uRef          = application_attributes[ProxyComponentAttribute.UNIT_NAME_ABSTRACT];
            u_slice_app.sliceName     = u_slice_app.cRef;
            u_slice_app.slice_replica = 0;
            u_slice_app.transitive    = false;
            uslices_root_list.Add(u_slice_app);

            // WORKFLOW UNIT SLICE OF THE ROOT UNIT
            UnitSliceType u_slice_wrf = new UnitSliceType();

            u_slice_wrf.cRef          = workflow_attributes[ProxyComponentAttribute.INNER_COMPONENT_NAME];
            u_slice_wrf.uRef          = workflow_attributes[ProxyComponentAttribute.UNIT_NAME_ABSTRACT];
            u_slice_wrf.sliceName     = u_slice_wrf.cRef;
            u_slice_wrf.slice_replica = 0;
            u_slice_wrf.transitive    = false;
            uslices_root_list.Add(u_slice_wrf);

            // ROOT UNIT INTERFACE
            InterfaceType rt = new InterfaceType();

            rt.iRef    = "IRoot";
            rt.nArgs   = 0;
            rt.sources = null;             //??

            // APPLICATION INTERFACE SLICE OF THE ROOT UNIT
            InterfaceSliceType i_slice_app = new InterfaceSliceType();

            i_slice_app.isRef          = u_slice_app.cRef;
            i_slice_app.originRef      = new InterfaceRefType();
            i_slice_app.originRef.cRef = u_slice_app.cRef;
            i_slice_app.originRef.iRef = application_attributes[ProxyComponentAttribute.INTERFACE_NAME_ABSTRACT];
            islices_root_list.Add(i_slice_app);

            // WORKFLOW INTERFACE SLICE OF THE ROOT UNIT
            InterfaceSliceType i_slice_wrf = new InterfaceSliceType();

            i_slice_wrf.isRef          = u_slice_wrf.cRef;
            i_slice_wrf.originRef      = new InterfaceRefType();
            i_slice_wrf.originRef.cRef = u_slice_wrf.cRef;
            i_slice_wrf.originRef.iRef = workflow_attributes[ProxyComponentAttribute.INTERFACE_NAME_ABSTRACT];
            islices_root_list.Add(i_slice_wrf);

            IList <InterfacePortType> iports_root_list = new List <InterfacePortType> ();

            int counter = 0;

            // TRANSITIVE SLICES (environment ports) OF THE APPLICATION SLICE
            foreach (Tuple <string, string, EnvironmentPortType> slice in bindings_application)
            {
                string port_name = slice.Item2 + (counter++);

                // UNIT SLICES
                UnitSliceType us = new UnitSliceType();
                us.cRef          = port_name;
                us.uRef          = Constants.envUnitName[slice.Item3];
                us.sliceName     = port_name;
                us.slice_replica = 0;
                us.transitive    = true;
                uslices_root_list.Add(us);

                // INTERFACE PORTS (TRANSITIVE SLICES)
                InterfacePortType fs = new InterfacePortType();
                fs.name          = port_name;
                fs.slice         = new PortSliceType[1];
                fs.slice[0].pRef = application_attributes[ProxyComponentAttribute.INNER_COMPONENT_NAME];
                fs.slice[0].sRef = port_name;
                iports_root_list.Add(fs);
            }

            counter = 0;

            // TRANSITIVE SLICES (environment ports) OF THE WORKFLOW SLICE
            foreach (Tuple <string, string, EnvironmentPortType> slice in bindings_workflow)
            {
                string port_name = slice.Item2 + (counter++);

                // UNIT SLICES
                UnitSliceType us = new UnitSliceType();
                us.cRef          = port_name;
                us.uRef          = Constants.envUnitName[slice.Item3];
                us.sliceName     = port_name;
                us.slice_replica = 0;
                us.transitive    = true;
                uslices_root_list.Add(us);

                // INTERFACE PORTS (TRANSITIVE SLICES)
                InterfacePortType fs = new InterfacePortType();
                fs.name          = port_name;
                fs.slice         = new PortSliceType[1];
                fs.slice[0].pRef = workflow_attributes[ProxyComponentAttribute.INNER_COMPONENT_NAME];
                fs.slice[0].sRef = port_name;
                iports_root_list.Add(fs);
            }

            ru.slices = new UnitSliceType[uslices_root_list.Count];
            uslices_root_list.CopyTo(ru.slices, 0);

            rt.slice = new InterfaceSliceType[islices_root_list.Count];
            islices_root_list.CopyTo(rt.slice, 0);

            rt.port = new InterfacePortType[iports_root_list.Count];
            iports_root_list.CopyTo(rt.port, 0);
        }