Ejemplo n.º 1
0
        public IContent Load(IFileMappingInfo fileMappingInfo)
        {
            var set = _dbset
                      .Include(prop => prop.Category)
                      .Include(prop => prop.FileMappingInfo);

            return(set.Where(x => x.FileMappingInfo.Id == fileMappingInfo.Id).FirstOrDefault());
        }
        /// <summary>
        ///
        /// </summary>
        /// <param name="item"></param>
        /// <param name="workspace"></param>
        public void file_create_acl(FileUpdateQueueItem item, IWorkspace 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)を突き合わせる
            IFileMappingInfo entity = mFileMappingInfoRepository.LoadByAclHash(aclhash);

            if (entity == null)
            {
                throw new ApplicationException();
            }
            if (entity.GetWorkspace() == null || entity.GetWorkspace().Id != workspace.Id)
            {
                throw new ApplicationException();
            }


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

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

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

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

                // 7. ファイルマッピング情報をDBに書き込む(コンテキスト初期化)
                entity = mFileMappingInfoRepository.LoadByAclHash(aclhash);
                entity.MappingFilePath = extFilePath; // 新しいファイルマップパス
            }

            mFileMappingInfoRepository.Save();
        }
        /// <summary>
        /// [LLD-03-05-01:01-03-01]
        /// </summary>
        /// <param name="item"></param>
        /// <param name="workspace"></param>
        public void file_rename_acl(FileSystemInfo item, IWorkspace workspace)
        {
            LOG.Trace("IN");
            // 1. 対象ファイルが存在するかチェック
            if (!item.Exists)
            {
                throw new ApplicationException("対象ファイルが指定位置に存在しません。");
            }

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

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

            if (entity == null)
            {
                throw new ApplicationException();
            }
            if (entity.GetWorkspace() == null || entity.GetWorkspace().Id != workspace.Id)
            {
                throw new ApplicationException();
            }

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

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

            // 6. 物理空間のファイルを、リネーム後のACLファイル名と同じ名前に変更する
            var aclfileLocalPath_Update = workspace.TrimWorekspacePath(item.FullName);
            var extFilePath             = Path.Combine(Path.GetDirectoryName(aclfileLocalPath_Update), Path.GetFileNameWithoutExtension(aclfileLocalPath_Update));
            var toFileInfo = new FileInfo(Path.Combine(workspace.PhysicalPath, extFilePath));

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

                // 7. ファイルマッピング情報をDBに書き込む(コンテキスト初期化)
                entity = mFileMappingInfoRepository.LoadByAclHash(aclhash);
                entity.MappingFilePath = extFilePath; // 新しいファイルマップパス
            }
            LOG.Trace("OUT");
        }
        /// <summary>
        /// ファイルマッピング情報から、コンテント情報の作成または更新を行う。
        /// </summary>
        /// <param name="fileMappingInfo">ファイルマッピング情報</param>
        private IContent UpdateContentFromFileMapping(IFileMappingInfo fileMappingInfo)
        {
            // FileMappingInfoがContentとの関連が存在する場合、
            // 新規のContentは作成できないので例外を投げる。
            if (fileMappingInfo.Id != 0L)
            {
                if (mContentRepository.Load(fileMappingInfo) != null)
                {
                    throw new ApplicationException("既にコンテント情報が作成済みのFileMappingInfoです。");
                }
            }

            //---
            //!+ パス文字列から、階層構造を持つカテゴリを取得/作成を行うロジック
            //---

            //処理内容
            //   ・パスに含まれるカテゴリすべてが永続化されること
            //   ・Contentが永続化されること

            // パス文字列を、トークン区切りでキュー配列に詰めるロジック
            string pathText = fileMappingInfo.MappingFilePath;

            // 下記のコードは、Akalibへユーティリティとして実装する(パスを区切ってQueueを作成するユーティリティ)
            // 有効なパス区切り文字は、下記のコードでチェックしてください。
            // LOG.Info("トークン文字列1: Token: {}", Path.AltDirectorySeparatorChar);
            // LOG.Info("トークン文字列2: Token: {}", Path.DirectorySeparatorChar);
            // LOG.Info("トークン文字列3: Token: {}", Path.PathSeparator);
            // LOG.Info("トークン文字列4: Token: {}", Path.VolumeSeparatorChar);
            //
            // Windows環境: Path.DirectorySeparatorChar
            // Unix環境: Path.AltDirectorySeparatorChar
            var pathSplitedList    = new Stack <string> (pathText.Split(Path.DirectorySeparatorChar, StringSplitOptions.None));
            var fileName           = pathSplitedList.Pop(); // 最後の要素は、必ずファイル名となる
            var directoryTreeNames = new Queue <string> (pathSplitedList.Reverse <string> ());
            var appcat             = GenerateHierarchyCategory(directoryTreeNames);
            var entity             = mContentRepository.New();

            entity.Name = fileName;
            entity.SetFileMappingInfo(fileMappingInfo);
            entity.SetCategory(appcat);

            return(entity);
            // --------------------
            // ここまで
            // --------------------
        }
