public DustDataReference(DustDataEntity eLinkDef, DustDataEntity eSrc, DustDataEntity eTarget, Object id)
 {
     this.eLinkDef = eLinkDef;
     this.eSrc     = eSrc;
     this.eTarget  = eTarget;
     this.id       = id;
 }
示例#2
0
        public Object getValue(DustDataEntity key, Object defVal, object hint)
        {
            Object            ret = defVal;
            DustDataReference er  = null;

            if (content.TryGetValue(key, out ret))
            {
                er  = ret as DustDataReference;
                ret = (null == er) ? ret : er.getAt(hint);
            }

            if ((null == ret) && (DustValType.LinkDefMap == key.optValType))
            {
                Object refPT;
                if (content.TryGetValue(DustSystem.getEntity(MetaLinks.LinkDefItemTypePrimary), out refPT))
                {
                    DustDataEntity ePT = ((DustDataReference)refPT).eTarget;

                    var eNew = new DustDataEntity();

                    eNew.setValue(DustSystem.getEntity(DataLinks.EntityPrimaryType), ePT, null);
                    ret = eNew;
                }
            }

            return(ret ?? defVal);
        }
示例#3
0
        public void accessImpl(DustAccessCommand op, DustInfoTray tray)
        {
            var session = getCurrentSession();

            DustDataEntity ei = (tray.entity is DustContext)
                                ? session.ctx[((DustContext)tray.entity)]
                                : (DustDataEntity)tray.entity;

            var eKey = tray.key as DustDataEntity;

            if (null == eKey)
            {
                var key = tray.key as DustKey;
                if (null != key)
                {
                    eKey = modules[key.module][key.key];
                }
            }

            switch (op)
            {
            case DustAccessCommand.read:
                tray.value = ei.getValue(eKey, tray.value, tray.dustHint);

                if ((null == tray.value) && DustUtils.isEnumRef(eKey.optValType))
                {
                    foreach (DustProcCursor drc in rootSession.cursors)
                    {
                        if ((drc.owner == ei) && (drc.key == eKey))
                        {
                            tray.value = drc.Current.eTarget;
                            return;
                        }
                    }
                }

                break;

            case DustAccessCommand.write:
                tray.value = ei.setValue(eKey, tray.value, tray.dustHint);
                break;

            case DustAccessCommand.visit:
                var vp = new DustProcVisitProcess(session, tray);
                var vt = tray as DustVisitTray;

                if (null == vt)
                {
                    vp.visitRef(ei, eKey, null, true);
                }
                else
                {
                    vp.visitEntity(null);
                }
                break;
            }
        }
示例#4
0
        public DustProcCursor optSetCursor(DustDataEntity ei, DustDataEntity eKey)
        {
            DustProcCursor cursor = DustProcCursor.optSet(ei, eKey);

            if (null != cursor)
            {
                cursors.Insert(0, cursor);
            }

            return(cursor);
        }
        public static async Task <DustEntity> loadRemote(String serverAddr, String module, String entityId)
        {
            try {
//							var tcs = new TaskCompletionSource<DustEntity>();

                string responseBody = await HttpClient.GetStringAsync("http://" + serverAddr + "/GetEntity?RemoteRefModuleName=" + module + "&RemoteRefItemModuleId=" + entityId);

                File.WriteAllText(module + "." + entityId + ".json", responseBody);

                DustDataEntity entity = DustCommSerializerJson.loadSingleFromText(responseBody, module, entityId);
//				proc.processEntity(entity);
//				tcs.TrySetResult(entity);
                return(entity);
            } catch (HttpRequestException e) {
                Console.WriteLine("\nException Caught!");
                Console.WriteLine("Message :{0} ", e.Message);
                return(null);
            }
        }
