示例#1
0
        public void RelationSerializerTests_FromXml_Works()
        {
            //Arrange
            var sourceId      = new HiveId(Guid.NewGuid());
            var destinationId = new HiveId(Guid.NewGuid());
            var relationType  = new RelationType("TestRelationType");
            var xml           = string.Format(
                @"<relation type=""{0}"" sourceId=""{1}"" destinationId=""{2}"" ordinal=""0"">
                    <metaDatum key=""test1"" value=""value1"" />
                    <metaDatum key=""test2"" value=""value2"" />
                 </relation>",
                relationType.RelationName,
                sourceId.ToString(HiveIdFormatStyle.AsUri),
                destinationId.ToString(HiveIdFormatStyle.AsUri));

            //Act
            var relation = RelationSerializer.FromXml(xml);

            //Assert
            Assert.IsTrue(relation != null);
            Assert.IsTrue(relation.Type.RelationName == relationType.RelationName);
            Assert.IsTrue(relation.SourceId.ToString(HiveIdFormatStyle.AsUri) == sourceId.ToString(HiveIdFormatStyle.AsUri));
            Assert.IsTrue(relation.DestinationId.ToString(HiveIdFormatStyle.AsUri) == destinationId.ToString(HiveIdFormatStyle.AsUri));
            Assert.IsTrue(relation.Ordinal == 0);
            Assert.IsTrue(relation.MetaData.Count == 2);
            Assert.IsTrue(relation.MetaData.Single(x => x.Key == "test1").Value == "value1");
            Assert.IsTrue(relation.MetaData.Single(x => x.Key == "test2").Value == "value2");
        }
示例#2
0
        public void RelationSerializerTests_ToXml_Works()
        {
            //Arrange
            var source       = new StubRelatableEntity(new HiveId(Guid.NewGuid()));
            var destination  = new StubRelatableEntity(new HiveId(Guid.NewGuid()));
            var relationType = new RelationType("TestRelationType");
            var relation     = new Relation(relationType, source, destination, new [] {
                new RelationMetaDatum("test1", "value1"),
                new RelationMetaDatum("test2", "value2")
            });

            //Act
            var xml = RelationSerializer.ToXml(relation);

            //Assert
            Assert.IsTrue(xml.Root.Name == "relation");
            Assert.IsTrue(xml.Root.Attribute("type").Value == relationType.RelationName);
            Assert.IsTrue(xml.Root.Attribute("sourceId").Value == source.Id.ToString(HiveIdFormatStyle.AsUri));
            Assert.IsTrue(xml.Root.Attribute("destinationId").Value == destination.Id.ToString(HiveIdFormatStyle.AsUri));
            Assert.IsTrue(xml.Root.Attribute("ordinal").Value == "0");
            Assert.IsTrue(xml.Root.HasElements);
            Assert.IsTrue(xml.Root.Elements("metaDatum").Count() == 2);
            Assert.IsTrue(xml.Root.Elements("metaDatum").Single(x => x.Attribute("key").Value == "test1").Attribute("value").Value == "value1");
            Assert.IsTrue(xml.Root.Elements("metaDatum").Single(x => x.Attribute("key").Value == "test2").Attribute("value").Value == "value2");
        }
示例#3
0
        protected override void PerformAddRelation(IReadonlyRelation <IRelatableEntity, IRelatableEntity> relation)
        {
            // Write relations to disc
            // TODO: Update to perform in the same manner as the NH provider i.e. in the base class by hooking AddOrUpdate
            if (relation.Type.RelationName != FixedRelationTypes.DefaultRelationType.RelationName)
            {
                EnsureRelationsFolderExists();

                var sourceMd5            = relation.SourceId.Value.ToString().ToMd5();
                var destMd5              = relation.DestinationId.Value.ToString().ToMd5();
                var relationPath         = Path.Combine(Settings.RelationsStoragePath, sourceMd5 + "-" + destMd5 + ".xml");
                var relationFileInfo     = new FileInfo(relationPath);
                var relationContent      = RelationSerializer.ToXml(relation);
                var relationContentBytes = Encoding.UTF8.GetBytes(relationContent.ToString());

                if (relationFileInfo.Exists)
                {
                    relationFileInfo.Delete();
                }

                using (
                    var writer = relationFileInfo.Open(FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.Read))
                {
                    writer.Write(relationContentBytes, 0, relationContentBytes.Length);
                }
            }
        }
