/*
         * Retorna a lista de ações descritas na lista de nós XML.
         */
        protected Dictionary <string, MetaAction> getActions(XmlNodeList nodes, MetaUnit unit)
        {
            if (nodes != null)
            {
                IEnumerator ienum = (IEnumerator)nodes.GetEnumerator();

                Dictionary <string, MetaAction> actionList = new Dictionary <string, MetaAction>();
                MetaAction action;
                XmlNode    actionNode;

                while (ienum.MoveNext())
                {
                    actionNode    = (XmlNode)ienum.Current;
                    action        = new MetaAction();
                    action.Id     = generator.genId();
                    action.Father = unit;

                    action.Name = actionNode.SelectSingleNode("identifier").InnerText;
                    List <Transition> trans = getTransitions(actionNode.SelectSingleNode("protocol").FirstChild, unit, Configuration.INITIAL_STATE, Configuration.FINAL_STATE, 2, 0);


                    action.Protocol = new Configuration(numStates, trans, numTransations);
                    actionList.Add(action.Name, action);
                }

                if (actionList.Count > 0)
                {
                    return(actionList);
                }
            }

            return(null);
        }
        public void LoadComponent(string xml)
        {
            this.loader = new XmlLoader(the_unit);

            this.application = loader.loadComponent(xml);

            this.unitName = the_unit.Id_unit;
            //this.index = the_unit.PartitionIndex;

            foreach (MetaUnit u in application.Units.Values)
            {
                //Console.WriteLine("[ConfigurationManager.LoadComponent] Unit {0}", the_unit.CID.getInstanceName);
                if (u.Name.Equals(this.unitName))
                {
                    this.unit = u;
                    //u.Index = this.index;
                    break;
                }
            }

            if (this.unit == null)
            {
                throw new Exception("Unit not found. Name: " + unitName);
            }

            ready = true;
            Console.WriteLine("[ConfigurationManager.LoadComponent] Unidade {0} carregada e apta para execução.", the_unit.CID.getInstanceName());
            N = the_unit.CID.getInstanceName().Equals("app.adi_solver3D-adi");
        }
        /*
         * Método para carregar as informações das unidades a partir de um nó XML.
         */
        public Dictionary <string, MetaUnit> getUnits(XmlNodeList nodes)
        {
            if (nodes != null)
            {
                IEnumerator ienum = (IEnumerator)nodes.GetEnumerator();

                Dictionary <string, MetaUnit> unitList = new Dictionary <string, MetaUnit> ();
                MetaUnit     unit;
                XmlNode      unitNode;
                XmlAttribute attr;

                while (ienum.MoveNext())
                {
                    unitNode = (XmlNode)ienum.Current;
                    unit     = new MetaUnit();
                    unit.Id  = generator.genId();

                    attr      = (XmlAttribute)unitNode.Attributes.GetNamedItem("name");
                    unit.Name = attr.Value;


                    attr = (XmlAttribute)unitNode.Attributes.GetNamedItem("index");

                    if (attr != null)
                    {
                        unit.Index = Convert.ToInt32(attr.Value);
                    }

                    attr = (XmlAttribute)unitNode.Attributes.GetNamedItem("parallel");
                    if (attr != null)
                    {
                        unit.Parallel = attr.Value.Equals("true");
                    }

                    unit.Slices     = getSlices(unitNode.SelectNodes("slice"));
                    unit.Actions    = getActions(unitNode.SelectNodes("action"), unit);
                    unit.Conditions = getConditions(unitNode.SelectNodes("condition"));

                    //TODO nao existe mais um no com esse nome. E uma acao.
                    if (unitNode.SelectSingleNode("validation") != null)
                    {
                        //TODO resolver a forma de representação do validation protocol.
                    }

                    unitList.Add(unit.Name, unit);
                }

                if (unitList.Count > 0)
                {
                    return(unitList);
                }
            }

            return(null);
        }
        /*
         * geração das transitions baseado no protocolo da ação.
         */
        public List <Transition> getTransitions(XmlNode node, MetaUnit unit, int initial, int final, int numStates, int numTransations)
        {
            List <Transition>  transitions = new List <Transition> ();
            Queue <Transition> treat       = new Queue <Transition> ();

            //Console.WriteLine("Initial {0} | Final {1} | numStates {2} | numTrans {3}", initial, final, numStates, numTransations);
            treat.Enqueue(new Transition(initial, final, node, numTransations++));

            Transition   t;
            XmlNode      pivotNode, child, guardNode;
            XmlNodeList  children;
            XmlAttribute attr;
            Condition    condition;
            int          initialState, finalState;
            bool         repeat;

            initialState = finalState = 0;

            while (treat.Count > 0)
            {
                t         = treat.Dequeue();
                pivotNode = (XmlNode)t.Action;
                t.Action  = null;
                transitions.Add(t);
                condition = null;

                attr = (XmlAttribute)pivotNode.Attributes.GetNamedItem("id");
                if (attr != null)
                {
                    t.AddId(attr.Value);
                }

                repeat = false;
                attr   = (XmlAttribute)pivotNode.Attributes.GetNamedItem("repeat");
                if (attr != null)
                {
                    repeat = attr.Value.Equals("true");
                }

                guardNode = pivotNode.SelectSingleNode("guard");
                condition = null;

                //Console.WriteLine("[XmlLoaderUtil.getTransitions] Ação a avaliar... {0}", pivotNode.Name);
                if (pivotNode.Name.Equals("seq") || pivotNode.Name.Equals("par"))
                {
                    if (guardNode != null)
                    {
                        condition = getCondition(guardNode);
                        Transition tElse;
                        initialState = numStates++;

                        if (condition != null)                           //condition nao é else.
                        {
                            transitions.Add(new Transition(t.InitialState, initialState, new ExecutionAction(null, condition), Transition.INTERNAL_TRANSITION));
                            tElse = new Transition(t.InitialState, t.FinalState, Configuration.LAMBDA_TRANSITION, Transition.INTERNAL_TRANSITION);
                        }
                        else
                        {
                            tElse = new Transition(t.InitialState, initialState, Configuration.LAMBDA_TRANSITION, Transition.INTERNAL_TRANSITION);
                        }

                        tElse.IsElse = true;
                        transitions.Add(tElse);
                    }
                    else
                    {
                        initialState = t.InitialState;
                    }
                }

                switch (pivotNode.Name)
                {
                case "seq":

                    children = pivotNode.ChildNodes;

                    for (int r = 0; r < children.Count; r++)
                    {
                        child = children.Item(r);

                        if (child.Name.Equals("guard"))
                        {
                            continue;
                        }

                        if (r == (children.Count - 1))
                        {
                            if (repeat)
                            {
                                finalState = t.InitialState;
                            }
                            else
                            {
                                finalState = t.FinalState;
                            }
                        }
                        else
                        {
                            finalState = numStates++;
                        }

                        treat.Enqueue(new Transition(initialState, finalState, child.FirstChild, numTransations++));

                        initialState = finalState;
                    }

                    break;

                case "par":


                    children = pivotNode.ChildNodes;


                    if (repeat)
                    {
                        finalState = numStates++;
                        transitions.Add(new Transition(finalState, t.InitialState, Configuration.LAMBDA_TRANSITION, Transition.INTERNAL_TRANSITION));
                    }
                    else
                    {
                        finalState = t.FinalState;
                    }

                    for (int r = 0; r < children.Count; r++)
                    {
                        child = children.Item(r);

                        if (child.Name.Equals("guard"))
                        {
                            continue;
                        }

                        treat.Enqueue(new Transition(initialState, finalState, child.FirstChild, numTransations++));
                    }

                    break;

                case "perform":
                    bool isElse = false;

                    initialState = t.InitialState;
                    finalState   = t.FinalState;

                    child = pivotNode;

                    if (guardNode != null)
                    {
                        condition = getCondition(guardNode);

                        if (condition == null)
                        {
                            isElse = true;
                        }
                    }
                    attr = (XmlAttribute)child.Attributes.GetNamedItem("slice_id");
                    //Console.WriteLine("[XmlLoaderUtil.getTransitions] Avaliando ação sobre a fatia {0}", attr.Value);
                    string sliceName = "";
                    if (attr != null)
                    {
                        sliceName = attr.Value;
                    }

                    string methodName = child.Attributes.GetNamedItem("action_id").Value;
                    //Console.WriteLine("[XmlLoaderUtil.getTransitions] Avaliando ação {0}", methodName);
                    MetaAction selectedAction = null;

                    if (sliceName.Equals(""))
                    {
                        //Console.WriteLine("[XmlLoaderUtil.getTransitions] unit {0} | action {1}", unit.Name, methodName);
                        unit.Actions.TryGetValue(methodName, out selectedAction);

                        //Console.WriteLine("[XmlLoaderUtil.getTransitions] Action {0} encontrada? {1}",methodName, selectedAction != null);

                        if (selectedAction == null)
                        {
                            selectedAction        = new MetaAction();
                            selectedAction.Id     = generator.genId();
                            selectedAction.Name   = methodName;
                            selectedAction.Father = unit;
                            unit.AddAction(methodName, selectedAction);
                        }
                    }
                    else
                    {
                        MetaSlice slice = null;
                        //Console.WriteLine("[XmlLoaderUtil.getTransitions] slice {0}", sliceName);

                        unit.Slices.TryGetValue(sliceName, out slice);

                        if (slice == null && candidateSlices != null)
                        {
                            candidateSlices.TryGetValue(sliceName, out slice);
                        }

                        if (slice != null)
                        {
                            //Console.WriteLine("[XmlLoaderUtil.getTransitions] slice {0} encontrada", sliceName);

                            if (slice.Unit.Actions != null)
                            {
                                foreach (MetaAction mact in slice.Unit.Actions.Values)
                                {
                                    if (mact.Name.Equals(methodName))
                                    {
                                        selectedAction = mact;
                                        break;
                                    }
                                }
                            }

                            if (selectedAction == null)
                            {
                                selectedAction        = new MetaAction();
                                selectedAction.Id     = generator.genId();
                                selectedAction.Name   = methodName;
                                selectedAction.Father = slice.Unit;
                                slice.Unit.AddAction(methodName, selectedAction);
                            }
                        }
                    }

                    if (selectedAction != null)
                    {
                        Transition tst = new Transition(initialState, finalState, new ExecutionAction(selectedAction, condition), numTransations++);
                        tst.IsElse = isElse;
                        transitions.Add(tst);
                    }
                    else
                    {
                        throw new Exception("Fatia inexistente nesta unidade: " + sliceName);
                    }

                    break;

                default:
                    throw new Exception("invalid action: " + pivotNode.Name);
                }
            }

            this.numStates      = numStates;
            this.numTransations = numTransations;
            return(transitions);
        }
        /*
         * Procura e retorna a fatia procurada. Ela corresponde a uma unidade de um innerComponent.
         * Caso não exista, a unidade será criada, atribuída ao innerComponent e ao final retornada.
         *
         * Caso innerComponent citado não exista, o retorno do método será nulo.
         */
        public Dictionary <string, MetaSlice> getSlices(XmlNodeList sliceNodes)
        {
            Dictionary <string, MetaSlice> slices = new Dictionary <string, MetaSlice> ();

            List <MetaInnerComponent> innerList = new List <MetaInnerComponent>();

            innerList.AddRange(innerComponents);
            if (candidateInnerComponents != null)
            {
                innerList.AddRange(candidateInnerComponents);
            }

            if (sliceNodes != null)
            {
                MetaUnit     unit = null;
                MetaSlice    slice = null;
                string       innerName, unitName;
                int          index;
                XmlAttribute attr;
                XmlNode      sliceNode;

                IEnumerator senum = (IEnumerator)sliceNodes.GetEnumerator();

                while (senum.MoveNext())
                {
                    sliceNode = (XmlNode)senum.Current;

                    attr      = (XmlAttribute)sliceNode.Attributes.GetNamedItem("inner");
                    innerName = attr.Value;

                    attr     = (XmlAttribute)sliceNode.Attributes.GetNamedItem("unit");
                    unitName = attr.Value;

                    attr = (XmlAttribute)sliceNode.Attributes.GetNamedItem("index");
                    if (attr != null)
                    {
                        index = Convert.ToInt32(attr.Value);
                    }
                    else
                    {
                        index = 0;
                    }

                    foreach (MetaInnerComponent comp in innerList)
                    {
                        if (comp.Identifier.Equals(innerName))
                        {
                            if (comp.Units != null)
                            {
                                //TODO deveria usar a indexacao do dictionary. O index pode trazer problemas.
                                foreach (MetaUnit u in comp.Units.Values)
                                {
                                    if (u.Name.Equals(unitName) /* && u.Index.Equals (index)*/)
                                    {
                                        unit = u;
                                        break;
                                    }
                                }
                            }

                            if (unit == null)
                            {
                                unit        = new MetaUnit();
                                unit.Id     = generator.genId();
                                unit.Father = comp;
                                unit.Name   = unitName;
                                unit.Index  = index;

                                comp.AddUnit(unit.Name, unit);
                            }

                            break;
                        }
                    }

                    if (unit != null)
                    {
                        slice       = new MetaSlice(unit);
                        slice.Inner = innerName;

                        unit = null;
                    }

                    if (slice != null)
                    {
                        slices.Add(innerName, slice);
                    }
                    else
                    {
                        throw new Exception("Erro ao carregar fatia: Inner component inexistente: " + innerName);
                    }
                }
            }

            return(slices);
        }
