public virtual ObjectConstructionResult CreateObject(ImportContext context, JsonReader reader)
        {
            if (context == null) 
                throw new ArgumentNullException("context");
            if (reader == null) 
                throw new ArgumentNullException("reader");

            IObjectSurrogateConstructor ctor = (IObjectSurrogateConstructor) context.Import(_surrogateType, reader);
            return ctor.CreateObject(context);
        }
 public object Import(ImportContext context, Jayrock.Json.JsonReader reader)
 {
     ActiveReaderMessage arMessage = null;
       Dispatcher.Invoke(DispatcherPriority.Background,
     (Action)delegate()
     {
       arMessage = (ActiveReaderMessage)context.Import<ActiveReaderMessage>(reader); ;
     });
       return arMessage;
 }
        /// <summary>
        /// The import.
        /// </summary>
        /// <param name="context">
        /// The context.
        /// </param>
        /// <param name="reader">
        /// The reader.
        /// </param>
        /// <returns>
        /// The import.
        /// </returns>
        public object Import(ImportContext context, JsonReader reader)
        {
            // var properties = new EvolutionaryProperties();
            // reader.StepOut();
            // JsonToken token = reader.Token;
            this.properties = new EvolutionaryProperties();

            PropertyValue[] o = context.Import<PropertyValue[]>(reader);
            this.SetProperties(o);

            return this.properties;
        }
Beispiel #4
0
        public static object Import(Type type, JsonReader reader)
        {
            if (type == null)
            {
                throw new ArgumentNullException("type");
            }
            if (reader == null)
            {
                throw new ArgumentNullException("reader");
            }
            ImportContext importContext = new ImportContext();

            return(importContext.Import(type, reader));
        }
        public virtual ObjectConstructionResult CreateObject(ImportContext context, JsonReader reader)
        {
            if (context == null)
            {
                throw new ArgumentNullException("context");
            }
            if (reader == null)
            {
                throw new ArgumentNullException("reader");
            }

            IObjectSurrogateConstructor ctor = (IObjectSurrogateConstructor)context.Import(_surrogateType, reader);

            return(ctor.CreateObject(context));
        }
Beispiel #6
0
        protected override object ImportFromArray(ImportContext context, JsonReader reader)
        {
            Debug.Assert(context != null);
            Debug.Assert(reader != null);

            reader.Read();

            ArrayList list = new ArrayList();
            Type elementType = OutputType.GetElementType();

            while (reader.TokenClass != JsonTokenClass.EndArray)
                list.Add(context.Import(elementType, reader));

            return ReadReturning(reader, list.ToArray(elementType));
        }
        protected override void ImportElements(object collection, ImportContext context, JsonReader reader)
        {
            if (collection == null) throw new ArgumentNullException("collection");
            if (context == null) throw new ArgumentNullException("context");
            if (reader == null) throw new ArgumentNullException("reader");

            object[] args = null;
            while (reader.TokenClass != JsonTokenClass.EndArray)
            {
                if (args == null)           // on-demand
                    args = new object[1];

                args[0] = context.Import(ElementType, reader);
                InvokeAdd(collection, args);
            }
        }
