PushResult() публичный Метод

将一次流程的结果放入堆栈
public PushResult ( PhaseResult result ) : void
result PhaseResult
Результат void
Пример #1
0
        public PhaseResult RunAsIteration(Context context)
        {
            Initialize(context);
            Boundary bound = _step > 0 ? new Boundary(LessOrEqual) : new Boundary(GreaterOrEqual);
            List<String> jsonResult = new List<string>();

            for (int i = _from; bound(i, _to); i += _step)
            {
                _updatableRequest.Update(context, i);
                PhaseResult pr = Request.Run(context);
                context.PushResult(pr);

                // 检查是否可以更新_to
                if (!_toPageInitialized)
                {
                    Match match = Regex.Match(context.LastRequestContent, To);
                    String pageStr = match.Groups[1].Value;
                    Int32 page;
                    if (Int32.TryParse(pageStr, out page))
                    {
                        _to = page;
                        _toPageInitialized = true;
                    }
                }

                pr = Parse.Run(context);
                context.PushResult(pr);

                if (pr.ListResult != null)
                {
                    jsonResult.AddRange(pr.ListResult);
                }
            }

            PhaseResult result = new PhaseResult(this);
            result.Succeed = true;
            result.ListResult = jsonResult;

            context.PushResult(result);

            return result;
        }
Пример #2
0
        public PhaseResult Run(Context context)
        {
            Boolean succ = true;

            foreach (IPhase phase in _logoutPhases)
            {
                PhaseResult pr = phase.Run(context);
                context.PushResult(pr);
                if (!pr.Succeed)
                {
                    succ = false;
                    break;
                }
            }

            PhaseResult result = new PhaseResult(this);
            result.Succeed = succ;

            return result;
        }
Пример #3
0
        public PhaseResult RunAsNestedList(Context context)
        {
            PhaseResult list = MetaList.Run(context);
            PhaseResult pr = new PhaseResult(this);
            List<String> jsonResult = new List<string>();

            if (list.ListResult != null)
            {
                GeckoWebBrowser browser = (GeckoWebBrowser)context.GetService(typeof(GeckoWebBrowser));
                foreach (String item in list.ListResult)
                {
                    Dictionary<String, String> itemDict = JsonConvert.DeserializeObject<Dictionary<String, String>>(item);
                    if (itemDict.ContainsKey(MetaListUrlKey))
                    {
                        String url = itemDict[MetaListUrlKey];
                        if (!url.StartsWith("http"))
                        {
                            url = String.Format("{0}/{1}", "http://club.autohome.com.cn", url.TrimStart('/'));
                        }
                        String content = String.Empty;
                        if (browser != null)
                        {
                            content = RequestHelper.BrowserGet(browser, url);
                        }
                        else
                        {
                            content = RequestHelper.Get(url);
                        }
                        context.LastRequestContent = content;
                        PhaseResult parseResult = Parse.Run(context);
                        context.PushResult(parseResult);
                        jsonResult.AddRange(parseResult.ListResult ?? new List<String>());
                    }
                }
            }

            pr.ListResult = jsonResult;
            pr.Succeed = true;
            return pr;
        }
Пример #4
0
        /// <summary>
        /// context里的RuntimeProvider应该已经设置好
        /// </summary>
        /// <returns></returns>
        private List<String> GenerateOneBatch(Context context)
        {
            Int32 from;
            Int32 to;
            Int32 step;

            List<String> result = new List<string>();

            if (!Int32.TryParse(From, out from))
            {
                throw new ArgumentException("From is corrupted.");
            }

            if (!Int32.TryParse(Step, out step))
            {
                throw new ArgumentException("Step is corrupted.");
            }

            // 如果To不是一个数字,则是一个正则表达式,先使用FirstPage进行请求html
            if (!Int32.TryParse(To, out to))
            {
                if (FirstPage == null)
                {
                    String msg = "When To is a regular expression, FirstPage is expected.";
                    throw new ArgumentException(msg);
                }
                PhaseResult html = FirstPage.Run(context);
                context.PushResult(html);

                Match match = Regex.Match(context.LastRequestContent, To);
                if (!match.Success || !Int32.TryParse(match.Groups[1].Value, out to))
                {
                    to = from;
                }
            }

            //String pattern = context.Resolve(Pattern);
            for (int i = from; i <= to; i += step)
            {
                Dictionary<String, String> dict = new Dictionary<string, string>();
                foreach (Pattern pattern in Patterns)
                {
                    String resolvedPattern = context.Resolve(pattern.RawPattern);
                    if (ParameterResolver.HasDataBinding(resolvedPattern, Constant.RuntimePrefix))
                    {
                        return null;
                    }
                    String gen = resolvedPattern.Replace(Constant.UpdatablePlaceHolder, i.ToString());
                    dict.Add(pattern.Name, gen);
                }
                result.Add(JsonConvert.SerializeObject(dict));
            }

            if (Save)
            {
                context.JsonResult.AddRange(result);
            }

            return result;
        }
Пример #5
0
        public PhaseResult Run(Context context)
        {
            //PhaseResult last = context.Stack.LastOrDefault();
            List<String> bind = null;
            if (!String.IsNullOrWhiteSpace(Binding))
            {
                if (context.JsonResults.ContainsKey(Binding))
                {
                    bind = context.JsonResults[Binding];
                }
                else
                {
                    bind = new List<string>();
                }
            }
            else
            {
                PhaseResult last = context.Stack.LastOrDefault();
                if (last != null)
                {
                    bind = last.ListResult;
                }
            }

            PhaseResult pr = new PhaseResult(this);
            pr.ListResult = new List<string>();

            if (bind != null)
            {
                foreach (String json in bind)
                {
                    //IDataProvider provider = new BasicDataProvider();
                    // TODO:使用动态绑定来获取url
                    // provider.SetString("url", json);
                    try
                    {
                        IDataProvider provider = BasicDataProvider.CreateFromJson(json);
                        context.RuntimeProviders.Push(provider);

                        PhaseResult result = Request.Run(context);
                        context.PushResult(result);
                        result = Parse.Run(context);
                        context.PushResult(result);

                        if (result.ListResult != null)
                        {
                            pr.ListResult.AddRange(result.ListResult);
                        }
                    }
                    finally
                    {
                        context.RuntimeProviders.Pop();
                    }
                }
            }
            else
            {

                PhaseResult result = Request.Run(context);
                context.PushResult(result);
                result = Parse.Run(context);
                context.PushResult(result);

                if (result.ListResult != null)
                {
                    pr.ListResult.AddRange(result.ListResult);
                }
            }

            if (!String.IsNullOrWhiteSpace(ListID))
            {
                if (context.JsonResults.ContainsKey(ListID))
                {
                    context.JsonResults[ListID] = pr.ListResult;
                }
                else
                {
                    context.JsonResults.Add(ListID, pr.ListResult);
                }
            }

            return pr;
        }