Esempio n. 1
0
        protected override void Execute(CodeActivityContext context)
        {
            IWorkflowContext workflowContext = context.GetExtension <IWorkflowContext>();
            ParameterStack   pstack          = context.GetValue <ParameterStack>(this.Parameter);

            var aclhash    = context.GetValue <string>(Aclhash);
            var outputname = context.GetValue <string>(OutputName);

            var workspace = pstack.GetValue <Workspace>(ActivityParameterStack.WORKSPACE);
            var fileinfo  = pstack.GetValue <FileSystemInfo>(ActivityParameterStack.WORKSPACE_FILEINFO);

            // Guard
            Ensure.That(workspace).IsNotNull();
            Ensure.That(fileinfo).IsNotNull();

            var entity = new FileMappingInfo
            {
                AclHash         = aclhash,
                Workspace       = workspace,
                Mimetype        = "image/png",          // 未実装(テスト実装)
                MappingFilePath = workspace.TrimWorekspacePath(fileinfo.FullName, false),
            };

            pstack.SetValue(outputname, entity);
        }
        /// <summary>
        /// [LLD-03-05-01:01-01-02]
        /// </summary>
        private void file_create_acl(AppDbContext dbc, FileUpdateQueueItem item, Workspace workspace)
        {
            // 1. 対象ファイルが存在するかチェック
            if (!item.Target.Exists)
            {
                throw new ApplicationException("対象ファイルが指定位置に存在しません。");
            }

            // 3. ACLファイルから、ACLハッシュを取得する
            var aclbin  = VfsLogicUtils.ReadACLFile(new FileInfo(item.Target.FullName));
            var aclhash = aclbin.FindKeyValue("ACLHASH");

            // 4. データベースを参照し、ACLハッシュとファイルマッピング情報(AclHash)を突き合わせる
            FileMappingInfo entity = null;

            var repo = new FileMappingInfoRepository(dbc);

            entity = repo.LoadByAclHash(aclhash);
            if (entity == null)
            {
                throw new ApplicationException();
            }
            if (entity.Workspace == null || entity.Workspace.Id != workspace.Id)
            {
                throw new ApplicationException();
            }


            // 5. ファイルマッピング情報を参照し、物理ファイルが存在するかチェックする
            var phyFileInfo = new FileInfo(Path.Combine(workspace.PhysicalSpacePath, entity.MappingFilePath));

            if (!phyFileInfo.Exists)
            {
                throw new ApplicationException();
            }

            // 6. 物理ファイルを、ACLファイルのパスに対応する物理空間のパスへ移動する
            //    移動先が、同じ場所となる場合は処理しない。
            var aclfileLocalPath_Update = workspace.TrimWorekspacePath(item.Target.FullName, false);
            var extFilePath             = Path.Combine(Path.GetDirectoryName(aclfileLocalPath_Update), Path.GetFileNameWithoutExtension(aclfileLocalPath_Update));
            var toFileInfo = new FileInfo(Path.Combine(workspace.PhysicalSpacePath, extFilePath));

            if (phyFileInfo.FullName != toFileInfo.FullName)
            {
                Directory.CreateDirectory(toFileInfo.Directory.FullName);
                File.Move(phyFileInfo.FullName, toFileInfo.FullName);

                // 7. ファイルマッピング情報をDBに書き込む(コンテキスト初期化)
                entity = repo.LoadByAclHash(aclhash);
                entity.MappingFilePath = extFilePath;                 // 新しいファイルマップパス
                dbc.SaveChanges();
            }
        }
Esempio n. 3
0
        private Artifact ReadByFileMappingInfo(FileMappingInfo fileMappingInfo, DbContext dbcontext)
        {
            var repo = new ArtifactRepository(dbcontext);

            return(repo.LoadByFileMappingInfo(fileMappingInfo));
        }
        /// <summary>
        /// [LLD-03-05-01:01-01-01]
        /// </summary>
        private void file_create_normal(AppDbContext dbc, FileUpdateQueueItem item, Workspace workspace)
        {
            // 1. 対象ファイルが存在するかチェック
            if (!item.Target.Exists)
            {
                throw new ApplicationException("対象ファイルが指定位置に存在しません。");
            }

            // 2. 対象ファイルを、物理空間に移動する(ディレクトリが無い場合は、ディレクトリも作成する)
            //    一時ファイル名を使用する。
            var aclfileLocalPath_Update = workspace.TrimWorekspacePath(item.Target.FullName, false);
            // 移動先のディレクトリがサブディレクトリを含む場合、
            // 存在しないサブディレクトリを作成します。
            var newFileInfo = new FileInfo(Path.Combine(workspace.PhysicalSpacePath, aclfileLocalPath_Update));

            Directory.CreateDirectory(newFileInfo.Directory.FullName);

            var fromFilePath = new FileInfo(Path.Combine(workspace.VirtualSpacePath, aclfileLocalPath_Update));
            var toFilePath   = new FileInfo(Path.Combine(workspace.PhysicalSpacePath, aclfileLocalPath_Update + ".tmp"));

            File.Move(fromFilePath.FullName, toFilePath.FullName);

            // 3. ACLファイルを仮想空間に作成する
            var aclfilepath = Path.Combine(workspace.VirtualSpacePath, aclfileLocalPath_Update) + ".aclgene";
            // ACLファイルの作成を行います。
            string aclhash = VfsLogicUtils.GenerateACLHash();
            var    data    = new AclFileStructure();

            data.Version    = AclFileStructure.CURRENT_VERSION;
            data.LastUpdate = DateTime.Now;
            data.Data       = new KeyValuePair <string, string>[] {
                new KeyValuePair <string, string>("ACLHASH", aclhash)
            };

            using (var file = File.Create(aclfilepath))
            {
                Serializer.Serialize(file, data);
            }

            // 4. ファイルマッピング情報を作成し、データベースに格納する
            var entity = new FileMappingInfo
            {
                AclHash         = aclhash,
                Workspace       = workspace,
                Mimetype        = "image/png",          // 未実装(テスト実装)
                MappingFilePath = aclfileLocalPath_Update,
                LostFileFlag    = false,
            };

            VfsLogicUtils.UpdateOrCreate(dbc, entity);
            dbc.SaveChanges();

            // 5. 一時ファイル名を、正しいファイル名にリネームする
            if (!File.Exists(toFilePath.FullName))
            {
                throw new ApplicationException(toFilePath.FullName + "が見つかりません");
            }
            var extFileName = Path.GetFileNameWithoutExtension(toFilePath.Name);

            toFilePath.MoveTo(Path.Combine(toFilePath.DirectoryName, extFileName));
        }
Esempio n. 5
0
 public Artifact LoadByFileMappingInfo(FileMappingInfo filemappinginfo)
 {
     return(_dbset.Where(prop => prop.FileMappingInfo.Id == filemappinginfo.Id).FirstOrDefault());
 }