Beispiel #8
0
        private static ObjectConstructionResult TryCreateObject(ImportContext context, ConstructorInfo ctor, NamedJsonBuffer[] members)
        {
            Debug.Assert(context != null);
            Debug.Assert(ctor != null);
            Debug.Assert(members != null);

            ParameterInfo[] parameters = ctor.GetParameters();

            if (parameters.Length > members.Length)
            {
                return(null);
            }

            int[] bindings = Bind(context, parameters, members);

            int argc = 0;

            object[]         args  = null;
            JsonBufferWriter tailw = null;

            for (int i = 0; i < bindings.Length; i++)
            {
                int binding = bindings[i] - 1;

                if (binding >= 0)
                {
                    if (args == null)
                    {
                        args = new object[parameters.Length];
                    }

                    Type       type = parameters[binding].ParameterType;
                    JsonBuffer arg  = members[i].Buffer;
                    args[binding] = context.Import(type, arg.CreateReader());
                    argc++;
                }
                else
                {
                    if (tailw == null)
                    {
                        tailw = new JsonBufferWriter();
                        tailw.WriteStartObject();
                    }

                    NamedJsonBuffer member = members[i];
                    tailw.WriteMember(member.Name);
                    tailw.WriteFromReader(member.Buffer.CreateReader());
                }
            }

            if (tailw != null)
            {
                tailw.WriteEndObject();
            }

            if (argc != parameters.Length)
            {
                return(null);
            }

            object obj = ctor.Invoke(args);

            JsonBuffer tail = tailw != null
                            ? tailw.GetBuffer()
                            : StockJsonBuffers.EmptyObject;

            return(new ObjectConstructionResult(obj, tail.CreateReader()));
        }
Beispiel #9
0
        protected virtual void Import(ImportContext context, JsonReader reader)
        {
            if (context == null)
                throw new ArgumentNullException("context");

            if (reader == null)
                throw new ArgumentNullException("reader");

            //
            // IMPORTANT! A new list is created and then committed to make
            // sure that this method is exception-safe. If something goes
            // wrong during the import of elements then this instance
            // will remain largely untouched.
            //

            ArrayList list = new ArrayList();

            reader.ReadToken(JsonTokenClass.Array);

            while (reader.TokenClass != JsonTokenClass.EndArray)
                list.Add(context.Import(reader));

            reader.Read();

            InnerList.Clear();
            InnerList.AddRange(list);
        }
Beispiel #10
0
        private object ImportScalarAsArray(ImportContext context, JsonReader reader)
        {
            Debug.Assert(context != null);
            Debug.Assert(reader != null);

            Type elementType = OutputType.GetElementType();
            Array array = Array.CreateInstance(elementType, 1);
            array.SetValue(context.Import(elementType, reader), 0);
            return array;
        }
Beispiel #11
0
        protected virtual void Import(ImportContext context, JsonReader reader)
        {
            if (context == null)
                throw new ArgumentNullException("context");

            if (reader == null)
                throw new ArgumentNullException("reader");

            // FIXME: Consider making this method exception-safe.
            // Right now this is a problem because of reliance on
            // DictionaryBase.
            
            Clear();
            
            reader.ReadToken(JsonTokenClass.Object);
            
            while (reader.TokenClass != JsonTokenClass.EndObject)
                Put(reader.ReadMember(), context.Import(reader));
            
            reader.Read();
        }
Beispiel #12
0
 void IObjectMemberImporter.Import(ImportContext context, JsonReader reader, object target)
 {
     ImportArgs = new object[] { context, reader, target };
     ImportedValue = context.Import(typeof(object), reader);
     _sequence.Add(this);
 }
Beispiel #13
0
 public bool Import(ImportContext context, string name, JsonReader reader)
 {
     if (reader.TokenClass != JsonTokenClass.String)
         return false;
     NonMembers[name] = context.Import(reader);
     return true;
 }