Esempio n. 6
0
        public ReconfigurationRequest loadRequest(string xml, MetaHashComponent component)
        {
            ReconfigurationRequest request = null;

            Console.WriteLine("[XmlLoader.loadRequest] Iniciando carga de script de reconfiguração... ");

            if (true /*validator.IsValid (REQUEST_XSD, xml)*/)
            {
                clear();
                generator.setInitialCode(component.LastIdCode);

                request = new ReconfigurationRequest();
                XmlDocument document = new XmlDocument();
                XmlNode     nodeRequest, data;

                document.Load(xml);
                nodeRequest = document.SelectSingleNode("reconfigurationRequest");

                data = nodeRequest.SelectSingleNode("targetComponent");
                request.TargetComponent = data.InnerText;

                //Console.WriteLine("[XmlLoader.LoadRequest] Obtendo componente alvo {0}", request.TargetComponent);

                List <MetaParameter> parameterList                 = uLoader.getParameters(nodeRequest.SelectNodes("parameter"));

                if (parameterList != null)
                {
                    Console.WriteLine("[XmlLoader.LoadRequest] Carregando as reconfigurações estruturais...");
                    request.StructuralRequest = new StructuralReconfigurationRequest(parameterList);
                }

                BehavioralReconfigurationRequest behavioralRequest = null;

                List <MetaInnerComponent> innerComponents          = generateInnerComponents(nodeRequest.SelectNodes("innerComponent"));
                //Console.WriteLine("[XmlLoader.LoadRequest] Tem innerComponent para adicionar? {0}", innerComponents != null);
                if (innerComponents != null)
                {
                    behavioralRequest = new BehavioralReconfigurationRequest();

                    Console.WriteLine("[XmlLoader.LoadRequest] Carregando novos componentes aninhados...");
                    //Console.WriteLine("[XmlLoader.LoadRequest] {0} InnerComponent(s) adicionado(s)", innerComponents.Count);
                    behavioralRequest.NewInnerComponents = innerComponents;
                    uLoader.CandidateInnerComponents     = innerComponents;
                }

                uLoader.InnerComponents = innerComponents;
                XmlNodeList changeActionList                       = nodeRequest.SelectNodes("changeAction");

                if (changeActionList != null)
                {
                    Console.WriteLine("[XmlLoader.LoadRequest] Carregando as reconfigurações comportamentais...");
                    IEnumerator      ienum = changeActionList.GetEnumerator();
                    BehavioralChange change;
                    XmlNode          changeNode;

                    if (behavioralRequest == null)
                    {
                        behavioralRequest = new BehavioralReconfigurationRequest();
                    }

                    XmlAttribute attr;
                    int          initialCode;
                    int          aditionalStates, aditionalTrans;
                    aditionalStates = aditionalTrans = 0;
                    while (ienum.MoveNext())
                    {
                        changeNode = (XmlNode)ienum.Current;

                        change = new BehavioralChange();
                        //Console.WriteLine("[XmlLoader.LoadRequest] Criando uma nova BehavioralChange");
                        initialCode = generator.getCurrentCode();

                        attr        = (XmlAttribute)changeNode.Attributes.GetNamedItem("unit");
                        change.Unit = attr.Value;
                        //Console.WriteLine("[XmlLoader.LoadRequest] Unit a sofrer alteração: {0}", change.Unit);

                        MetaUnit u = component.Units[change.Unit];

                        if (u != null)
                        {
                            //Console.WriteLine("[XmlLoader.LoadRequest] Unit {0} encontrada!", change.Unit);

                            attr          = (XmlAttribute)changeNode.Attributes.GetNamedItem("action");
                            change.Action = attr.Value;
                            //Console.WriteLine("[XmlLoader.LoadRequest] Ação a sofrer alteração: {0}", change.Action);
                            MetaAction a = u.Actions[change.Action];

                            if (a != null && !a.IsNative)
                            {
                                //Console.WriteLine("[XmlLoader.LoadRequest] Ação {0} encontrada!", change.Action);
                                attr = (XmlAttribute)changeNode.Attributes.GetNamedItem("type");
                                if (attr.Value.Equals("remove"))
                                {
                                    change.Type = BehavioralChange.BehavioralChangeType.REMOVE;
                                }
                                else
                                {
                                    change.Type = BehavioralChange.BehavioralChangeType.INCLUDE;
                                }

                                attr         = (XmlAttribute)changeNode.Attributes.GetNamedItem("point");
                                change.Point = attr.Value;

                                //Console.WriteLine("[XmlLoader.LoadRequest] Ponto a sofrer alteração: {0}", change.Point);
                                Transition t = a.Protocol.getTransition(change.Point);

                                if (t != null)
                                {
                                    //Console.WriteLine("[XmlLoader.LoadRequest] Ponto {0} encontrado.", change.Point);
                                    change.NewSlices        = uLoader.getSlices(changeNode.SelectNodes("slice"));
                                    uLoader.CandidateSlices = change.NewSlices;

                                    if (change.Type == BehavioralChange.BehavioralChangeType.INCLUDE)
                                    {
                                        //Console.WriteLine("[XmlLoader.LoadRequest] Obtendo novo protocolo");
                                        change.Transitions = uLoader.getTransitions(changeNode.SelectSingleNode("protocol").FirstChild, u, t.InitialState, t.FinalState, a.Protocol.NumStates + aditionalStates, a.Protocol.LastTransationId + aditionalTrans);

                                        aditionalStates = uLoader.NumStates - a.Protocol.NumStates;
                                        aditionalTrans  = uLoader.NumTransations - a.Protocol.LastTransationId;
                                        //TODO remover
                                        //Console.WriteLine("Transações de reconfiguração");
                                        //foreach(Transition tst in change.Transitions) {
                                        //	Console.WriteLine(tst);
                                        //}
                                    }
                                    else
                                    {
                                        change.Transitions = new List <Transition>();
                                        change.Transitions.Add(new Transition(t.InitialState, t.FinalState, Configuration.LAMBDA_TRANSITION, a.Protocol.LastTransationId++));
                                    }
                                }
                                else
                                {
                                    throw new Exception("[XmlLoader.loadRequest] Ponto de reconfiguração não existe: " + change.Point);
                                }
                            }
                            else
                            {
                                throw new Exception("[XmlLoader.loadRequest] Ação a ser alterada não existe ou nãoo é uma configuração: " + change.Action);
                            }
                        }
                        else
                        {
                            throw new Exception("[XmlLoader.loadRequest] Unidade da ação a ser alterada não existe: " + change.Unit);
                        }

                        change.AditionalStates = generator.getCurrentCode() - initialCode;
                        behavioralRequest.AddChange(change);
                    }
                }

                request.BehavioralRequest = behavioralRequest;
                component.LastIdCode      = generator.getCurrentCode();
            }

            uLoader.CandidateSlices          = null;
            uLoader.CandidateInnerComponents = null;

            Console.WriteLine("[XmlLoader.loadRequest] Carga de script realizada com sucesso!");
            return(request);
        }
        /*
         * Realiza a avaliação de segurança conforme os parâmetros.
         * Para a reconfiguração estrutural são avaliados dois critérios.
         * Quais os estados que antecedem ações ligadas a unidades que:
         * 1- compõe componentes que serão removidos;
         * 2- possuem fatias de unidades de componentes que serão removidos.
         *
         */

        public static List <ExecutionStateEvaluation> Evaluate(ReconfigurationRequest request, MetaUnit unit)
        {
            List <ExecutionStateEvaluation> result = new List <ExecutionStateEvaluation> ();
            Queue <MetaUnit> usingSlices           = new Queue <MetaUnit> ();

            List <int>      criticalActions;
            List <int>      statesToStop;
            List <Interval> intervals;
            MetaUnit        oldUnit, usingUnit;
            MetaAction      usingAction;
            Configuration   protocol;

            bool find;

            foreach (MetaAction action in unit.Actions.Values)
            {
                Console.WriteLine("[SecurityAnalyzer.Evaluate] Avaliando a ação: " + action.Father.Name + "." + action.Name);
                criticalActions = new List <int> ();
                statesToStop    = new List <int> ();

                protocol = action.Protocol;
                if (protocol == null)
                {
                    Console.WriteLine("[SecurityAnalyzer.Evaluate] Protocolo nulo");
                    continue;
                }
                find = false;

                if (request.StructuralRequest != null)
                {
                    foreach (StructuralChange change in request.StructuralRequest.Changes)
                    {
                        oldUnit = change.Old;
                        //Console.WriteLine ("[SecurityAnalyzer.Evaluate] Mudança estrutural: " + oldUnit.Name);
                        if (isChangeConcrete(change))
                        {
                            /*Verifica:
                             * 1- se a ação faz parte da unidade a ser removida;
                             * 2- se a ação faz parte da unidade que possúi uma fatia (em qualquer nível) a ser removida;
                             */
                            for (int i = 0; i < protocol.Actions.Count; i++)
                            {
                                usingAction = protocol.Actions [i].MetaAction;
                                //Console.WriteLine ("[SecurityAnalyzer.Evaluate] Avaliando a ação de indice {0}", i);

                                if (usingAction != null && usingAction.Father != null)
                                {
                                    usingSlices.Enqueue((MetaUnit)usingAction.Father);

                                    while (!find && usingSlices.Count > 0)
                                    {
                                        usingUnit = usingSlices.Dequeue();

                                        if (usingUnit.Id == oldUnit.Id)
                                        {
                                            find = true;
                                        }
                                        else
                                        {
                                            if (usingUnit.Slices != null && usingUnit.Slices.Count > 0)
                                            {
                                                foreach (MetaSlice ms in usingUnit.Slices.Values)
                                                {
                                                    //Console.WriteLine ("Using Slice {0}", ms.Unit.Name);
                                                    usingSlices.Enqueue(ms.Unit);
                                                }
                                            }
                                        }
                                    }
                                }
                                usingSlices.Clear();

                                //Se esta ação pertence ou tem com fatia a unidade a ser removida, lista quais as transições onde ela está presente.
                                if (find)
                                {
                                    criticalActions.Add(usingAction.Id);

                                    for (int j = 0; j < protocol.Matrix.Count; j++)
                                    {
                                        for (int k = 0; k < protocol.Matrix[j].Count / Configuration.BASE; k++)
                                        {
                                            if (protocol.Matrix [j] [k * Configuration.BASE] == i)
                                            {
                                                statesToStop.Add(j);
                                            }
                                        }
                                    }
                                }

                                find = false;
                            }
                        }
                    }
                }

                intervals = new List <Interval> ();

                BehavioralReconfigurationRequest behavioralRequest = request.BehavioralRequest;

                if (behavioralRequest != null && behavioralRequest.Changes != null)
                {
                    Console.WriteLine("[SecurityAnalyzer.Evaluate] Avaliando as reconfigurações comportamentais...");
                    foreach (BehavioralChange change in behavioralRequest.Changes)
                    {
                        if (unit.Name.Equals(change.Unit) && action.Name.Equals(change.Action))
                        {
                            foreach (Transition transition in protocol.Transitions)
                            {
                                if (transition.Ids.Contains(change.Point))
                                {
                                    statesToStop.Add(transition.InitialState);
                                    //Rever as paradas de intervalos. Ações simples não funciona.
                                    //intervals.Add (new Interval (transition.InitialState, transition.FinalState));

                                    break;
                                }
                            }
                        }
                    }
                }

                Console.WriteLine("[SecurityAnalyzer.Evaluate] Definindo os estados críticos...");
                if (statesToStop.Count > 0)
                {
                    result.Add(new ExecutionStateEvaluation(action.Name, criticalActions, statesToStop, intervals));
                }
            }

            if (result.Count == 0)
            {
                result = null;
            }

            return(result);
        }
        public static bool isDeadlockFree(List <ExecutionStateEvaluation> evaluations, MetaUnit unit)
        {
            //TODO escrever o método.
            if (evaluations != null)
            {
            }
            else
            {
                return(true);
            }

            return(true);
        }
Esempio n. 9
0
 public StructuralChange(MetaUnit old, MetaUnit _new)
 {
     this.old  = old;
     this._new = _new;
 }
 protected void createConcreteUnit(MetaUnit metaUnit, string instanceName)
 {
 }
 protected void SubstituteUnit(MetaUnit uOld, MetaUnit uNew)
 {
 }