Пример #1
0
 public FluentMethodGroup(FluentMethodGroups fluentMethodGroups, string localName, List <string> parentMethodGroupNames)
 {
     if (fluentMethodGroups == null)
     {
         throw new ArgumentNullException(nameof(fluentMethodGroups));
     }
     this.FluentMethodGroups = fluentMethodGroups;
     //
     if (localName == null)
     {
         throw new ArgumentNullException(nameof(localName));
     }
     this.LocalNameInPascalCase = $"{localName.First().ToString().ToUpper()}{localName.Substring(1)}";
     //
     if (parentMethodGroupNames == null)
     {
         throw new ArgumentNullException(nameof(parentMethodGroupNames));
     }
     this.ParentMethodGroupNames = parentMethodGroupNames;
     //
     this.Level = this.ParentMethodGroupNames.Count(); // Level is zero indexed (level of this group in ARM URI)
     //
     this.innerMethods            = new List <MethodJvaf>();
     this.childFluentMethodGroups = new List <IFluentMethodGroup>();
     this.otherMethods            = null;
 }
Пример #2
0
 public FluentMethodGroup FindBestMatchingLevel0FluentMethodGroupOrCreateOne(FluentMethodGroups groups)
 {
     if (this.defaultLevel0FluentMethodGroup == null)
     {
         // First look for a level 0 "fluent method group" with name same as the "Inner Method Group" name.
         //
         this.defaultLevel0FluentMethodGroup = this.Where(group => group.Level == 0)
                                               .Where(group => this.InnerMethodGroupName.StartsWith(group.LocalNameInPascalCase, StringComparison.OrdinalIgnoreCase))
                                               .FirstOrDefault();
         //
         if (this.defaultLevel0FluentMethodGroup == null)
         {
             // If no such group then pick the first one in level 0 sorted by the name
             //
             this.defaultLevel0FluentMethodGroup = this.OrderBy(group => group.LocalNameInPascalCase).Where(group => group.Level == 0).FirstOrDefault();
             // if there no level 0 then create one
             //
             if (this.defaultLevel0FluentMethodGroup == null)
             {
                 this.defaultLevel0FluentMethodGroup = new FluentMethodGroup(fluentMethodGroups: groups,
                                                                             localName: this.InnerMethodGroupName,
                                                                             parentMethodGroupNames: new List <string>());
                 //
                 this.AddFluentMethodGroup(this.defaultLevel0FluentMethodGroup);
             }
         }
     }
     return(this.defaultLevel0FluentMethodGroup);
 }
Пример #3
0
 public FluentMethodGroup(FluentMethodGroups fluentMethodGroups)
 {
     this.FluentMethodGroups = fluentMethodGroups;
     this.Level = -1;
     this.ParentMethodGroupNames  = new List <String>();
     this.InnerMethods            = new List <MethodJvaf>();
     this.ChildFluentMethodGroups = new List <FluentMethodGroup>();
     this.otherMethods            = null;
 }
Пример #4
0
        /// <summary>
        /// Given an ARM operation endpoint url derive a fluent method group that the operation can possibly belongs to.
        /// </summary>
        /// <param name="fluentMethodGroups">the dict holding fluent method groups</param>
        /// <param name="urlParts">the ARM operation endpoint url parts</param>
        /// <param name="httpMethod">the http method associated with the ARM operation</param>
        /// <returns>The method group</returns>
        public static FluentMethodGroup ResolveFluentMethodGroup(FluentMethodGroups fluentMethodGroups, List <String> urlParts, HttpMethod httpMethod)
        {
            int           level = 0;
            List <String> fluentMethodGroupNamesInUrl = new List <String>();
            Pluralizer    pluralizer = new Pluralizer();

            foreach (String urlPart in urlParts)
            {
                if (!IsParameter(urlPart) && IsPlural(urlPart))
                {
                    fluentMethodGroupNamesInUrl.Add(urlPart);
                    level++;
                }
            }

            if (fluentMethodGroupNamesInUrl.Count() == 1)
            {
                return(new FluentMethodGroup(fluentMethodGroups)
                {
                    LocalNameInPascalCase = fluentMethodGroupNamesInUrl[0],
                    Level = 0,
                    ParentMethodGroupNames = new List <string>()
                });
            }
            else if (httpMethod == HttpMethod.Post)
            {
                if (!IsParameter(urlParts.Last()) && urlParts.Last().EqualsIgnoreCase(fluentMethodGroupNamesInUrl.Last()))
                {
                    return(new FluentMethodGroup(fluentMethodGroups)
                    {
                        LocalNameInPascalCase = fluentMethodGroupNamesInUrl.SkipLast(1).Last(),
                        Level = fluentMethodGroupNamesInUrl.Count() - 2,
                        ParentMethodGroupNames = fluentMethodGroupNamesInUrl.SkipLast(2).ToList()
                    });
                }
                else
                {
                    return(new FluentMethodGroup(fluentMethodGroups)
                    {
                        LocalNameInPascalCase = fluentMethodGroupNamesInUrl.Last(),
                        Level = fluentMethodGroupNamesInUrl.Count() - 1,
                        ParentMethodGroupNames = fluentMethodGroupNamesInUrl.SkipLast(1).ToList()
                    });
                }
            }
            else
            {
                return(new FluentMethodGroup(fluentMethodGroups)
                {
                    LocalNameInPascalCase = fluentMethodGroupNamesInUrl.Last(),
                    Level = fluentMethodGroupNamesInUrl.Count() - 1,
                    ParentMethodGroupNames = fluentMethodGroupNamesInUrl.SkipLast(1).ToList()
                });
            }
        }
