/// <summary> /// Creates an ETP URI segment from the specified object string. /// </summary> /// <param name="object">The object string.</param> /// <param name="defaultFamily">The default family if the object does not specify it.</param> /// <param name="defaultVersion">The default family version if the object string does not specify it.</param> /// <returns></returns> private static Segment CreateSegment(string @object, string defaultFamily, string defaultVersion) { var match = Definition.EtpObjectOrFolderRegex.Match(@object); var objectType = GetFirstMatch(match, Definition.ObjectTypeGroup); var objectId = GetFirstMatch(match, Definition.ObjectIdGroup); if (objectId != null) { objectId = WebUtility.UrlDecode(objectId); } var objectVersion = GetFirstMatch(match, Definition.ObjectVersionGroup); CorrectCommonObjectFamilyAndVersion(objectType, ref defaultFamily, ref defaultVersion); var family = GetFirstMatch(match, Definition.FamilyGroup) ?? defaultFamily; family = EtpDataObjectType.TryGetFamily(family); var shortVersion = GetFirstMatch(match, Definition.ShortVersionGroup); var version = EtpDataObjectType.TryGetFamilyVersionFromShortVersion(family, shortVersion) ?? defaultVersion; objectType = EtpContentType.FormatObjectType(objectType, version); return(new Segment(family, version, objectType, objectId, objectVersion?.Replace("''", "'"))); }
/// <summary> /// Initializes a new instance of the <see cref="EtpUri"/> struct. /// </summary> /// <param name="uri">The URI string.</param> public EtpUri(string uri) { var uriMatch = Definition.EtpUriRegex.Match(uri); _parent = null; Uri = uri; IsValid = uriMatch.Success; if (!IsValid) { return; } if (WasGroupMatched(uriMatch, Definition.Etp11UriGroup)) { EtpVersion = EtpVersion.v11; } else { EtpVersion = EtpVersion.v12; } Query = GetFirstMatch(uriMatch, Definition.QueryGroup) ?? string.Empty; Hash = GetFirstMatch(uriMatch, Definition.HashGroup) ?? string.Empty; Dataspace = GetFirstMatch(uriMatch, Definition.DataspaceGroup) ?? string.Empty; var family = GetFirstMatch(uriMatch, Definition.FamilyGroup); NamespaceFamily = EtpDataObjectType.TryGetFamily(family); var shortVersion = GetFirstMatch(uriMatch, Definition.ShortVersionGroup); NamespaceVersion = EtpDataObjectType.TryGetFamilyVersionFromShortVersion(family, shortVersion); _objectSegments = GetAllMatches(uriMatch, Definition.ObjectOrFolderGroup); if (_objectSegments != null) { var segment = CreateSegment(_objectSegments[_objectSegments.Length - 1], NamespaceFamily, NamespaceVersion); Family = segment.Family; Version = segment.Version; ObjectType = segment.ObjectType; ObjectId = segment.ObjectId; ObjectVersion = segment.ObjectVersion; } else { Family = NamespaceFamily; Version = NamespaceVersion; } DataObjectType = new EtpDataObjectType(Family, Version, ObjectType); Format = GetQueryStringFormat(Query, Formats.Xml); ContentType = new EtpContentType(Family, Version, ObjectType, Format); IsRootUri = WasGroupMatched(uriMatch, Definition.RootUriGroup); IsFamilyVersionUri = WasGroupMatched(uriMatch, Definition.FamilyVersionUriGroup); IsDataspaceUri = IsRootUri /* Default Dataspace */ || WasGroupMatched(uriMatch, Definition.DataspaceUriGroup); IsDataRootUri = (IsEtp11 && IsFamilyVersionUri) || (IsEtp12 && IsDataspaceUri); IsBaseUri = IsRootUri || IsDataspaceUri || IsFamilyVersionUri; IsQueryUri = WasGroupMatched(uriMatch, Definition.QueryUriGroup); IsObjectUri = WasGroupMatched(uriMatch, Definition.ObjectUriGroup); IsFolderUri = WasGroupMatched(uriMatch, Definition.FolderUriGroup); IsHierarchicalUri = WasGroupMatched(uriMatch, Definition.HierarchicalUriGroup) || WasGroupMatched(uriMatch, Definition.TemplateUriGroup); HasEmptyObjectId = WasGroupMatched(uriMatch, Definition.EmptyIdGroup); var canonical = WasGroupMatched(uriMatch, Definition.CanonicalUriGroup) || (IsObjectUri && NamespaceVersion.StartsWith("1")); // Special case for 1.x URIs. if (WasGroupMatched(uriMatch, Definition.DataspaceGroup) && string.IsNullOrEmpty(Dataspace)) // Disallow eml:///dataspace() { canonical = false; } if (HasEmptyObjectId || WasGroupMatched(uriMatch, Definition.EmptyVersionGroup)) // Disallow empty object IDs or empty object versions { canonical = false; } IsCanonicalUri = canonical; IsAlternateUri = !IsCanonicalUri; // Allow for special cases. IsHierarchicalUri = WasGroupMatched(uriMatch, Definition.HierarchicalUriGroup); IsFolderTemplateUri = WasGroupMatched(uriMatch, Definition.FolderUriGroup) || WasGroupMatched(uriMatch, Definition.FolderTemplateUriGroup); IsObjectTemplateUri = WasGroupMatched(uriMatch, Definition.ObjectTemplateUriGroup); IsTemplateUri = IsFolderTemplateUri || IsObjectTemplateUri; if (IsBaseUri) { UriBase = UriWithoutSuffix; } else { UriBase = GetFirstMatch(uriMatch, Definition.BaseGroup) + "/"; } }