示例#6
0
        public Object setValue(DustDataEntity key, Object val, Object hint)
        {
            Object newVal = null;

            Object oldVal;

            if (!content.TryGetValue(key, out oldVal))
            {
                oldVal = null;
            }

            switch (key.optValType)
            {
            case DustValType.AttDefBool:
            case DustValType.AttDefIdentifier:
            case DustValType.AttDefDouble:
            case DustValType.AttDefLong:
            case DustValType.AttDefRaw:
                newVal = val;
                break;

            case DustValType.LinkDefSingle:
                newVal = new DustDataReference(key, this, (DustDataEntity)val, hint);
                break;

            case DustValType.LinkDefSet:
            case DustValType.LinkDefArray:
            case DustValType.LinkDefMap:
                newVal = (null == oldVal) ?     new DustDataReference(key, this, (DustDataEntity)val, hint)
                                                : ((DustDataReference)oldVal).addItem((DustDataEntity)val, hint);
                break;
            }

            content[key] = newVal;

            var oldRef = oldVal as DustDataReference;

            return((null == oldRef) ? oldVal : oldRef.eTarget);
        }
        public static DustDataEntity loadSingleFromText(string jsonText, string mod, string id)
        {
            DustSystem  system  = DustSystem.getSystem();
            DustSession session = system.getCurrentSession();

            Dictionary <string, JsonUnitWrapper> js;

            js = JsonConvert.DeserializeObject <Dictionary <string, JsonUnitWrapper> >(jsonText);

            foreach (string k in js.Keys)
            {
                JsonUnitWrapper jw = js[k];

                Console.WriteLine("Unit read " + k);

                jw.populate(js, system, k);
            }

            DustDataEntity eRoot = system.getEntity(mod, id);

            session.ctx[DustContext.SELF] = eRoot;

            return(eRoot);
        }
        public DustDataReference addItem(DustDataEntity target, Object hint)
        {
            DustDataReference refAdd = null;

            switch (eLinkDef.optValType)
            {
            case DustValType.LinkDefSet:
                var hs = coll as HashSet <DustDataReference>;
                if (null == hs)
                {
                    if (this.eTarget == target)
                    {
                        return(this);
                    }
                    coll = hs = new HashSet <DustDataReference>();
                    hs.Add(this);
                }
                else
                {
                    foreach (var rr in hs)
                    {
                        if (rr.eTarget == target)
                        {
                            return(rr);
                        }
                    }
                }

                refAdd      = new DustDataReference(eLinkDef, eSrc, target, hint);
                refAdd.coll = coll;

                hs.Add(refAdd);
                break;

            case DustValType.LinkDefArray:
                var lst = coll as List <DustDataReference>;
                if (null == lst)
                {
                    coll = lst = new List <DustDataReference>();
                    lst.Add(this);
                    this.id = 0;
                }

                refAdd      = new DustDataReference(eLinkDef, eSrc, target, hint);
                refAdd.coll = coll;

                if (hint is int)
                {
                    int idx = (int)hint;
                    if ((-1 != idx) && (idx < lst.Count))
                    {
                        lst[idx]  = refAdd;
                        refAdd.id = idx;
                        return(refAdd);
                    }
                }

                refAdd.id = lst.Count;
                lst.Add(refAdd);

                break;

            case DustValType.LinkDefMap:
                var map = coll as Dictionary <DustDataEntity, DustDataReference>;
                var key = hint as DustDataEntity;

                if (key == null)
                {
                    throw new System.ArgumentException("Invalid parameter", "hint");
                }

                refAdd    = new DustDataReference(eLinkDef, eSrc, target, hint);
                refAdd.id = key;

                if (key != this.id)
                {
                    if (null == map)
                    {
                        coll = map = new Dictionary <DustDataEntity, DustDataReference>();
                        map[(DustDataEntity)this.id] = this;
                    }

                    refAdd.coll = coll;
                    map[key]    = refAdd;
                }

                break;
            }

            return(refAdd);
        }
示例#9
0
 DustProcCursor(DustDataReference ddr)
     : base(ddr.getMembers())
 {
     this.owner = ddr.eSrc;
     this.key   = ddr.eLinkDef;
 }
示例#10
0
        public static DustProcCursor optSet(DustDataEntity owner, DustDataEntity key)
        {
            DustDataReference ddr = owner.getRef(key);

            return((null == ddr) ? null : new DustProcCursor(ddr));
        }
