static void createApplicationComponentAbstractInner(IList <object> body_items, IList <Tuple <string, string, EnvironmentPortType> > bindings_application, ref IList <string> port_names)
        {
            int port_count = 0;

            port_names = new List <string> ();

            foreach (Tuple <string, string, EnvironmentPortType> binding in bindings_application)
            {
                string componentRef = binding.Item1;
                string port_name    = binding.Item2;

                // search for the type of the component connected to the application through the environment port
                AbstractComponentFunctor acf = backend.DGAC.BackEnd.acfdao.retrieve_libraryPath(componentRef);

                // search for the type of the environment port in the inner component.
                InnerComponent           ic        = backend.DGAC.BackEnd.icdao.retrieve(acf.Id_abstract, port_name);
                AbstractComponentFunctor acf_inner = backend.DGAC.BackEnd.acfdao.retrieve(ic.Id_abstract_inner);
                String library_path = acf_inner.Library_path;

                InnerComponentType ci = new InnerComponentType();
                ci.package  = acf_inner.Package;
                ci.name     = acf_inner.Name;
                ci.localRef = port_name + (port_count++);
                ci.multiple = false;
                ci.exposed  = true;

                port_names.Add(ci.localRef);

                body_items.Add(ci);
            }
        }
 protected bool isNotInSupply(InnerComponentType c)
 {
     if (parameterSupply != null)
     {
         foreach (ParameterSupplyType s in parameterSupply)
         {
             if (s.cRef.Equals(c.localRef))
             {
                 return(false);
             }
         }
     }
     return(true);
 }
 private bool isNotParameter(InnerComponentType c)
 {
     if (this.parameter != null)
     {
         foreach (ParameterType s in parameter)
         {
             if (s.componentRef.Equals(c.localRef))
             {
                 return(false);
             }
         }
     }
     return(true);
 }
        static void createSystemComponentAbstractInner(string app_name,
                                                       IList <object> body_items,
                                                       IDictionary <string, InstanceType> component_refs,
                                                       IDictionary <ProxyComponentAttribute, string> application_attributes,
                                                       IDictionary <ProxyComponentAttribute, string> workflow_attributes)
        {
            // APPLICARTION PROXY COMPONENT
            InnerComponentType ci_app = new InnerComponentType();

            ci_app.package  = app_name;
            ci_app.name     = application_attributes[ProxyComponentAttribute.COMPONENT_NAME_ABSTRACT];
            ci_app.localRef = application_attributes[ProxyComponentAttribute.INNER_COMPONENT_NAME];
            ci_app.multiple = false;
            ci_app.exposed  = false;
            body_items.Add(ci_app);

            // WORKFLOW PROXY COMPONENT
            InnerComponentType ci_wkf = new InnerComponentType();

            ci_wkf.package  = app_name;
            ci_wkf.name     = workflow_attributes[ProxyComponentAttribute.COMPONENT_NAME_ABSTRACT];
            ci_wkf.localRef = workflow_attributes[ProxyComponentAttribute.INNER_COMPONENT_NAME];
            ci_wkf.multiple = false;
            ci_wkf.exposed  = false;
            body_items.Add(ci_wkf);

            // REGULAR COMPONENTS
            foreach (KeyValuePair <string, InstanceType> binding in component_refs)
            {
                string componentRef = binding.Key;
                string port_name    = binding.Value.instance_ref;

                string package = null, name = null;
                fetchPackageAndName(componentRef, ref package, ref name);

                InnerComponentType ci = new InnerComponentType();
                ci.package   = package;
                ci.name      = name;
                ci.localRef  = port_name;
                ci.multiple  = false;
                ci.exposed   = false;
                ci.parameter = traverseParameters(body_items, binding.Value.contextual_type.argument);

                body_items.Add(ci);
            }
        }
        static ParameterRenaming[] traverseParameters(IList <object> body_items, ContextArgumentType[] argument_list)
        {
            IList <ParameterRenaming> parameter_renaming_list = new List <ParameterRenaming> ();

            foreach (ContextArgumentType argument in argument_list)
            {
                ParameterRenaming parameter_renaming = new ParameterRenaming();

                ComponentFunctorApplicationType argument_value = (ComponentFunctorApplicationType)argument.Item;

                string componentRef = argument_value.component_ref;
                string inner_name   = NextArgumentInner;

                string package = null, name = null;
                fetchPackageAndName(componentRef, ref package, ref name);

                InnerComponentType ci = new InnerComponentType();
                body_items.Add(ci);
                ci.package   = package;
                ci.name      = name;
                ci.localRef  = inner_name;
                ci.multiple  = false;
                ci.exposed   = false;
                ci.parameter = traverseParameters(body_items, argument_value.argument);

                ParameterSupplyType supply = new ParameterSupplyType();
                body_items.Add(supply);
                supply.cRef    = inner_name;
                supply.varName = NextVariable;

                parameter_renaming.formFieldId = argument.parameter_id;
                parameter_renaming.varName     = supply.varName;

                parameter_renaming_list.Add(parameter_renaming);
            }

            ParameterRenaming[] parameter_return_array = new ParameterRenaming[parameter_renaming_list.Count];
            parameter_renaming_list.CopyTo(parameter_return_array, 0);
            return(parameter_return_array);
        }
        protected IList <SupplyParameter> loadAbstractComponentFunctorApplicationParameters(ComponentInUseType c,
                                                                                            AbstractComponentFunctorApplication aNew,
                                                                                            AbstractComponentFunctorApplication aNew_context)
        {
            IList <SupplyParameter> pars = new List <SupplyParameter>();

            if (c.parameter != null)
            {
                foreach (ParameterRenaming p in c.parameter)
                {
                    String formFieldId = p.formFieldId;
                    String varName     = p.varName;
                    Console.WriteLine("loadAbstractcomponentFunctorApplicationParameters -1 " + varName + "," + formFieldId);

                    SupplyParameter p_ = null;

                    ParameterType       topParameter = lookForParameterByVarName(varName);
                    ParameterSupplyType s            = lookForSupplyForVarName(varName);

                    if (topParameter != null)
                    {
                        Console.WriteLine("loadAbstractcomponentFunctorApplicationParameters 0 " + topParameter.formFieldId + ", " + varName);
                        p_ = new SupplyParameterParameter();
                        ((SupplyParameterParameter)p_).Id_argument  = topParameter.formFieldId;
                        ((SupplyParameterParameter)p_).FreeVariable = false;
                    }
                    else if (s != null)
                    {
                        Console.WriteLine("loadAbstractcomponentFunctorApplicationParameters 1 " + s.cRef + ", " + varName);
                        String cRef = s.cRef;

                        p_ = new SupplyParameterComponent();
                        // Look for the inner component that supplies that parameter.
                        InnerComponentType inner = lookForInnerComponent(cRef);
                        AbstractComponentFunctorApplication cPar = newAbstractComponentFunctorApplication(inner);
                        if (cPar == null)
                        {
                            throw new Exception("DEPLOY ERROR: Unresolved Dependency for base component (context actual parameter) : " + inner.name);
                        }
                        ((SupplyParameterComponent)p_).Id_functor_app_actual = cPar.Id_functor_app;
                    }
                    else
                    {
                        Console.WriteLine("loadAbstractcomponentFunctorApplicationParameters 2 " + varName);
                        p_ = new SupplyParameterParameter();
                        ((SupplyParameterParameter)p_).Id_argument  = null;
                        ((SupplyParameterParameter)p_).FreeVariable = true;
                    }


                    p_.Id_functor_app = aNew.Id_functor_app;
                    p_.Id_abstract    = aNew.Id_abstract;
                    p_.Id_parameter   = formFieldId;

                    //   SupplyParameterDAO p_DAO = new SupplyParameterDAO();
                    br.ufc.pargo.hpe.backend.DGAC.BackEnd.spdao.insert(p_);

                    pars.Add(p_);
                }
            }

            loadSuppliedParametersOfSupertype(c, aNew, aNew_context);

            return(pars);
        }
        private void loadInterfaces(AbstractComponentFunctor absC)
        {
            if (unit != null)
            {
                int count = 0;
                // for each interface ...
                foreach (UnitType u in unit)
                {
                    string uRef = u.uRef;
                    string iRef = u.iRef;

                    string uRefSuper = u.super == null || u.super.Length == 0 ? "" : u.super[0].uRef;
                    if (u.super != null)
                    {
                        for (int j = 1; j < u.super.Length; j++)
                        {
                            uRefSuper += "+" + u.super[j].uRef;
                        }
                    }

                    InterfaceType ui    = lookForInterface(iRef);
                    int           nargs = ui.nArgsSpecified ? ui.nArgs : 0;

                    Console.Error.WriteLine("STEP 5.3");

                    Interface i = new Interface();
                    i.Id_abstract  = absC.Id_abstract;
                    i.Id_interface = uRef;
//					i.Unit_replica = unit_replica;
                    i.Facet = u.facet;
                    i.Id_interface_super = uRefSuper;
                    i.Class_name         = xc.header.packagePath + "." + xc.header.name + "." + iRef;
                    i.Class_nargs        = nargs;                                               // TODO
                    i.Assembly_string    = i.Class_name + ", Culture=neutral, Version=0.0.0.0"; // In the current implementation, the name of the dll is the name of the class of the unit.
                    i.Order       = ++count;
                    i.Is_parallel = u.multiple;

                    Console.Error.WriteLine("STEP 5.4");

                    if (ui.parameter != null)
                    {
                        Console.Error.WriteLine("STEP 5.4 - " + ui.parameter);

                        foreach (InterfaceParameterType ipx in ui.parameter)
                        {
                            Console.Error.WriteLine("STEP 5.4 BEGIN 1- " + ipx.parid);
                            InterfaceParameter ip = new InterfaceParameter();
                            Console.Error.WriteLine("STEP 5.4 BEGIN 2- " + ipx.parid);
                            ip.Id_abstract            = i.Id_abstract;
                            ip.Id_interface           = i.Id_interface;
                            ip.ParId                  = ipx.parid;
                            ip.VarId                  = ipx.varid;
                            ip.Id_interface_parameter = ipx.iname;
                            ip.Id_unit_parameter      = ipx.uname;
                            ip.ParOrder               = ipx.order;
                            br.ufc.pargo.hpe.backend.DGAC.BackEnd.ipdao.insert(ip);
                            Console.Error.WriteLine("STEP 5.4 END - " + ipx.parid);
                        }
                    }

                    Console.Error.WriteLine("BEFORE STEP 5.5 " + (ui == null));
                    Console.Error.WriteLine("STEP 5.5 --- " + (ui.sources[ui.sources.Length - 1].file == null));
                    int order = 0;
                    foreach (SourceFileType sft in ui.sources[ui.sources.Length - 1].file)
                    {
                        Console.Error.WriteLine("STEP 5.5.0");
                        SourceCode ss = new SourceCode();
                        ss.Type_owner         = 'i';
                        ss.Id_owner_container = i.Id_abstract;
                        ss.Id_owner           = i.Id_interface;
                        ss.Contents           = sft.contents;
                        ss.File_name          = sft.name;
                        ss.File_type          = "dll";
                        ss.Order = order++;

                        Console.Error.WriteLine("STEP 5.5.1");

                        br.ufc.pargo.hpe.backend.DGAC.BackEnd.scdao.insert(ss);
                        int size = (sft.externalDependency == null ? 0 : sft.externalDependency.Length) +
                                   (ui.externalReferences == null ? 0 : ui.externalReferences.Length);

                        Console.Error.WriteLine("STEP 5.5.2");
                        if (size > 0)
                        {
                            string[] allRefs = new string[size];
                            if (ui.externalReferences != null)
                            {
                                ui.externalReferences.CopyTo(allRefs, 0);
                            }

                            if (sft.externalDependency != null)
                            {
                                sft.externalDependency.CopyTo(allRefs, ui.externalReferences == null ? 0 : ui.externalReferences.Length);
                            }

                            Console.Error.WriteLine("STEP 5.5.3");
                            foreach (string extRef in allRefs)
                            {
                                Console.WriteLine("external reference = " + extRef);
                                SourceCodeReference ssr = new SourceCodeReference();
                                ssr.Type_owner         = ss.Type_owner;
                                ssr.Id_owner_container = ss.Id_owner_container;
                                ssr.Id_owner           = ss.Id_owner;
                                ssr.File_name          = ss.File_name;
                                ssr.Reference          = extRef;
                                if (br.ufc.pargo.hpe.backend.DGAC.BackEnd.scrdao.retrieve(ssr) == null)
                                {
                                    br.ufc.pargo.hpe.backend.DGAC.BackEnd.scrdao.insert(ssr);
                                }
                            }
                            Console.Error.WriteLine("STEP 5.5.4");
                        }
                    }

                    Console.Error.WriteLine("STEP 5.6");
                    br.ufc.pargo.hpe.backend.DGAC.BackEnd.idao.insert(i);
                    if (u.slices != null)
                    {
                        IList <string> mS = new List <string>();
                        IList <String> mP = new List <string>();
                        IDictionary <string, UnitSliceType> m = new Dictionary <string, UnitSliceType>();


                        // 1st PASS: COLLECT ALL MAPPINGS SLICE/EXPOSED SLICES
                        foreach (UnitSliceType uS in u.slices)
                        {
                            string sliceName = uS.sliceName;
                            if (uS.port != null)
                            {
                                foreach (string portName in uS.port)
                                {
                                    mS.Add(sliceName);
                                    mP.Add(portName);
                                }
                            }
                        }

                        // 2nd PASS:
                        foreach (UnitSliceType uS in u.slices)
                        {
                            string sliceName = uS.sliceName;
                            if (mP.Contains(sliceName) && !m.ContainsKey(sliceName))
                            {
                                Console.Error.WriteLine("ADDING " + sliceName + " TO m");
                                m.Add(sliceName, uS);
                            }
                        }

                        Console.Error.WriteLine("STEP 5.7");
                        // 3rd PASS:
                        foreach (UnitSliceType uS in u.slices)
                        {
                            string sname = uS.sliceName;
                            string cRefS = uS.cRef;
                            string uRefS = uS.uRef;

                            InnerComponentType innerC = lookForInnerComponent(cRefS);
                            Console.Error.WriteLine("STEP 5.8");

                            InnerComponent inner = br.ufc.pargo.hpe.backend.DGAC.BackEnd.icdao.retrieve(absC.Id_abstract, cRefS);
                            Console.Error.WriteLine("STEP 5.9 ---" + absC.Id_abstract + "," + cRefS);

                            Interface iii = br.ufc.pargo.hpe.backend.DGAC.BackEnd.idao.retrieveTop(inner.Id_abstract_inner, uRefS);
                            Console.Error.WriteLine("STEP 5.9.5 ---" + (iii == null));

                            Slice s = new Slice();
                            s.Id_abstract        = absC.Id_abstract;
                            s.Id_inner           = innerC.localRef;
                            s.Id_interface_slice = iii == null ? uRefS : iii.Id_interface;
                            s.Id_interface       = uRef;
                            s.Transitive         = mP.Contains(sname);
                            Console.Error.WriteLine("STEP 5.10");

                            string property_name = uS.sliceName;
                            string fstletter     = property_name.Substring(0, 1);
                            property_name = fstletter.ToUpper() + property_name.Substring(1, property_name.Length - 1);

                            Console.Error.WriteLine("STEP 5.11");

                            s.PortName = property_name;

                            if (!s.Transitive && uS.port != null)
                            {
                                Console.Error.WriteLine("STEP 5.12");
                                foreach (string pname in uS.port)
                                {
                                    Console.Error.WriteLine("STEP 5.12.1 -- " + pname + ", " + (m.Count));

                                    UnitSliceType usPort = null;
                                    m.TryGetValue(pname, out usPort);
                                    Console.Error.WriteLine("STEP 5.12.2 -- " + pname + ", " + (usPort == null));

                                    Console.Error.WriteLine("STEP 5.12.5 -- " + usPort.cRef);

                                    InnerComponentType innerCPort = lookForInnerComponent(usPort.cRef);

                                    Console.Error.WriteLine("STEP 5.13");

                                    InnerComponent inner2 = br.ufc.pargo.hpe.backend.DGAC.BackEnd.icdao.retrieve(absC.Id_abstract, usPort.cRef);
                                    Interface      iii2   = br.ufc.pargo.hpe.backend.DGAC.BackEnd.idao.retrieveTop(inner2.Id_abstract_inner, usPort.uRef);

                                    SliceExposed se = new SliceExposed();
                                    se.Id_abstract              = s.Id_abstract;
                                    se.Id_inner                 = innerCPort.localRef;
                                    se.Id_inner_owner           = s.Id_inner;
                                    se.Id_interface_slice_owner = s.Id_interface_slice_top; // mudado de s.Id_interface_slice em 28/06/2011
                                    se.Id_interface_slice       = iii2 == null ? usPort.uRef : iii2.Id_interface;

                                    // achar innerRenaming para cNewName = usPort.cRef e cRef = cRefS (uS.cRef) -- Id_inner_original = cOldName
                                    string id_inner_original = lookForRenamingOld(cRefS, usPort.cRef, usPort.inner_replica);
                                    se.Id_inner_original           = id_inner_original != null ? id_inner_original : usPort.cRef;
                                    se.Id_interface_slice_original = usPort.uRef; // DEVE SER O TOP !!!
                                    if (br.ufc.pargo.hpe.backend.DGAC.BackEnd.sedao.retrieve2(se.Id_inner,
                                                                                              se.Id_interface_slice,
                                                                                              se.Id_abstract,
                                                                                              se.Id_interface_slice_owner,
                                                                                              se.Id_inner_owner) == null)
                                    {
                                        br.ufc.pargo.hpe.backend.DGAC.BackEnd.sedao.insert(se);
                                    }
                                }
                            }
                            if (br.ufc.pargo.hpe.backend.DGAC.BackEnd.sdao.retrieve(s.Id_abstract, s.Id_inner, s.Id_interface_slice, s.Id_interface) == null)
                            {
                                br.ufc.pargo.hpe.backend.DGAC.BackEnd.sdao.insert(s);
                                Console.WriteLine("SLICE REGISTERED " + s.Id_abstract + "/" + s.Id_inner + "/" + s.Id_interface_slice + " --- " + s.Id_interface);
                            }
                            else
                            {
                                Console.WriteLine("SLICE NOT REGISTERED " + s.Id_abstract + "/" + s.Id_inner + "/" + s.Id_interface_slice + " --- " + s.Id_interface);
                            }
                        }
                    }

                    //if (ui.protocol != null)
                    readProtocol(i, ui);
                }
            }
        }
        private void importInnerComponentsOfSuper(AbstractComponentFunctor absC, IList <InnerComponentType> includeAsInner)
        {
            Console.WriteLine("importInnerComponentsOfSupper : " + "START");
            IDictionary <string, SupplyParameter> parsSuper = new Dictionary <string, SupplyParameter>();

            // Inner components of the supertype.
            if (absC.Id_functor_app_supertype > 0)
            {
                AbstractComponentFunctorApplication acfa = br.ufc.pargo.hpe.backend.DGAC.BackEnd.acfadao.retrieve(absC.Id_functor_app_supertype);

                // It is a parameter in the subtype. Check if it is supplied in the type.
                IList <SupplyParameter> spList = br.ufc.pargo.hpe.backend.DGAC.BackEnd.spdao.list(acfa.Id_functor_app);
                foreach (SupplyParameter sp in spList)
                {
                    Console.WriteLine("Adding to parSuper - key=" + sp.Id_parameter + ", value: " + sp.Id_functor_app + "/" + sp.Id_abstract + "/" + sp.Id_parameter);
                    parsSuper.Add(sp.Id_parameter, sp);
                }

                IList <InnerComponent> iss = br.ufc.pargo.hpe.backend.DGAC.BackEnd.icdao.list(acfa.Id_abstract);
                Console.WriteLine("importInnerComponentsOfSuper: " + iss.Count + " - acfa.Id_abstract=" + acfa.Id_abstract);
                foreach (InnerComponent i in iss)                 //if (!i.IsPublic)
                {
                    Console.WriteLine("importInnerComponentsOfSupper 1: " + i.Id_inner + " , " + i.Id_functor_app + " , " + (i.Parameter_top));

                    InnerComponent iNew = new InnerComponent();
                    if (i.Parameter_top != null && i.Parameter_top != "")
                    {
                        SupplyParameter sp = null;
                        parsSuper.TryGetValue(i.Parameter_top, out sp);
                        Console.WriteLine("importInnerComponentsOfSupper 2: " + i.Parameter_top + "," + i.Id_inner);

                        if (sp is SupplyParameterComponent)
                        {
                            Console.WriteLine("importInnerComponentsOfSupper 3: " + "sp is SupplyParameterComponent");

                            // 1th CASE: It is not a parameter in the current component.
                            // NOT YET TESTED !!!
                            SupplyParameterComponent spc = (SupplyParameterComponent)sp;

                            AbstractComponentFunctorApplication acfaReplace = br.ufc.pargo.hpe.backend.DGAC.BackEnd.acfadao.retrieve(spc.Id_functor_app_actual);
                            if (br.ufc.pargo.hpe.backend.DGAC.BackEnd.icdao.retrieve(absC.Id_abstract, i.Id_inner) == null)
                            {
                                iNew.Id_abstract_inner = acfaReplace.Id_abstract;
                                //iNew.Parameter_top = i.Parameter_top; // TODO: Testando .........
                                iNew.Id_abstract_owner = absC.Id_abstract;
                                iNew.Id_functor_app    = liftFunctorApp(acfaReplace.Id_functor_app, parsSuper);
                                iNew.Id_inner          = i.Id_inner;
                                br.ufc.pargo.hpe.backend.DGAC.BackEnd.icdao.insert(iNew);
                            }
                        }
                        else if (sp is SupplyParameterParameter)
                        {
                            Console.WriteLine("importInnerComponentsOfSupper 4: " + "sp is SupplyParameterParameter");
                            // 2nd CASE: It continues to be a parameter in the current component.
                            SupplyParameterParameter spp = (SupplyParameterParameter)sp;

                            String varName = null;
                            foreach (ParameterRenaming pr in parameterRenamingSuper)
                            {
                                if (pr.formFieldId.Equals(i.Parameter_top))
                                {
                                    varName = pr.varName;
                                    ParameterType      parameter = this.lookForParameterByVarName(varName);
                                    InnerComponentType cReplace  = lookForInnerComponent(parameter.componentRef);
                                    //cReplace.localRef = i.Id_inner;
                                    cReplace.exposed  = i.IsPublic;
                                    cReplace.multiple = i.Multiple;
                                    // cReplace.parameter_id = i.Parameter_top; // TODO: Testano
                                    includeAsInner.Add(cReplace);
                                }
                            }

                            ParameterSupplyType supply = lookForSupplyForVarName(varName);
                            if (supply != null)
                            {
                                InnerComponentType cReplace = lookForInnerComponent(supply.cRef);
                                if (cReplace != null)
                                {
                                    includeAsInner.Add(cReplace);
                                }
                            }
                        }
                    }
                    else
                    {
                        // 3rd CASE:
                        // NOT YET TESTED !!!
                        iNew.Id_abstract_inner = i.Id_abstract_inner;
                        iNew.Parameter_top     = null;
                        iNew.Id_abstract_owner = absC.Id_abstract;
                        iNew.Id_functor_app    = liftFunctorApp(i.Id_functor_app, parsSuper);
                        iNew.Id_inner          = i.Id_inner;
                        iNew.IsPublic          = i.IsPublic;
                        br.ufc.pargo.hpe.backend.DGAC.BackEnd.icdao.insert(iNew);
                    }
                }
            }
            Console.WriteLine("importInnerComponentsOfSuper : FINISH");
        }
        private void loadInnerComponents(AbstractComponentFunctor absC)
        {
            IList <InnerComponentType> includeAsInner = new List <InnerComponentType>();

            IDictionary <string, InnerComponentType> innersByVarName = new Dictionary <string, InnerComponentType>();

            if (parameter != null)
            {
                foreach (ParameterType ir in parameter)
                {
                    InnerComponentType ic = this.lookForInnerComponent(ir.componentRef);
                    if (ic == null)
                    {
                        Console.WriteLine("LOOK FOR INNER COMPONENT RETURNED NULL " + ir.componentRef);
                    }
                    if (!innersByVarName.ContainsKey(ir.varName))
                    {
                        innersByVarName[ir.varName] = ic;
                    }
                    else
                    {
                        Console.WriteLine("ALREADY EXISTS - key=" + ir.varName + ", value=" + ic.localRef);
                    }
                }
            }

            if (parameterSupply != null)
            {
                foreach (ParameterSupplyType ir in parameterSupply)
                {
                    InnerComponentType ic = this.lookForInnerComponent(ir.cRef);
                    if (!innersByVarName.ContainsKey(ir.varName))
                    {
                        innersByVarName[ir.varName] = ic;
                    }
                    else
                    {
                        Console.WriteLine("ALREADY EXISTS - key=" + ir.varName + ", value=" + ic.localRef);
                    }
                }
            }

            importInnerComponentsOfSuper(absC, includeAsInner);

            if (inner != null)
            {
                foreach (InnerComponentType c in inner)
                {
                    Console.WriteLine("BEGIN loadInnerComponent : " + c.localRef + " :: " + c.package + "." + c.name);

                    // innerAll.Add(c);
                    if (((isNotInSupply(c) || this.findInSlices(c.localRef)) && (isNotParameter(c) || this.findInSlices(c.localRef))) || includeAsInner.Contains(c))
                    {
                        // CREATE INNER COMPONENT
                        InnerComponent iNew = new InnerComponent();
                        iNew.Id_abstract_owner = absC.Id_abstract;
                        iNew.Id_inner          = c.localRef; // localRef is used to uniquely identify the inner component among the inner components....

                        // FOLLOW arrow has-parameters
                        AbstractComponentFunctorApplication app = newAbstractComponentFunctorApplication(c);
                        if (app == null)
                        {
                            throw new Exception("DEPLOY ERROR: Unresolved Dependency for base component (inner component) : " + c.name);
                        }

                        iNew.Id_functor_app    = app.Id_functor_app;
                        iNew.Id_abstract_inner = app.Id_abstract;

                        // CHECKS IF IT IS A TOP PARAMETER
                        ParameterType p = lookForParameterByCRef(c.localRef);
                        iNew.Parameter_top = p != null ? p.formFieldId : null;

                        iNew.Transitive = false;
                        iNew.IsPublic   = c.exposed;
                        iNew.Multiple   = c.multipleSpecified ? c.multiple : false;

                        // LOAD EXPOSED INNER COMPONENTS
                        if (c.port != null)
                        {
                            foreach (InnerComponentType port in c.port)
                            {
                                Console.WriteLine("loadInnerComponent - BEGIN PORT " + port.localRef);
                                // --------------------------------------------------
                                string varName          = null;
                                int    id_abstract_port = app.Id_abstract;
                                string id_inner_port    = port.localRef;

                                InnerComponent ic_port = br.ufc.pargo.hpe.backend.DGAC.BackEnd.icdao.retrieve(id_abstract_port, id_inner_port);

                                Console.WriteLine("loadInnerComponent - STEP 1");

                                if (c.parameter != null && ic_port != null)
                                {
                                    foreach (ParameterRenaming par in c.parameter)
                                    {
                                        Console.WriteLine("loadInnerComponent - STEP 2 begin " + par.formFieldId + " - " + par.varName);
                                        if (par.formFieldId.Equals(ic_port.Parameter_top))
                                        {
                                            varName = par.varName;
                                        }
                                        Console.WriteLine("loadInnerComponent - STEP 2 end " + par.formFieldId + " - " + par.varName);
                                    }
                                }

                                InnerComponentType port_replace = port;
                                if (varName != null)
                                {
                                    Console.WriteLine("loadInnerComponent - STEP 3 " + varName);
                                    foreach (KeyValuePair <string, InnerComponentType> iii in innersByVarName)
                                    {
                                        Console.WriteLine("loadInnerComponent x " + iii.Key);
                                        Console.WriteLine("loadInnerComponent y " + (iii.Value == null));
                                        Console.WriteLine("loadInnerComponent z " + c.package);
                                        Console.WriteLine("loadInnerComponent w " + c.name);
                                    }
                                    port_replace = innersByVarName[varName];
                                }
                                else
                                {
                                    Console.WriteLine("loadInnerComponent - STEP 3 ");
                                }

                                // --------------------------------------------------

                                innerAll.Add(port);

                                InnerComponent iNewPort = new InnerComponent();
                                iNewPort.Id_abstract_owner = absC.Id_abstract;
                                string old_port_localRef = port.localRef;
                                port.localRef          = lookForRenamingNew(c.localRef, old_port_localRef, port.index_replica);
                                iNewPort.Id_inner      = port.localRef;
                                iNewPort.Parameter_top = port_replace.parameter_id;
                                iNewPort.Transitive    = true;
                                iNewPort.IsPublic      = port.exposed;
                                iNewPort.Multiple      = port.multipleSpecified ? port.multiple : false;

                                AbstractComponentFunctorApplication appPort = newAbstractComponentFunctorApplication(port_replace);
                                if (appPort == null)
                                {
                                    throw new Exception("DEPLOY ERROR: Unresolved Dependency for base component (public inner component) : " + port.name);
                                }

                                iNewPort.Id_functor_app    = appPort.Id_functor_app;
                                iNewPort.Id_abstract_inner = appPort.Id_abstract;

                                InnerComponentExposed ice = new InnerComponentExposed();
                                ice.Id_abstract     = absC.Id_abstract;
                                ice.Id_inner_rename = iNewPort.Id_inner;
                                ice.Id_inner_owner  = iNew.Id_inner;
                                ice.Id_inner        = old_port_localRef;

                                br.ufc.pargo.hpe.backend.DGAC.BackEnd.icedao.insert(ice);

                                InnerComponent ic_port_exists = br.ufc.pargo.hpe.backend.DGAC.BackEnd.icdao.retrieve(iNewPort.Id_abstract_owner, iNewPort.Id_inner);

                                if (ic_port_exists == null && (fusion == null || !fusion.ContainsKey(port.localRef) || (fusion.ContainsKey(port.localRef) && fusion[port.localRef].Equals(c.localRef))))
                                {
                                    br.ufc.pargo.hpe.backend.DGAC.BackEnd.icdao.insert(iNewPort);
                                }

                                Console.WriteLine("loadInnerComponent - END PORT " + port.localRef);
                            }
                        }


                        InnerComponent ic = br.ufc.pargo.hpe.backend.DGAC.BackEnd.icdao.retrieve(iNew.Id_abstract_owner, iNew.Id_inner);

                        if (ic != null && includeAsInner.Contains(c))
                        {
                            Console.WriteLine("loadInnerComponent - BLOCK 2 OPEN");
                            br.ufc.pargo.hpe.backend.DGAC.BackEnd.icdao.remove(iNew.Id_abstract_owner, iNew.Id_inner);
                            br.ufc.pargo.hpe.backend.DGAC.BackEnd.icdao.insert(iNew);
                            Console.WriteLine("loadInnerComponent - BLOCK 2 CLOSE");
                        }
                        else if (ic == null)
                        {
                            Console.WriteLine("loadInnerComponent - BLOCK 3 OPEN");
                            br.ufc.pargo.hpe.backend.DGAC.BackEnd.icdao.insert(iNew);
                            Console.WriteLine("loadInnerComponent - BLOCK 3 CLOSE");
                        }
                    }

                    Console.WriteLine("END loadInnerComponent : " + c.localRef + " :: " + c.package + "." + c.name);
                }
            }
        }