Beispiel #14
0
        private static void Run()
        {
            ImportContext impctx = new ImportContext();

            //
            // Import a strongly-typed collection of integers...
            //

            impctx.Register(new ListImporter<int>());

            List<int> numbers = (List<int>) impctx.Import(typeof(List<int>), 
                JsonText.CreateReader("[ 1, 2, 3 ]"));
            numbers.ForEach(Console.WriteLine);
            Console.WriteLine();

            //
            // Import a Shape object containing a strongly-typed collection of 
            // Point objects.
            //

            impctx.Register(new ListImporter<Point>());

            Shape shape = (Shape) impctx.Import(typeof(Shape), JsonText.CreateReader(@"{ 
                    name: 'square', 
                    points: [
                        { x: 10, y: 10 },
                        { x: 20, y: 10 }, 
                        { x: 20, y: 20 },
                        { x: 10, y: 20 }
                    ]
                }"));
            JsonConvert.Export(shape, CreatePrettyWriter(Console.Out));
            Console.WriteLine();

            //
            // Import CookieCollection using duck-typing. In other words,
            // as long as CookieCollection walks and quacks like a
            // collection of Cookie elements then it's good enough for
            // DuckCollectionImporter. DuckCollectionImporter can infer
            // that CookieCollection contains Cookie elements.
            //

            impctx.Register(new DuckCollectionImporter(typeof(CookieCollection)));

            const string cookiesText = @"[
                    { name: 'one',   value: 1, expires: '2099-01-02' },
                    { name: 'two',   value: 2, expires: '2088-03-04' },
                    { name: 'three', value: 3, expires: '2077-05-06' }
                ]";
            
            CookieCollection cookies = (CookieCollection) impctx.Import(typeof(CookieCollection), JsonText.CreateReader(cookiesText));
            JsonConvert.Export(cookies, CreatePrettyWriter(Console.Out));
            Console.WriteLine();

            //
            // Now repeat, but replace with a new CookieCollection importer
            // that is identical in behavior but based on generics. Here,
            // the difference is that DuckCollectionImporter<,> does not
            // have to guess the element type as it is provided as a type
            // argument.
            //

            impctx.Register(new DuckCollectionImporter<CookieCollection, Cookie>());
            cookies = (CookieCollection)impctx.Import(typeof(CookieCollection), JsonText.CreateReader(cookiesText));
            JsonConvert.Export(cookies, CreatePrettyWriter(Console.Out));
            Console.WriteLine();

            //
            // Those Cookie objects have a lot of properties. Say our JSON
            // text only needs a subset. Here, we register an exporter that 
            // provides a custom view of the type. We only expose the name, 
            // value and expiration time. What's more, we rename the 
            // Expires property so that it appears as "expiration" in JSON.
            //

            ExportContext expctx = new ExportContext();

            JsonType.
                BuildFor(typeof(Cookie)).
                AddProperty("Name").
                AddProperty("Value").
                AddProperty("Expires").As("expiration").
                Register(expctx);

            expctx.Export(cookies, CreatePrettyWriter(Console.Out));
            Console.WriteLine();
        }
 void IObjectMemberImporter.Import(ImportContext context, JsonReader reader, object target)
 {
     ImportContext = context;
     ImportReader = reader;
     ImportTarget = target;
     ImportedValue = context.Import(typeof(object), reader);
 }
        public void MemberImportCustomization()
        {
            TestObjectMemberImporter memberImporter = new TestObjectMemberImporter();
            Hashtable services = new Hashtable();
            services.Add(typeof(IObjectMemberImporter), memberImporter);

            TestTypeDescriptor logicalType = new TestTypeDescriptor();
            PropertyDescriptorCollection properties = logicalType.GetProperties();
            TestPropertyDescriptor property = new TestPropertyDescriptor("prop", typeof(object), services);
            properties.Add(property);
            
            ComponentImporter importer = new ComponentImporter(typeof(Thing), logicalType);
            ImportContext context = new ImportContext();
            context.Register(importer);
            
            JsonRecorder writer = new JsonRecorder();
            writer.WriteStartObject();
            writer.WriteMember("prop");
            writer.WriteString("value");
            writer.WriteEndObject();

            JsonReader reader = writer.CreatePlayer();
            Thing thing = (Thing) context.Import(typeof(Thing), reader);
            
            Assert.AreSame(context, memberImporter.ImportContext);
            Assert.AreSame(reader, memberImporter.ImportReader);
            Assert.AreSame(thing, memberImporter.ImportTarget);
            Assert.AreEqual("value", memberImporter.ImportedValue);
        }
 public object Import(ImportContext context, Jayrock.Json.JsonReader reader)
 {
   MockMessage mMessage = context.Import<MockMessage>(reader);
   return mMessage;
 }