示例#11
0
        public DustDataReference getRef(DustDataEntity key)
        {
            Object ret;

            return((content.TryGetValue(key, out ret)) ? ret as DustDataReference : null);
        }
        public bool visitRef(DustDataEntity ei, DustDataEntity eKey, object readerParent, bool close)
        {
            bool           first  = true;
            DustProcCursor cursor = session.optSetCursor(ei, eKey);

            if (null != cursor)
            {
                Exception procEx = null;
                try {
                    foreach (DustDataReference ddr in cursor)
                    {
                        callbackTray.entity = ei;
                        callbackTray.value  = ddr.eTarget;
                        callbackTray.key    = eKey;

                        if (null != dvp)
                        {
                            if (first)
                            {
                                first = false;
                            }
                            else
                            {
                                sendVisitEvent(VisitEvent.refSep);
                            }
                        }

                        if (null != dvp)
                        {
                            object mapId = (DustValType.LinkDefMap == ddr.eLinkDef.optValType) ? ddr.getId() : null;

                            if (null != mapId)
                            {
                                callbackTray.key          = mapId;
                                callbackTray.readerParent = readerParent;
                                callbackTray.entity       = ddr.eTarget;

                                if (!sendVisitEvent(VisitEvent.keyStartOpt))
                                {
                                    callbackTray.entity = ei;
                                    continue;
                                }
                            }

                            callbackTray.entity = ddr.eTarget;
                            visitEntity(readerParent);

                            if (null != mapId)
                            {
                                callbackTray.key          = mapId;
                                callbackTray.readerParent = readerParent;
                                callbackTray.entity       = ddr.eTarget;
                                sendVisitEvent(VisitEvent.keyEnd);
                            }

                            callbackTray.key          = eKey;
                            callbackTray.entity       = ddr.eTarget;
                            callbackTray.readerParent = readerParent;
                            sendVisitEvent(VisitEvent.keyEnd);
                        }
                    }

                    if (!first && close)
                    {
                        sendVisitEvent(VisitEvent.visitEnd);
                    }
                } catch (Exception ex) {
                    callbackTray.readerObject = procEx = ex;
                    sendVisitEvent((ex is DustException) ? VisitEvent.visitAborted : VisitEvent.visitInternalError);
                } finally {
                    session.cursors.Remove(cursor);
                }

                if (null != procEx)
                {
                    throw procEx;
                }
            }

            return(!first);
        }
        public void populate(Dictionary <string, JsonUnitWrapper> js, DustSystem system, String name)
        {
            DustDataStore store = system.modules[name];

            foreach (var c in data.Children())
            {
                var p = (JProperty)c;

                var id = p.Name;

                if (isLocal(id))
                {
                    var eTarget = store[id];

                    var o = (JObject)p.Value;

                    foreach (var cc in o.Children())
                    {
                        var pp = (JProperty)cc;

                        var            key  = pp.Name;
                        DustDataEntity eKey = resolveRef(system, store, key);
                        eKey.optValType = getValType(key);
                        Object val = null;

                        switch (eKey.optValType)
                        {
                        case DustValType.AttDefBool:
                        case DustValType.AttDefIdentifier:
                        case DustValType.AttDefDouble:
                        case DustValType.AttDefLong:
                        case DustValType.AttDefRaw:
                            val = ((JValue)pp.Value).Value;
                            break;

                        case DustValType.LinkDefSingle:
                            val = ((JValue)pp.Value).Value;
                            val = resolveRef(system, store, (String)val);
                            break;

                        case DustValType.LinkDefSet:
                        case DustValType.LinkDefArray:
                            var a   = (JArray)pp.Value;
                            int idx = 0;

                            foreach (var r in a.Children())
                            {
                                eTarget.setValue(eKey, resolveRef(system, store, (String)r), idx++);
                            }

                            break;

                        case DustValType.LinkDefMap:
                            var m = (JObject)pp.Value;

                            foreach (var mc in m.Children())
                            {
                                var mp = (JProperty)mc;

                                var            mk  = mp.Name;
                                DustDataEntity eMK = resolveRef(system, store, mk);

                                var mv = ((JValue)mp.Value).Value;
                                mv = resolveRef(system, store, (String)mv);

                                eTarget.setValue(eKey, mv, eMK);
                            }

                            break;
                        }

                        if (null != val)
                        {
                            eTarget.setValue(eKey, val, null);
                        }
                    }
                }
            }
        }