예제 #1
0
        public OtherMethods(FluentMethodGroup fluentMethodGroup)
        {
            StandardMethodsInfo standardMethods = fluentMethodGroup.StandardMethodsInfo();

            //
            this.fluentMethodGroup = fluentMethodGroup;
            this.AddRange(this.fluentMethodGroup.InnerMethods
                          .Where(innerMethod => !standardMethods.IsStandardInnerMethod(innerMethod) && !standardMethods.IsConfictWithStandardFluentMethod(innerMethod))
                          .Select(innerMethod => new OtherMethod(innerMethod, this.fluentMethodGroup))
                          .ToList());
        }
예제 #2
0
        public OtherMethods(SegmentFluentMethodGroup fluentMethodGroup)
        {
            // First get all "standard methods" in a fluent method group
            //
            StandardMethodsInfo standardMethods = fluentMethodGroup.StandardMethodsInfo();

            // then build collection of "non-standard methods" (OtherMethods) by filtering out "standard methods" from "all methods".
            //
            this.fluentMethodGroup = fluentMethodGroup;
            this.AddRange(this.fluentMethodGroup.InnerMethods
                          .Where(innerMethod => !standardMethods.IsStandardInnerMethod(innerMethod) && !standardMethods.IsConfictWithStandardFluentMethod(innerMethod))
                          .Select(innerMethod => new OtherMethod(innerMethod, this.fluentMethodGroup))
                          .ToList());
        }
