Пример #1
0
        /// <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("''", "'")));
        }
Пример #2
0
        /// <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) + "/";
            }
        }