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; }
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); }
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; }
/// <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() }); } }
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; }
/// <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(); }
public ModelLocalProperties(IEnumerable <Property> innerProperties, FluentMethodGroups methodGroups, bool wrapReturnInner) { this.innerProperties = innerProperties; this.methodGroups = methodGroups; this.wrapReturnInner = wrapReturnInner; }
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); }
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); }