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); // -------------------- // ここまで // -------------------- }
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); }
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タイプです"); } // -------------------- // ここまで // -------------------- }