Пример #5
0
 public FluentMethodGroup(FluentMethodGroups fluentMethodGroups, string localName)
 {
     if (fluentMethodGroups == null)
     {
         throw new ArgumentNullException(nameof(fluentMethodGroups));
     }
     this.FluentMethodGroups = fluentMethodGroups;
     //
     if (localName == null)
     {
         throw new ArgumentNullException(nameof(localName));
     }
     this.LocalNameInPascalCase = $"{localName.First().ToString().ToUpper()}{localName.Substring(1)}";
     //
     this.ParentMethodGroupNames = new List <string>();
     this.Level                   = -1;
     this.innerMethods            = new List <MethodJvaf>();
     this.childFluentMethodGroups = new List <IFluentMethodGroup>();
     this.otherMethods            = null;
 }
Пример #6
0
        /// <summary>
        /// Given an ARM operation endpoint url derive a fluent method group that the operation can possibly belongs to.
        /// </summary>
        /// <param name="fluentMethodGroups">the map holding all fluent method groups</param>
        /// <param name="innerMethod">inner Swagger method</param>
        /// <param name="segments">the ARM operation endpoint url segments (those appear after provider name)</param>
        /// <returns>The fluent method group</returns>
        public static FluentMethodGroup ResolveFluentMethodGroup(FluentMethodGroups fluentMethodGroups,
                                                                 MethodJvaf innerMethod,
                                                                 IEnumerable <Segment> segments,
                                                                 string defaultMethodGroupName)
        {
            List <String> fluentMethodGroupNamesInSegments = new List <String>();
            Pluralizer    pluralizer = new Pluralizer();
            HttpMethod    httpMethod = innerMethod.HttpMethod;

            segments
            .Where(segment => !(segment is PositionalSegment) && Utils.IsPlural(segment.Name, fluentMethodGroups.FluentConfig))
            .ForEach(segment =>
            {
                fluentMethodGroupNamesInSegments.Add(segment.Name);
            });
            //
            if (fluentMethodGroupNamesInSegments.Count() == 0)
            {
                // Level 0 "Fluent Method Group"
                return(new FluentMethodGroup(fluentMethodGroups: fluentMethodGroups,
                                             localName: defaultMethodGroupName,
                                             parentMethodGroupNames: new List <string>()));
            }
            if (fluentMethodGroupNamesInSegments.Count() == 1)
            {
                // Level 0 "Fluent Method Group"
                return(new FluentMethodGroup(fluentMethodGroups: fluentMethodGroups,
                                             localName: fluentMethodGroupNamesInSegments[0],
                                             parentMethodGroupNames: new List <string>()));
            }
            else if (httpMethod == HttpMethod.Post)
            {
                if (segments.Last() is TerminalSegment &&
                    segments.Last().Name.EqualsIgnoreCase(fluentMethodGroupNamesInSegments.Last()))
                {
                    //POST /providers/Microsoft.EventHub/namespaces/{nsname}/authorizationRules/{ruleName}/listKeys
                    //
                    return(new FluentMethodGroup(fluentMethodGroups: fluentMethodGroups,
                                                 localName: fluentMethodGroupNamesInSegments.SkipLast(1).Last(),
                                                 parentMethodGroupNames: fluentMethodGroupNamesInSegments.SkipLast(2).ToList()));
                }
                else
                {
                    return(new FluentMethodGroup(fluentMethodGroups: fluentMethodGroups,
                                                 localName: fluentMethodGroupNamesInSegments.Last(),
                                                 parentMethodGroupNames: fluentMethodGroupNamesInSegments.SkipLast(1).ToList()));
                }
            }
            else
            {
                IModelTypeJv retType = innerMethod.ReturnTypeJva.BodyClientType;
                if ((httpMethod == HttpMethod.Get || httpMethod == HttpMethod.Put) &&
                    (retType is PrimaryType || (retType as SequenceType)?.ElementType is PrimaryType))
                {
                    return(new FluentMethodGroup(fluentMethodGroups: fluentMethodGroups,
                                                 localName: fluentMethodGroupNamesInSegments.SkipLast(1).Last(),
                                                 parentMethodGroupNames: fluentMethodGroupNamesInSegments.SkipLast(2).ToList()));
                }
                else
                {
                    return(new FluentMethodGroup(fluentMethodGroups: fluentMethodGroups,
                                                 localName: fluentMethodGroupNamesInSegments.Last(),
                                                 parentMethodGroupNames: fluentMethodGroupNamesInSegments.SkipLast(1).ToList()));
                }
            }
        }
 public ReadOnlyFluentModelInterface(WrappableFluentModel fluentModel, FluentMethodGroups fluentMethodGroups, string managerTypeName)
 {
     this.fluentModel        = fluentModel;
     this.fluentMethodGroups = fluentMethodGroups;
     this.ManagerTypeName    = managerTypeName;
 }
 public ServiceManagerModel(CodeModelJvaf codeModel, FluentMethodGroups fluentMethodGroups)
 {
     this.codeModel          = codeModel;
     this.fluentMethodGroups = fluentMethodGroups;
     this.ns = Settings.Instance.Namespace.ToLower();
 }