Beispiel #18
0
 public object Import(ImportContext context, Jayrock.Json.JsonReader reader)
 {
     WhatUpMessage pMessage = (WhatUpMessage)context.Import<WhatUpMessage>(reader); ;
       return pMessage;
 }
Beispiel #19
0
        public void MemberImportCustomization()
        {
            TestTypeDescriptor logicalType = new TestTypeDescriptor();
            PropertyDescriptorCollection properties = logicalType.GetProperties();

            properties.Add(new TestPropertyDescriptor("prop1", typeof(object), new Hashtable()));

            ArrayList calls2 = new ArrayList();
            TestObjectMemberImporter memberImporter2 = new TestObjectMemberImporter(calls2);
            Hashtable services2 = new Hashtable();
            services2.Add(typeof(IObjectMemberImporter), memberImporter2);
            properties.Add(new TestPropertyDescriptor("prop2", typeof(object), services2));

            // Third property added to exercise issue #27:
            // http://code.google.com/p/jayrock/issues/detail?id=27

            ArrayList calls3 = new ArrayList();
            TestObjectMemberImporter memberImporter3 = new TestObjectMemberImporter(calls3);
            Hashtable services3 = new Hashtable();
            services3.Add(typeof(IObjectMemberImporter), memberImporter3);
            properties.Add(new TestPropertyDescriptor("prop3", typeof(object), services3));

            ComponentImporter importer = new ComponentImporter(typeof(Thing), logicalType);
            ImportContext context = new ImportContext();
            context.Register(importer);
            
            JsonRecorder writer = new JsonRecorder();
            writer.WriteStartObject();
            writer.WriteMember("prop1");
            writer.WriteString("value1");
            writer.WriteMember("prop2");
            writer.WriteString("value2");
            writer.WriteMember("prop3");
            writer.WriteString("value3");
            writer.WriteEndObject();

            JsonReader reader = writer.CreatePlayer();
            Thing thing = (Thing) context.Import(typeof(Thing), reader);

            Assert.AreEqual(1, calls2.Count);

            Assert.AreSame(memberImporter2, calls2[0]);
            Assert.AreEqual(new object[] { context, reader, thing }, memberImporter2.ImportArgs);
            Assert.AreEqual("value2", memberImporter2.ImportedValue);

            Assert.AreEqual(1, calls3.Count);

            Assert.AreSame(memberImporter3, calls3[0]);
            Assert.AreEqual(new object[] { context, reader, thing }, memberImporter3.ImportArgs);
            Assert.AreEqual("value3", memberImporter3.ImportedValue);
        }
Beispiel #20
0
        //! move out of current pipeline
        public PipelineDescriptor NavigatePop()
        {
            ImportContext impctx = new ImportContext();
            impctx.Register(new ListImporter<ModuleDescriptor>());
            impctx.Register(new ListImporter<ConnectionDescriptor>());
            impctx.Register(new ListImporter<EndpointDescriptor>());

            PipelineDescriptor newPipeline = (PipelineDescriptor)impctx.Import(
                typeof(PipelineDescriptor),
                JsonText.CreateReader(test_RootPipelineJSON));

            NuiState.Instance.level--;
            currentPipeline = newPipeline;

            return newPipeline;
        }
Beispiel #21
0
 private static object Import(Type expectedType, string s)
 {
     JsonReader reader = CreateReader(s);
     ImportContext context = new ImportContext();
     object o = context.Import(expectedType, reader);
     Assert.IsTrue(reader.EOF, "Reader must be at EOF.");
     Assert.IsNotNull(o);
     Assert.IsInstanceOfType(expectedType, o);
     return o;
 }
Beispiel #22
0
        /************************************************************************/
        /* GET                                                                  */
        /************************************************************************/
