Example #1
0
        public CoordinationEntryPath(IEnumerable <string> segments)
        {
            if (segments == null)
            {
                throw new ArgumentNullException(nameof(segments));
            }

            var segmentsBuilder = ImmutableList.CreateBuilder <CoordinationEntryPathSegment>();

            foreach (var segment in segments)
            {
                if (segment == null)
                {
                    throw new ArgumentException("The collection must not contain default entries.", nameof(segments));
                }

                CoordinationEntryPathSegment segmentX;

                try
                {
                    segmentX = new CoordinationEntryPathSegment(segment.AsMemory());
                }
                catch (ArgumentException exc)
                {
                    throw new ArgumentException("The collection must not contain emtpy entries or entries that contain whitespace only.", nameof(segments), exc);
                }

                segmentsBuilder.Add(segmentX);
            }

            _segments = segmentsBuilder.ToImmutable();
        }
Example #2
0
        public CoordinationEntryPath(CoordinationEntryPathSegment segment)
        {
            if (segment == default)
            {
                throw new ArgumentDefaultException(nameof(segment));
            }

            _segments = ImmutableList <CoordinationEntryPathSegment> .Empty.Add(segment);
        }
        public IStoredEntry RemoveChild(IStoredEntry storedEntry, CoordinationEntryPathSegment child, Session session)
        {
            if (storedEntry == null)
            {
                throw new ArgumentNullException(nameof(storedEntry));
            }

            if (child == default)
            {
                throw new ArgumentDefaultException(nameof(child));
            }

            if (session == null)
            {
                throw new ArgumentNullException(nameof(session));
            }

            if (storedEntry.ReadLocks.Length != 0 && (storedEntry.ReadLocks.Length > 1 || storedEntry.ReadLocks.First() != session))
            {
                throw new InvalidOperationException();
            }

            if (storedEntry.WriteLock == null)
            {
                throw new InvalidOperationException();
            }

            if (!storedEntry.Children.Contains(child))
            {
                return(storedEntry);
            }

            return(new StoredEntry(storedEntry.Path,
                                   storedEntry.Value,
                                   storedEntry.ReadLocks,
                                   storedEntry.WriteLock,
                                   storedEntry.Children.Remove(child),
                                   storedEntry.Version,
                                   storedEntry.StorageVersion + 1,
                                   storedEntry.EphemeralOwner,
                                   storedEntry.CreationTime,
                                   storedEntry.LastWriteTime));
        }
Example #4
0
        public static CoordinationEntryPath FromEscapedPath(ReadOnlyMemory <char> path)
        {
            var span         = path.Span;
            var segmentStart = 0;
            var segments     = new List <CoordinationEntryPathSegment>();

            void ProcessSegment(int exclusiveEnd)
            {
                var slice = path.Slice(segmentStart, exclusiveEnd: exclusiveEnd);

                if (!slice.Span.IsEmptyOrWhiteSpace())
                {
                    var segment = CoordinationEntryPathSegment.FromEscapedSegment(slice);
                    Assert(segment != default);
                    segments.Add(segment);
                }
            }

            for (var i = 0; i < path.Length; i++)
            {
                switch (span[i])
                {
                case PathDelimiter:
                case AltPathDelimiter:

                    ProcessSegment(i);
                    segmentStart = i + 1;
                    break;
                }
            }

            ProcessSegment(path.Length);

            if (!segments.Any())
            {
                return(default);