Пример #9
0
 public ModelLocalProperties(IEnumerable <Property> innerProperties, FluentMethodGroups methodGroups, bool wrapReturnInner)
 {
     this.innerProperties = innerProperties;
     this.methodGroups    = methodGroups;
     this.wrapReturnInner = wrapReturnInner;
 }
Пример #10
0
        public static FluentMethodGroups InnerMethodGroupToFluentMethodGroups(CodeModelJvaf codeModel)
        {
            FluentMethodGroups innerMethodGroupToFluentMethodGroups = new FluentMethodGroups(codeModel);

            foreach (MethodGroupJvaf innerMethodGroup in codeModel.AllOperations)
            {
                List <FluentMethodGroup> fluentMGroupsInCurrentInnerMGroup = new List <FluentMethodGroup>();
                innerMethodGroupToFluentMethodGroups.Add(innerMethodGroup.Name, fluentMGroupsInCurrentInnerMGroup);

                foreach (MethodJvaf innerMethod in innerMethodGroup.Methods)
                {
                    var uri = new ARMUri(innerMethod);

                    if (String.IsNullOrEmpty(innerMethod.FluentUrl()))
                    {
                        // Skip empty Url e.g. listNextPage
                        //
                        continue;
                    }
                    else if (innerMethod.Name.ToLowerInvariant().StartsWith("begin"))
                    {
                        // Skip LRO begin methods
                        //
                        continue;
                    }
                    else
                    {
                        List <String> urlParts = GetPartsAfterProvider(innerMethod.FluentUrl());
                        if (urlParts.Any())
                        {
                            string providerNamespace = urlParts[0];
                            // skip provider namespace.
                            urlParts = urlParts.Skip(1).ToList();

                            FluentMethodGroup fluentMGroup = null;
                            if (urlParts.Count() == 1)
                            {
                                string possibleFMGName = urlParts[0];
                                //
                                fluentMGroup = new FluentMethodGroup(innerMethodGroupToFluentMethodGroups)
                                {
                                    LocalNameInPascalCase = $"{DeferFMGResolution}{possibleFMGName}"
                                };
                            }
                            else
                            {
                                fluentMGroup = FluentMethodGroup.ResolveFluentMethodGroup(innerMethodGroupToFluentMethodGroups, urlParts, innerMethod.HttpMethod);
                            }

                            Debug.Assert(fluentMGroup != null);
                            // Checks whether we already derived a method group with same name in the current "Operation group" (inner method group)
                            //
                            FluentMethodGroup matchedFluentMethodGroup = fluentMGroupsInCurrentInnerMGroup.FirstOrDefault(fmg => fmg.LocalNameInPascalCase.EqualsIgnoreCase(fluentMGroup.LocalNameInPascalCase));

                            if (matchedFluentMethodGroup != null)
                            {
                                matchedFluentMethodGroup.InnerMethods.Add(innerMethod);
                            }
                            else
                            {
                                fluentMGroup.InnerMethods.Add(innerMethod);
                                fluentMGroup.InnerMethodGroup = innerMethodGroup;
                                fluentMGroupsInCurrentInnerMGroup.Add(fluentMGroup);
                            }
                        }
                    }
                }
            }
            innerMethodGroupToFluentMethodGroups.ResolveDeferedFluentMethodGroups(codeModel);
            innerMethodGroupToFluentMethodGroups.LinkFluentMethodGroups();
            innerMethodGroupToFluentMethodGroups.InjectPlaceHolderFluentMethodGroups();
            innerMethodGroupToFluentMethodGroups.EnsureUniqueJavaInterfaceNameForFluentMethodGroup();
            innerMethodGroupToFluentMethodGroups.DeriveStandardFluentModelForMethodGroups();
            innerMethodGroupToFluentMethodGroups.EnsureUniqueJvaModelInterfaceName();
            innerMethodGroupToFluentMethodGroups.SpecializeFluentModels();

            return(innerMethodGroupToFluentMethodGroups);
        }