#if TEST
        public PipelineDescriptor GetPipeline(string pipelineName)
        {
            PipelineDescriptor pipeline = null;
            ImportContext impctx = new ImportContext();
            impctx.Register(new ListImporter<ModuleDescriptor>());
            impctx.Register(new ListImporter<EndpointDescriptor>());
            impctx.Register(new ListImporter<ConnectionDescriptor>());

            switch (pipelineName)
            {
                case "root": 
                    pipeline = (PipelineDescriptor)impctx.Import(
                        typeof(PipelineDescriptor),
                        JsonText.CreateReader(test_RootPipelineJSON));
                    break;

                case "pipeline1":
                    pipeline = (PipelineDescriptor)impctx.Import(
                        typeof(PipelineDescriptor),
                        JsonText.CreateReader(test_Pipeline1JSON));
                    break;
            }

            return pipeline;
        }
Beispiel #23
0
        public void YahooNewsSearch()
        {
            string text = @"
            /* Source: http://api.search.yahoo.com/NewsSearchService/V1/newsSearch?appid=YahooDemo&query=yahoo&results=3&language=en&output=json */
            {
                'ResultSet': {
                    'totalResultsAvailable': '2393',
                    'totalResultsReturned': 3,
                    'firstResultPosition': '1',
                    'Result': [
                        {
                            'Title': 'Yahoo invites its users to shoot ads',
                            'Summary': ' Yahoo first encouraged consumers to create blogs and photo pages with text and pictures. Now, the Internet portal wants them to make advertisements, too. On Monday, Yahoo touts a new look for its front page by asking people to pull out the video camera, open up the editing software and create 12-second spot for Yahoo.',
                            'Url': 'http://news.yahoo.com/s/usatoday/20060717/tc_usatoday/yahooinvitesitsuserstoshootads',
                            'ClickUrl': 'http://news.yahoo.com/s/usatoday/20060717/tc_usatoday/yahooinvitesitsuserstoshootads',
                            'NewsSource': 'USATODAY.com via Yahoo! News',
                            'NewsSourceUrl': 'http://news.yahoo.com/',
                            'Language': 'en',
                            'PublishDate': '1153133816',
                            'ModificationDate': '1153134044'
                        },
                        {
                            'Title': 'Yahoo to launch new finance features',
                            'Summary': ' Yahoo Inc. is beefing up the finance section of its Web site with more interactive stock charts and other features to help it maintain its longtime lead over rival financial information sites.',
                            'Url': 'http://news.yahoo.com/s/ap/20060717/ap_on_hi_te/yahoo_finance_2',
                            'ClickUrl': 'http://news.yahoo.com/s/ap/20060717/ap_on_hi_te/yahoo_finance_2',
                            'NewsSource': 'AP via Yahoo! News',
                            'NewsSourceUrl': 'http://news.yahoo.com/',
                            'Language': 'en',
                            'PublishDate': '1153134777',
                            'ModificationDate': '1153134920',
                            'Thumbnail': {
                                'Url': 'http://us.news2.yimg.com/us.yimg.com/p/ap/20060714/vsthumb.8b1161b66b564adba0a5bbd6339c9379.media_summit_idet125.jpg',
                                'Height': '82',
                                'Width': '76'
                            }
                        }, 
                        {
                            'Title': 'Yahoo Finance revises charts, chat, other features',
                            'Summary': ' Yahoo Inc. on Monday will unveil an upgraded version of its top-ranked financial information site that features new stock charting tools, improved investor chat rooms and financial video news.',
                            'Url': 'http://news.yahoo.com/s/nm/20060717/wr_nm/media_yahoo_finance_dc_2',
                            'ClickUrl': 'http://news.yahoo.com/s/nm/20060717/wr_nm/media_yahoo_finance_dc_2',
                            'NewsSource': 'Reuters via Yahoo! News',
                            'NewsSourceUrl': 'http://news.yahoo.com/',
                            'Language': 'en',
                            'PublishDate': '1153113288',
                            'ModificationDate': '1153113674'
                        }
                    ]
                }
            }";
            
            JsonTextReader reader = new JsonTextReader(new StringReader(text));
            ImportContext context = new ImportContext();
            YahooResponse response = (YahooResponse) context.Import(typeof(YahooResponse), reader);
            Assert.IsNotNull(response);
            
            YahooResultSet resultSet = response.ResultSet;
            Assert.IsNotNull(resultSet);
            Assert.AreEqual(2393,  resultSet.totalResultsAvailable);
            Assert.AreEqual(3,  resultSet.totalResultsReturned);
            Assert.AreEqual(1,  resultSet.firstResultPosition);
            Assert.AreEqual(3,  resultSet.Result.Length);
            
            YahooResult result = resultSet.Result[0];
            
            Assert.IsNotNull(result);
            Assert.AreEqual("Yahoo invites its users to shoot ads", result.Title);
            Assert.AreEqual(" Yahoo first encouraged consumers to create blogs and photo pages with text and pictures. Now, the Internet portal wants them to make advertisements, too. On Monday, Yahoo touts a new look for its front page by asking people to pull out the video camera, open up the editing software and create 12-second spot for Yahoo.", result.Summary);
            Assert.AreEqual("http://news.yahoo.com/s/usatoday/20060717/tc_usatoday/yahooinvitesitsuserstoshootads", result.Url);
            Assert.AreEqual("http://news.yahoo.com/s/usatoday/20060717/tc_usatoday/yahooinvitesitsuserstoshootads", result.ClickUrl);
            Assert.AreEqual("USATODAY.com via Yahoo! News", result.NewsSource);
            Assert.AreEqual("http://news.yahoo.com/", result.NewsSourceUrl);
            Assert.AreEqual("en", result.Language);
            Assert.AreEqual(1153133816, result.PublishDate);
            Assert.AreEqual(1153134044, result.ModificationDate);
            
            result = resultSet.Result[1];

            Assert.AreEqual("Yahoo to launch new finance features", result.Title);
            Assert.AreEqual(" Yahoo Inc. is beefing up the finance section of its Web site with more interactive stock charts and other features to help it maintain its longtime lead over rival financial information sites.", result.Summary);
            Assert.AreEqual("http://news.yahoo.com/s/ap/20060717/ap_on_hi_te/yahoo_finance_2", result.Url);
            Assert.AreEqual("http://news.yahoo.com/s/ap/20060717/ap_on_hi_te/yahoo_finance_2", result.ClickUrl);
            Assert.AreEqual("AP via Yahoo! News", result.NewsSource);
            Assert.AreEqual("http://news.yahoo.com/", result.NewsSourceUrl);
            Assert.AreEqual("en", result.Language);
            Assert.AreEqual(1153134777, result.PublishDate);
            Assert.AreEqual(1153134920, result.ModificationDate);
            Assert.AreEqual("http://us.news2.yimg.com/us.yimg.com/p/ap/20060714/vsthumb.8b1161b66b564adba0a5bbd6339c9379.media_summit_idet125.jpg", result.Thumbnail.Url);
            Assert.AreEqual(82, result.Thumbnail.Height);
            Assert.AreEqual(76, result.Thumbnail.Width);

            result = resultSet.Result[2];

            Assert.AreEqual("Yahoo Finance revises charts, chat, other features", result.Title);
            Assert.AreEqual(" Yahoo Inc. on Monday will unveil an upgraded version of its top-ranked financial information site that features new stock charting tools, improved investor chat rooms and financial video news.", result.Summary);
            Assert.AreEqual("http://news.yahoo.com/s/nm/20060717/wr_nm/media_yahoo_finance_dc_2", result.Url);
            Assert.AreEqual("http://news.yahoo.com/s/nm/20060717/wr_nm/media_yahoo_finance_dc_2", result.ClickUrl);
            Assert.AreEqual("Reuters via Yahoo! News", result.NewsSource);
            Assert.AreEqual("http://news.yahoo.com/", result.NewsSourceUrl);
            Assert.AreEqual("en", result.Language);
            Assert.AreEqual(1153113288, result.PublishDate);
            Assert.AreEqual(1153113674, result.ModificationDate);
        }
        protected virtual object ParseRequest(TextReader input)
        {
            if (input == null)
                throw new ArgumentNullException("input");

            JsonReader reader = (JsonReader) _serviceProvider.GetService(typeof(JsonReader));

            if (reader == null)
                reader = new JsonTextReader(input);

            ImportContext importContext = new ImportContext();

            JsonObject request = new JsonObject();
            Method method = null;
            JsonReader paramsReader = null;
            object args = null;

            reader.ReadToken(JsonTokenClass.Object);

            while (reader.TokenClass != JsonTokenClass.EndObject)
            {
                string memberName = reader.ReadMember();

                switch (memberName)
                {
                    case "id" :
                    {
                        request["id"] = importContext.Import(reader);
                        break;
                    }

                    case "method" :
                    {
                        string methodName = reader.ReadString();
                        request["method"] = methodName;
                        method = _service.GetClass().GetMethodByName(methodName);

                        if (paramsReader != null)
                        {
                            //
                            // If the parameters were already read in and
                            // buffer, then deserialize them now that we know
                            // the method we're dealing with.
                            //

                            args = ReadParameters(method, paramsReader, importContext);
                            paramsReader = null;
                        }

                        break;
                    }

                    case "params" :
                    {
                        //
                        // Is the method already known? If so, then we can
                        // deserialize the parameters right away. Otherwise
                        // we record them until hopefully the method is
                        // encountered.
                        //

                        if (method != null)
                        {
                            args = ReadParameters(method, reader, importContext);
                        }
                        else
                        {
                            JsonRecorder recorder = new JsonRecorder();
                            recorder.WriteFromReader(reader);
                            paramsReader = recorder.CreatePlayer();
                        }

                        break;
                    }

                    default:
                    {
                        reader.Skip();
                        break;
                    }
                }
            }

            reader.Read();

            if (args != null)
                request["params"] = args;

            return request;
        }
        public void MemberImportCustomization()
        {
            ArrayList calls = new ArrayList();

            TestTypeDescriptor logicalType = new TestTypeDescriptor();
            PropertyDescriptorCollection properties = logicalType.GetProperties();

            properties.Add(new TestPropertyDescriptor("prop1", typeof(object), new Hashtable()));

            TestObjectMemberImporter memberImporter = new TestObjectMemberImporter(calls);
            Hashtable services = new Hashtable();
            services.Add(typeof(IObjectMemberImporter), memberImporter);
            properties.Add(new TestPropertyDescriptor("prop2", typeof(object), services));

            ComponentImporter importer = new ComponentImporter(typeof(Thing), logicalType);
            ImportContext context = new ImportContext();
            context.Register(importer);

            JsonRecorder writer = new JsonRecorder();
            writer.WriteStartObject();
            writer.WriteMember("prop1");
            writer.WriteString("value1");
            writer.WriteMember("prop2");
            writer.WriteString("value2");
            writer.WriteEndObject();

            JsonReader reader = writer.CreatePlayer();
            Thing thing = (Thing) context.Import(typeof(Thing), reader);

            Assert.AreEqual(1, calls.Count);

            Assert.AreSame(memberImporter, calls[0]);
            Assert.AreEqual(new object[] { context, reader, thing }, memberImporter.ImportArgs);
            Assert.AreEqual("value2", memberImporter.ImportedValue);
        }
