public override void Agregar(Nodo nodo) { if (nodo == null || typeof(NodoObjeto) != nodo.GetType()) { return; } NodoObjeto nodoobj = (NodoObjeto)nodo; string ruta = string.Empty; int indice = Nodos.Count; if (Propiedad.Asociacion == Asociacion.Composicion) { ruta = string.Format("{0}/{1}[{2}]", ((NodoObjeto)Padre).Ruta, Propiedad.Nombre, indice); } else { ruta = string.Format("{0}/{1}", ((NodoObjeto)Padre).Ruta, Propiedad.Nombre); } nodoobj.Ruta = ruta; nodoobj.Indice = indice; base.Agregar(nodo); }
private void CrearPropiedad(NodoObjeto nodo) { foreach (IPropiedad prop in nodo.Objeto.ObjetoDatos.Tipo.Propiedades) { CrearPropiedad(nodo, prop); } }
private void ResolverNodo(NodoObjeto nodo) { // resolver referencias agregacion if (string.IsNullOrEmpty(nodo.Objeto.Propietario)) { nodo.Objeto.Propietario = nodo.Ruta; nodo.EsProxy = false; } // resolver anidamiento CrearPropiedad(nodo); }
private void ResolverNodos() { _resol = true; NodoObjeto[] nodos = new NodoObjeto[_agre.Count]; _agre.Values.CopyTo(nodos, 0); foreach (NodoObjeto nodo in nodos) { ResolverNodo(nodo); } }
private void CrearPropiedad(NodoObjeto nodo, IPropiedad propiedad) { if (propiedad.Tipo.EsTipoDeDato) { return; } IObjetoDatos od = nodo.Objeto.ObjetoDatos; if (!od.Establecido(propiedad)) { return; } // crear nodo NodoReferencia nodoprop = new NodoReferencia(nodo, propiedad); nodo.Agregar(nodoprop); // crear nodos hijos CrearObjeto(nodoprop); }
public NodoReferencia(NodoObjeto padre, IPropiedad propiedad) : base(padre) { Propiedad = propiedad; }
private void CrearObjeto(NodoReferencia nodo, IObjetoDatos od, int indice) { if (od == null) { return; } ObjetoMap omap = _heap.Obtener(od); if (omap == null) { return; } // crear nodo NodoObjeto nodoobj = new NodoObjeto(nodo, omap); nodo.Agregar(nodoobj); // establecer valores string ruta = ((NodoObjeto)nodo.Padre).Ruta; bool composicion = (nodo.Propiedad.Asociacion == Asociacion.Composicion); if (nodo.Propiedad.Cardinalidad >= Cardinalidad.Muchos) { ruta = string.Format("{0}/{1}[{2}]", ruta, nodo.Propiedad.Nombre, indice); } else { ruta = string.Format("{0}/{1}", ruta, nodo.Propiedad.Nombre); } nodoobj.Ruta = ruta; nodoobj.Indice = indice; // determinar si debe resolverse bool resol = (composicion || _resol) && string.IsNullOrEmpty(omap.Propietario); // establecer referencia agregacion if (!resol) { // le referencia agregacion es proxy, hasta que se resuelva nodoobj.EsProxy = true; // se mantiene la primera referencia if (!_agre.ContainsKey(od)) { _agre.Add(od, nodoobj); } return; } // establecer propietario omap.Propietario = ruta; // eliminar referencia resuelta if (_agre.ContainsKey(od)) { _agre.Remove(od); } // crear nodos hijos CrearPropiedad(nodoobj); }