Ejemplo n.º 5
0
        public IFileMappingInfo RegisterFile(FileInfo file, IFileMappingInfo fileMappingInfo)
        {
            var workspace = fileMappingInfo.GetWorkspace();
            var aclhash   = fileMappingInfo.AclHash;

            var aclfileLocalPath_Update = workspace.TrimWorekspacePath(file.FullName);

            mLogger.Info($"aclfileLocalPath_Update={aclfileLocalPath_Update}");

            // 移動先のディレクトリがサブディレクトリを含む場合、存在しないサブディレクトリを作成します。
            var newFileInfo = new FileInfo(Path.Combine(workspace.PhysicalPath, aclfileLocalPath_Update));

            Directory.CreateDirectory(newFileInfo.Directory.FullName);

            // ファイル移動
            var fromFile = file;
            var toFile   = new FileInfo(Path.Combine(workspace.PhysicalPath, aclfileLocalPath_Update + ".tmp"));

            mLogger.Info($"[ファイル移動] {file.FullName}を、{toFile.FullName}へ移動します。");
            File.Move(fromFile.FullName, toFile.FullName);

            // 仮想領域にACLファイルの作成
            var aclFileInfo = new FileInfo(Path.Combine(workspace.VirtualPath, aclfileLocalPath_Update) + ".aclgene");
            // インポート処理の場合は、仮想領域にフォルダがないためディレクトリを作成する。
            // 仮想領域での処理の場合は、フォルダが既に存在するはずなので、なにもしない。
            var dir = aclFileInfo.Directory.FullName;

            Directory.CreateDirectory(aclFileInfo.Directory.FullName);

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

            using (var aclFile = File.Create(aclFileInfo.FullName)) {
                Serializer.Serialize(aclFile, data);
            }

            CleanAclFile(toFile);

            return(fileMappingInfo);
        }
Ejemplo n.º 6
0
 public void SetFileMappingInfo(IFileMappingInfo fileMappingInfo) => this.FileMappingInfo = (FileMappingInfo)fileMappingInfo;
        /// <summary>
        /// ファイルマッピング情報から、コンテント情報の作成または更新を行う。
        /// </summary>
        /// <param name="fileMappingInfo">ファイルマッピング情報</param>
        private IContent UpdateContentFromFileMapping(IFileMappingInfo fileMappingInfo)
        {
            // FileMappingInfoがContentとの関連が存在する場合、新規のArtifactは作成できないので例外を投げる。
            if (fileMappingInfo.Id != 0L)
            {
                var a = mContentRepository.Load(fileMappingInfo);
                if (a != null)
                {
                    throw new ApplicationException("既にコンテント情報が作成済みのFileMappingInfoです。");
                }
            }

            //---
            //!+ パス文字列から、階層構造を持つカテゴリを取得/作成を行うロジック
            //---

            /* DUMMY */
            var appcat = mCategoryRepository.Load(1L); // ルートカテゴリを取得する(ルートカテゴリ取得に使用するIDをハードコートで指定しているが、これは暫定対応)

            if (appcat == null)
            {
                throw new ApplicationException("ルートカテゴリが見つかりません");
            }

            //処理内容
            //   ・パスに含まれるカテゴリすべてが永続化されること
            //   ・Contentが永続化されること

            // パス文字列を、トークン区切りでキュー配列に詰めるロジック
            string pathText = fileMappingInfo.MappingFilePath;

            // 下記のコードは、Akalibへユーティリティとして実装する(パスを区切ってQueueを作成するユーティリティ)
            // 有効なパス区切り文字は、下記のコードでチェックしてください。
            // LOG.Info("トークン文字列1: Token: {}", Path.AltDirectorySeparatorChar);
            // LOG.Info("トークン文字列2: Token: {}", Path.DirectorySeparatorChar);
            // LOG.Info("トークン文字列3: Token: {}", Path.PathSeparator);
            // LOG.Info("トークン文字列4: Token: {}", Path.VolumeSeparatorChar);
            //
            // Windows環境: Path.DirectorySeparatorChar
            // Unix環境: Path.AltDirectorySeparatorChar
            var sttokens = new Stack <string>(pathText.Split(Path.DirectorySeparatorChar, StringSplitOptions.None));
            var title    = sttokens.Pop();
            var qutokens = new Queue <string>(sttokens.Reverse <string>());

            // 各トークン(パス文字列)のカテゴリを取得、または存在しない場合はカテゴリを新規作成する。
            while (qutokens.Count > 0)
            {
                string parsedCategoryName;
                bool   categoryCreatedFlag = false;
                bool   parseSuccessFlag    = false;
                var    oneText             = qutokens.Dequeue();
                parseSuccessFlag = AttachParsedCategoryName(oneText, out parsedCategoryName);
                appcat           = CreateOrSelectCategory(appcat, parsedCategoryName, out categoryCreatedFlag);

                if (categoryCreatedFlag && parseSuccessFlag)
                {
                    mMessagingManager.Dispatcher(MSG_NEWCATEGORY, appcat.Id);
                }

                AttachParsedLabel(oneText, appcat);
            }

            // **コンテント情報を保持するエンティティの作成**
            //    現Verでは画像のみ、メタ情報を生成できる (それ以外のファイルは、例外を投げる)
            if (fileMappingInfo.Mimetype == "image/png")
            {
                var entity = mContentRepository.New();
                entity.Name        = title;
                entity.IdentifyKey = RandomAlphameric.RandomAlphanumeric(10);
                entity.SetFileMappingInfo(fileMappingInfo);
                entity.SetCategory(appcat);
                mContentRepository.Save();

                return(entity);
            }
            else
            {
                throw new ApplicationException("処理不能なMIMEタイプです");
            }
            // --------------------
            // ここまで
            // --------------------
        }