Beispiel #26
0
        /************************************************************************/
        /* NAVIGATE                                                             */
        /************************************************************************/
        //! move into next pipeline 
#if TEST
        public PipelineDescriptor NavigatePush(int moduleIdx)
        {
            ImportContext impctx = new ImportContext();
            impctx.Register(new ListImporter<ModuleDescriptor>());
            impctx.Register(new ListImporter<ConnectionDescriptor>());
            impctx.Register(new ListImporter<EndpointDescriptor>());

            PipelineDescriptor newPipeline = ((Response<PipelineDescriptor>)impctx.Import(
                typeof(Response<PipelineDescriptor>),
                JsonText.CreateReader(test_Pipeline1JSON))).GetResponse();

            NuiState.Instance.level++;
            currentPipeline = newPipeline;

            return newPipeline;
        }
        private static object ReadParameters(Method method, JsonReader reader, ImportContext importContext)
        {
            Debug.Assert(method != null);
            Debug.Assert(reader != null);
            Debug.Assert(importContext != null);

            reader.MoveToContent();

            Parameter[] parameters = method.GetParameters();

            if (reader.TokenClass == JsonTokenClass.Array)
            {
                reader.Read();
                ArrayList argList = new ArrayList(parameters.Length);

                // TODO: This loop could bomb when more args are supplied that parameters available.

                for (int i = 0; i < parameters.Length && reader.TokenClass != JsonTokenClass.EndArray; i++)
                    argList.Add(importContext.Import(parameters[i].ParameterType, reader));

                reader.StepOut();
                return argList.ToArray();
            }
            else if (reader.TokenClass == JsonTokenClass.Object)
            {
                reader.Read();
                JsonObject argByName = new JsonObject();

                while (reader.TokenClass != JsonTokenClass.EndObject)
                {
                    // TODO: Imporve this lookup.
                    // FIXME: Does not work when argument is positional.

                    Type parameterType = AnyType.Value;
                    string name = reader.ReadMember();

                    foreach (Parameter parameter in parameters)
                    {
                        if (parameter.Name.Equals(name))
                        {
                            parameterType = parameter.ParameterType;
                            break;
                        }
                    }

                    argByName.Put(name, importContext.Import(parameterType, reader));
                }

                reader.Read();
                return argByName;
            }
            else
            {
                return importContext.Import(reader);
            }
        }