예제 #3
0
        private IEnumerable <string> FilteredMethodImpls(StandardMethodsInfo standardMethodsInfo)
        {
            string innerClientName = this.fluentMethodGroup.InnerMethodGroupTypeName;
            //
            IEnumerable <OtherMethod> otherMethods = this
                                                     .Where(o => !standardMethodsInfo.IsStandardInnerMethod(o.InnerMethod) &&
                                                            !standardMethodsInfo.IsConfictWithStandardFluentMethod(o.InnerMethod));
            //
            StringBuilder methodsBuilder = new StringBuilder();

            foreach (OtherMethod otherMethod in otherMethods)
            {
                methodsBuilder.Clear();

                IModel returnModel = otherMethod.ReturnModel;
                if (returnModel is PrimitiveModel)
                {
                    methodsBuilder.AppendLine($"@Override");
                    methodsBuilder.AppendLine($"public Completable {otherMethod.Name}Async({otherMethod.InnerMethodRequiredParameterDeclaration}) {{");
                    methodsBuilder.AppendLine($"    {innerClientName} client = this.inner();");
                    methodsBuilder.AppendLine($"    return client.{otherMethod.Name}Async({otherMethod.InnerMethodInvocationParameters}).toCompletable();");
                    methodsBuilder.AppendLine($"}}");
                }
                else
                {
                    if (!otherMethod.InnerMethod.IsPagingOperation)
                    {
                        string rxReturnType;
                        string returnModelClassName;
                        string mapForWrappableModel;
                        //
                        if (returnModel is WrappableFluentModel wrappableReturnModel)
                        {
                            returnModelClassName = wrappableReturnModel.InnerModel.ClassName;
                            string returnModelInterfaceName = wrappableReturnModel.JavaInterfaceName;
                            rxReturnType = $"Observable<{returnModelInterfaceName}>";
                            //
                            string ctrInvocationOfReturnModelClass = this.fluentMethodGroup
                                                                     .FluentMethodGroups
                                                                     .CtrToCreateModelFromExistingResource($"{wrappableReturnModel.JavaClassName}");
                            //
                            StringBuilder mapBuilder = new StringBuilder();
                            mapBuilder.AppendLine($"    .map(new Func1<{returnModelClassName}, {returnModelInterfaceName}>() {{");
                            mapBuilder.AppendLine($"        @Override");
                            mapBuilder.AppendLine($"        public {returnModelInterfaceName} call({returnModelClassName} inner) {{");
                            mapBuilder.AppendLine($"            return{ctrInvocationOfReturnModelClass}");
                            mapBuilder.AppendLine($"        }}");
                            mapBuilder.AppendLine($"    }});");
                            //
                            mapForWrappableModel = mapBuilder.ToString();
                        }
                        else if (returnModel is NonWrappableModel nonWrappableReturnModel)
                        {
                            returnModelClassName = nonWrappableReturnModel.RawModelName;
                            rxReturnType         = $"Observable<{returnModelClassName}>";
                            mapForWrappableModel = null;
                        }
                        else
                        {
                            throw new NotImplementedException();
                        }
                        //
                        methodsBuilder.AppendLine("@Override");
                        methodsBuilder.AppendLine($"public {rxReturnType} {otherMethod.Name}Async({otherMethod.InnerMethodRequiredParameterDeclaration}) {{");
                        methodsBuilder.AppendLine($"    {innerClientName} client = this.inner();");
                        methodsBuilder.AppendLine($"    return client.{otherMethod.Name}Async({otherMethod.InnerMethodInvocationParameters})");
                        if (otherMethod.InnerMethod.SimulateAsPagingOperation)
                        {
                            methodsBuilder.AppendLine($"    .flatMap(new Func1<Page<{returnModelClassName}>, Observable<{returnModelClassName}>>() {{");
                            methodsBuilder.AppendLine($"        @Override");
                            methodsBuilder.AppendLine($"        public Observable<{returnModelClassName}> call(Page<{returnModelClassName}> innerPage) {{");
                            methodsBuilder.AppendLine($"            return Observable.from(innerPage.items());");
                            methodsBuilder.AppendLine($"        }}");
                            methodsBuilder.AppendLine($"    }})");
                        }
                        else if (otherMethod.InnerMethod.ReturnTypeResponseName.StartsWith("List<"))
                        {
                            methodsBuilder.AppendLine($"    .flatMap(new Func1<List<{returnModelClassName}>, Observable<{returnModelClassName}>>() {{");
                            methodsBuilder.AppendLine($"        @Override");
                            methodsBuilder.AppendLine($"        public Observable<{returnModelClassName}> call(List<{returnModelClassName}> innerList) {{");
                            methodsBuilder.AppendLine($"            return Observable.from(innerList);");
                            methodsBuilder.AppendLine($"        }}");
                            methodsBuilder.Append($"    }})");
                        }
                        //
                        if (mapForWrappableModel != null)
                        {
                            methodsBuilder.AppendLine();
                            methodsBuilder.AppendLine(mapForWrappableModel);
                        }
                        else
                        {
                            methodsBuilder.Append($";");
                        }
                        methodsBuilder.AppendLine($"}}");
                    }
                    else
                    {
                        string rxReturnType;
                        string returnModelClassName;
                        string mapForWrappableModel;
                        if (returnModel is WrappableFluentModel wrappableReturnModel)
                        {
                            returnModelClassName = wrappableReturnModel.InnerModel.ClassName;
                            string returnModelInterfaceName = wrappableReturnModel.JavaInterfaceName;
                            rxReturnType = $"Observable<{returnModelInterfaceName}>";

                            //
                            string ctrInvocationOfReturnModelClass = this.fluentMethodGroup
                                                                     .FluentMethodGroups
                                                                     .CtrToCreateModelFromExistingResource($"{wrappableReturnModel.JavaClassName}");
                            //
                            StringBuilder mapBuilder = new StringBuilder();
                            mapBuilder.AppendLine($"    .map(new Func1<{returnModelClassName}, {returnModelInterfaceName}>() {{");
                            mapBuilder.AppendLine($"        @Override");
                            mapBuilder.AppendLine($"        public {returnModelInterfaceName} call({returnModelClassName} inner) {{");
                            mapBuilder.AppendLine($"            return{ctrInvocationOfReturnModelClass}");
                            mapBuilder.AppendLine($"        }}");
                            mapBuilder.AppendLine($"    }});");
                            //
                            mapForWrappableModel = mapBuilder.ToString();
                        }
                        else if (returnModel is NonWrappableModel nonWrappableReturnModel)
                        {
                            returnModelClassName = nonWrappableReturnModel.RawModel.ClassName;
                            rxReturnType         = $"Observable<{returnModelClassName}>";
                            mapForWrappableModel = null;
                        }
                        else
                        {
                            throw new NotImplementedException();
                        }
                        //

                        methodsBuilder.AppendLine($"@Override");
                        methodsBuilder.AppendLine($"public {rxReturnType} {otherMethod.Name}Async({otherMethod.InnerMethodRequiredParameterDeclaration}) {{");
                        methodsBuilder.AppendLine($"    {innerClientName} client = this.inner();");
                        methodsBuilder.AppendLine($"    return client.{otherMethod.Name}Async({otherMethod.InnerMethodInvocationParameters})");
                        methodsBuilder.AppendLine($"    .flatMapIterable(new Func1<Page<{returnModelClassName}>, Iterable<{returnModelClassName}>>() {{");
                        methodsBuilder.AppendLine($"        @Override");
                        methodsBuilder.AppendLine($"        public Iterable<{returnModelClassName}> call(Page<{returnModelClassName}> page) {{");
                        methodsBuilder.AppendLine($"            return page.items();");
                        methodsBuilder.AppendLine($"        }}");
                        methodsBuilder.Append($"    }})");
                        //
                        if (mapForWrappableModel != null)
                        {
                            methodsBuilder.AppendLine();
                            methodsBuilder.AppendLine(mapForWrappableModel);
                        }
                        else
                        {
                            methodsBuilder.AppendLine($";");
                        }
                        methodsBuilder.AppendLine($"}}");
                    }
                }
                yield return(methodsBuilder.ToString());
            }
        }