Пример #11
0
        public static FluentMethodGroups InnerMethodGroupToFluentMethodGroups(CodeModelJvaf codeModel)
        {
            IEnumerable <MethodGroupJv> allInnerMethodGroups = codeModel.AllOperations;
            //
            FluentMethodGroups fluentMethodGroups = new FluentMethodGroups(codeModel);

            //
            foreach (MethodGroupJvaf currentInnerMethodGroup in allInnerMethodGroups)
            {
                FluentMethodGroupList fluentMethodGroupsInCurrentInnerMethodGroup = new FluentMethodGroupList(currentInnerMethodGroup);
                //
                fluentMethodGroups.Add(fluentMethodGroupsInCurrentInnerMethodGroup);
                //
                foreach (MethodJvaf innerMethod in currentInnerMethodGroup.Methods)
                {
                    if (innerMethod.Name.ToLowerInvariant().StartsWith("begin", StringComparison.OrdinalIgnoreCase))
                    {
                        // Skip LRO begin methods
                        continue;
                    }
                    else
                    {
                        ARMUri armUri = new ARMUri(innerMethod);
                        // Skip below two methods
                        //    1. uri can be empty for method such as 'listNext'
                        //    2. uri can be just 'nextLink' for method to retrieve next page
                        if (!armUri.IsNullOrEmpty() && !(armUri.Count == 1 && armUri.First().Name.EqualsIgnoreCase("nextLink")))
                        {
                            IEnumerable <Segment> segments = armUri.SegmentsAfterProvider;
                            segments = segments.Any() ? segments : armUri;
                            //
                            if (segments.Any())
                            {
                                FluentMethodGroup fluentMethodGroup = null;
                                if (segments.Count() == 1 && (segments.First() is TerminalSegment))
                                {
                                    // e.g. providers/Microsoft.Network/networkInterfaces
                                    // e.g. providers/Microsoft.Network/checkNameAvailability
                                    //
                                    string name = segments.First().Name;
                                    fluentMethodGroup = new FluentMethodGroup(fluentMethodGroups: fluentMethodGroups,
                                                                              localName: DeferredFluentMethodGroupNamePrefix.AddPrefix(name));
                                }
                                else
                                {
                                    string methodGroupDefaultName = Utils.TrimInnerSuffix(currentInnerMethodGroup.Name.ToString());
                                    fluentMethodGroup = FluentMethodGroup.ResolveFluentMethodGroup(fluentMethodGroups, innerMethod, segments, methodGroupDefaultName);
                                    fluentMethodGroup = fluentMethodGroup ?? throw new ArgumentNullException(nameof(fluentMethodGroup));
                                }
                                // Checks whether we already derived a method group with same name in the current "Inner Method Group"
                                //
                                FluentMethodGroup matchedFluentMethodGroup = fluentMethodGroupsInCurrentInnerMethodGroup.FindFluentMethodGroup(fluentMethodGroup.LocalNameInPascalCase);
                                if (matchedFluentMethodGroup != null)
                                {
                                    matchedFluentMethodGroup.AddInnerMethod(innerMethod);
                                }
                                else
                                {
                                    fluentMethodGroup.AddInnerMethod(innerMethod);
                                    fluentMethodGroupsInCurrentInnerMethodGroup.AddFluentMethodGroup(fluentMethodGroup);
                                }
                            }
                        }
                    }
                }
            }
            //
            fluentMethodGroups.ResolveDeferredFluentMethodGroups(codeModel);
            fluentMethodGroups.LinkFluentMethodGroups();
            fluentMethodGroups.InjectPlaceHolderFluentMethodGroups();
            fluentMethodGroups.DeriveStandardInnerModelForMethodGroups();
            fluentMethodGroups.PruneMethodGroups();
            fluentMethodGroups.Select(m => m.Value).SelectMany(fluentMethodGroupList => fluentMethodGroupList)
            .ForEach(fluentMethodGroup =>
            {
                fluentMethodGroup.JavaInterfaceName = fluentMethodGroup.LocalNameInPascalCase;
            });
            fluentMethodGroups.EnsureUniqueJvaModelInterfaceName();
            fluentMethodGroups.SpecializeFluentModels();
            //
            return(fluentMethodGroups);
        }