Beispiel #28
0
        private static ObjectConstructionResult TryCreateObject(ImportContext context, ConstructorInfo ctor, NamedJsonBuffer[] members)
        {
            Debug.Assert(context != null);
            Debug.Assert(ctor != null);
            Debug.Assert(members != null);

            ParameterInfo[] parameters = ctor.GetParameters();
            
            if (parameters.Length > members.Length)
                return null;

            int[] bindings = Bind(context, parameters, members);

            int argc = 0;
            object[] args = null;
            JsonBufferWriter tailw = null;

            for (int i = 0; i < bindings.Length; i++)
            {
                int binding = bindings[i] - 1;
                
                if (binding >= 0)
                {
                    if (args == null)
                        args = new object[parameters.Length];

                    Type type = parameters[binding].ParameterType;
                    JsonBuffer arg = members[i].Buffer;
                    args[binding] = context.Import(type, arg.CreateReader());
                    argc++;
                }
                else
                {
                    if (tailw == null)
                    {
                        tailw = new JsonBufferWriter();
                        tailw.WriteStartObject();
                    }

                    NamedJsonBuffer member = members[i];
                    tailw.WriteMember(member.Name);
                    tailw.WriteFromReader(member.Buffer.CreateReader());
                }
            }

            if (tailw != null)
                tailw.WriteEndObject();

            if (argc != parameters.Length) 
                return null;

            object obj = ctor.Invoke(args);

            JsonBuffer tail = tailw != null 
                            ? tailw.GetBuffer() 
                            : StockJsonBuffers.EmptyObject;
            
            return new ObjectConstructionResult(obj, tail.CreateReader());
        }