예제 #4
0
        private IEnumerable <string> FilteredMethodDecls(StandardMethodsInfo standardMethodsInfo)
        {
            IEnumerable <OtherMethod> otherMethods = this
                                                     .Where(o => !standardMethodsInfo.IsStandardInnerMethod(o.InnerMethod) &&
                                                            !standardMethodsInfo.IsConfictWithStandardFluentMethod(o.InnerMethod));
            //
            StringBuilder methodsBuilder = new StringBuilder();

            foreach (OtherMethod otherMethod in otherMethods)
            {
                MethodJvaf innerMethod = otherMethod.InnerMethod;
                string     methodName  = $"{innerMethod.Name.Value}Async";
                //
                string rxReturnType;
                if (otherMethod.ReturnModel is WrappableFluentModel wrappableFluentModel)
                {
                    rxReturnType = $"Observable<{wrappableFluentModel.JavaInterfaceName}>";
                }
                else if (otherMethod.ReturnModel is NonWrappableModel nonWrappableModel)
                {
                    rxReturnType = $"Observable<{nonWrappableModel.RawModelName}>";
                }
                else
                {
                    // otherMethod.ReturnModel is PrimitiveModel
                    rxReturnType = "Completable";
                }
                //
                methodsBuilder.Clear();
                //
                methodsBuilder.AppendLine($"/**");
                if (!string.IsNullOrEmpty(innerMethod.Summary))
                {
                    methodsBuilder.AppendLine($" * {innerMethod.Summary.EscapeXmlComment().Period()}");
                }
                if (!string.IsNullOrEmpty(innerMethod.Description))
                {
                    methodsBuilder.AppendLine($" * {innerMethod.Description.EscapeXmlComment().Period()}");
                }
                methodsBuilder.AppendLine($" *");
                foreach (var param in innerMethod.LocalParameters.Where(p => !p.IsConstant && p.IsRequired))
                {
                    methodsBuilder.AppendLine($" * @param {param.Name} {param.Documentation.Else("the " + param.ModelType.Name + " value").EscapeXmlComment().Trim()}");
                }
                methodsBuilder.AppendLine($" * @throws IllegalArgumentException thrown if parameters fail the validation");
                methodsBuilder.AppendLine($" * @return the observable for the request");
                methodsBuilder.AppendLine($" */");
                if (innerMethod.HttpMethod == AutoRest.Core.Model.HttpMethod.Delete)
                {
                    methodsBuilder.AppendLine($"{rxReturnType} {methodName}({innerMethod.MethodRequiredParameterDeclaration});");
                }
                else if (otherMethod.ReturnModel is PrimitiveModel)
                {
                    methodsBuilder.AppendLine($"{rxReturnType} {methodName}({innerMethod.MethodRequiredParameterDeclaration});");
                }
                else
                {
                    methodsBuilder.AppendLine($"{rxReturnType} {methodName}({innerMethod.MethodRequiredParameterDeclaration});");
                }
                //
                yield return(methodsBuilder.ToString());
            }
        }
        public static StandardMethodsInfo StandardMethodsInfo(this ISegmentFluentMethodGroup fluentMethodGroup)
        {
            StandardMethodsInfo standardMethods = new StandardMethodsInfo();
            //
            HashSet <string> knownMethodNames = new HashSet <string>();

            if (fluentMethodGroup.ResourceCreateDescription.SupportsCreating)
            {
                standardMethods.InnerMethodNames.Add(fluentMethodGroup.ResourceCreateDescription.CreateMethod.Name.ToLowerInvariant());
            }

            if (fluentMethodGroup.ResourceUpdateDescription.SupportsUpdating)
            {
                standardMethods.InnerMethodNames.Add(fluentMethodGroup.ResourceUpdateDescription.UpdateMethod.Name.ToLowerInvariant());
                //
                StandardFluentMethod updateMethod = fluentMethodGroup.ResourceUpdateDescription.UpdateMethod;
                if (updateMethod.InnerMethod.HttpMethod == HttpMethod.Put)
                {
                    // If PUT based update is supported then skip any PATCH based update method
                    // being treated as "Other methods".
                    //
                    var patchUpdateMethod = fluentMethodGroup.InnerMethods
                                            .Where(m => m.HttpMethod == HttpMethod.Patch)
                                            .Where(m => m.Url.EqualsIgnoreCase(updateMethod.InnerMethod.Url))
                                            .FirstOrDefault();
                    if (patchUpdateMethod != null)
                    {
                        standardMethods.InnerMethodNames.Add(patchUpdateMethod.Name.ToLowerInvariant());
                    }
                }
            }

            if (fluentMethodGroup.ResourceListingDescription.SupportsListByImmediateParent)
            {
                standardMethods.InnerMethodNames.Add(fluentMethodGroup.ResourceListingDescription.ListByImmediateParentMethod.Name.ToLowerInvariant());
            }

            if (fluentMethodGroup.ResourceListingDescription.SupportsListByResourceGroup)
            {
                standardMethods.InnerMethodNames.Add(fluentMethodGroup.ResourceListingDescription.ListByResourceGroupMethod.Name.ToLowerInvariant());
                standardMethods.FluentMethodNames.Add("listByResourceGroup".ToLowerInvariant());
            }

            if (fluentMethodGroup.ResourceListingDescription.SupportsListBySubscription)
            {
                standardMethods.InnerMethodNames.Add(fluentMethodGroup.ResourceListingDescription.ListBySubscriptionMethod.Name.ToLowerInvariant());
                standardMethods.FluentMethodNames.Add("list".ToLowerInvariant());
            }

            if (fluentMethodGroup.ResourceGetDescription.SupportsGetByImmediateParent)
            {
                standardMethods.InnerMethodNames.Add(fluentMethodGroup.ResourceGetDescription.GetByImmediateParentMethod.Name.ToLowerInvariant());
            }

            if (fluentMethodGroup.ResourceGetDescription.SupportsGetByResourceGroup)
            {
                standardMethods.InnerMethodNames.Add(fluentMethodGroup.ResourceGetDescription.GetByResourceGroupMethod.Name.ToLowerInvariant());
                standardMethods.FluentMethodNames.Add("getByResourceGroup".ToLowerInvariant());
            }

            if (fluentMethodGroup.ResourceDeleteDescription.SupportsDeleteByImmediateParent)
            {
                standardMethods.InnerMethodNames.Add(fluentMethodGroup.ResourceDeleteDescription.DeleteByImmediateParentMethod.Name.ToLowerInvariant());
            }

            if (fluentMethodGroup.ResourceDeleteDescription.SupportsDeleteByResourceGroup)
            {
                standardMethods.InnerMethodNames.Add(fluentMethodGroup.ResourceDeleteDescription.DeleteByResourceGroupMethod.Name.ToLowerInvariant());
                standardMethods.FluentMethodNames.Add("deleteByResourceGroup".ToLowerInvariant());
                standardMethods.FluentMethodNames.Add("deleteByIds".ToLowerInvariant());
            }
            //
            return(standardMethods);
        }