示例#4
0
        internal IEnumerable <Relation> GetRelationsByPattern(string searchPattern)
        {
            var relations = new List <Relation>();

            if (Directory.Exists(Settings.RelationsStoragePath))
            {
                var relationFilePaths = System.IO.Directory.GetFiles(Settings.RelationsStoragePath, searchPattern + ".xml");
                foreach (var relationFilePath in relationFilePaths)
                {
                    var relationFileInfo    = new FileInfo(relationFilePath);
                    var relationFileContent = "";
                    using (var reader = relationFileInfo.OpenRead())
                    {
                        var relationFileBytes = new byte[reader.Length];
                        reader.Read(relationFileBytes, 0, (int)reader.Length);
                        relationFileContent = Encoding.UTF8.GetString(relationFileBytes);
                    }
                    var relationById = RelationSerializer.FromXml(relationFileContent);
                    // TODO: The source / destination of this relation might not be a file in the future but for the moment that's all this provider supports
                    var relation = new Relation(relationById.Type,
                                                this.Get <File>(relationById.SourceId),
                                                this.Get <File>(relationById.DestinationId),
                                                relationById.Ordinal,
                                                relationById.MetaData.ToArray());
                    relations.Add(relation);
                }
            }

            return(relations);
        }
示例#5
0
        private IEnumerable <Relation> GetRelationsByPattern(string searchPattern)
        {
            var relations = new List <Relation>();

            if (Directory.Exists(_relationsFolder))
            {
                var relationFilePaths = System.IO.Directory.GetFiles(_relationsFolder, searchPattern + ".xml");
                foreach (var relationFilePath in relationFilePaths)
                {
                    var relationFileInfo    = new FileInfo(relationFilePath);
                    var relationFileContent = "";
                    using (var reader = relationFileInfo.OpenRead())
                    {
                        var relationFileBytes = new byte[reader.Length];
                        reader.Read(relationFileBytes, 0, (int)reader.Length);
                        relationFileContent = Encoding.UTF8.GetString(relationFileBytes);
                    }
                    var relation = RelationSerializer.FromXml(relationFileContent);
                    relation.Source      = GetEntity <File>(relation.SourceId);      // TODO: Might not be a file?
                    relation.Destination = GetEntity <File>(relation.DestinationId); // TODO: Might not be a file?
                    relations.Add(relation);
                }
            }

            return(relations);
        }
示例#6
0
        public void AddOrUpdate(AbstractEntity persistedEntity)
        {
            Mandate.That <ArgumentException>(typeof(File).IsAssignableFrom(persistedEntity.GetType()));
            var file = (File)persistedEntity;

            Mandate.That <ArgumentNullException>(!file.Name.IsNullOrWhiteSpace() || !file.Location.IsNullOrWhiteSpace());

            // Make sure that the incoming location has the root storage area prefixed if necessary
            file.Location = EnsureLocationRooted(string.IsNullOrEmpty(file.Location) ? file.Name : file.Location);

            //ensure the file name is set which should always be based on the location
            file.Name = Path.GetFileName(file.Location);

            // Ensure we have an id for the file
            if (HiveIdExtensions.IsNullValueOrEmpty(file.Id))
            {
                file.Id = GenerateId(file.Location);
            }

            // Ensure that the folder exists, if this item is a folder)
            if (file.IsContainer)
            {
                var dir = new DirectoryInfo(file.Location);
                if (!dir.Exists)
                {
                    dir.Create();
                }
            }
            else
            {
                var containerPath = Path.GetDirectoryName(file.Location);
                if (containerPath != null)
                {
                    var dir = new DirectoryInfo(containerPath);
                    if (!dir.Exists)
                    {
                        dir.Create();
                    }
                }
            }

            // Write the file, provided it's not a directory
            if (!file.IsContainer)
            {
                var physicalForWriting = new FileInfo(file.Location);
                if (physicalForWriting.Exists)
                {
                    physicalForWriting.Delete();
                }
                using (var writer = physicalForWriting.Open(FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.Read))
                {
                    writer.Write(file.ContentBytes, 0, file.ContentBytes.Length);
                }
            }

            //var physicalFile = new FileInfo(file.Location);
            //if (physicalFile.Name != file.Name)
            //{
            //    physicalFile.MoveTo(Path.Combine(physicalFile.Directory.FullName, file.Name));
            //}

            // Write relations to disc
            foreach (var relation in file.Relations)
            {
                if (relation.Type.RelationName != FixedRelationTypes.FileRelationType.RelationName)
                {
                    EnsureRelationsFolderExists();

                    var sourceMd5            = relation.SourceId.ToString().ToMd5();
                    var destMd5              = relation.DestinationId.ToString().ToMd5();
                    var relationPath         = Path.Combine(_relationsFolder, sourceMd5 + "-" + destMd5 + ".xml");
                    var relationFileInfo     = new FileInfo(relationPath);
                    var relationContent      = RelationSerializer.ToXml(relation);
                    var relationContentBytes = Encoding.UTF8.GetBytes(relationContent.ToString());

                    if (relationFileInfo.Exists)
                    {
                        relationFileInfo.Delete();
                    }

                    using (
                        var writer = relationFileInfo.Open(FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.Read))
                    {
                        writer.Write(relationContentBytes, 0, relationContentBytes.Length);
                    }
                }
            }
        }