Example #1
0
        public IContent New()
        {
            var entity = new Content();

            entity.IdentifyKey = RandomAlphameric.RandomAlphanumeric(10);
            return(this.Add(entity));
        }
            /// <summary>
            /// サムネイルを生成します
            /// </summary>
            public void Do()
            {
                try
                {
                    using (MemoryStream memoryStream = new MemoryStream())
                    {
                        this._ImageSource.SaveAsPng(memoryStream);
                        string mimeType = "image/png";

                        if (string.IsNullOrEmpty(_rebuildThumbnailKey))
                        {
                            string key = null;
                            while (key == null)
                            {
                                var tal = RandomAlphameric.RandomAlphanumeric(20);
                                var r   = _thumbnailRepository.FindByKey(tal);
                                if (r.Count() == 0)
                                {
                                    key = tal;
                                }
                                foreach (var p in r)
                                {
                                    if (p.ThumbnailType != _ThumbnailType)
                                    {
                                        key = tal;
                                    }
                                }
                            }

                            var thumbnail = _thumbnailRepository.New();
                            thumbnail.ThumbnailKey  = key;
                            thumbnail.ThumbnailType = _ThumbnailType;
                            thumbnail.MimeType      = mimeType;
                            thumbnail.BitmapBytes   = memoryStream.ToArray();

                            _ThumbnailKey = key;
                        }
                        else
                        {
                            var thumbnailQue = _thumbnailRepository.FindByKey(_rebuildThumbnailKey);

                            // サムネイルタイプのエンティティが存在する場合、trueをセットする。
                            bool isThumbnailSave = false;
                            foreach (var prop in thumbnailQue)
                            {
                                if (prop.ThumbnailType == _ThumbnailType)
                                {
                                    prop.BitmapBytes = memoryStream.ToArray();
                                    isThumbnailSave  = true;
                                }
                            }

                            if (!isThumbnailSave)
                            {
                                // 指定したサムネイルタイプのエンティティを、
                                // 新規作成する。
                                var thumbnail_NewThumbnailType = _thumbnailRepository.New();
                                thumbnail_NewThumbnailType.ThumbnailKey  = _rebuildThumbnailKey;
                                thumbnail_NewThumbnailType.ThumbnailType = _ThumbnailType;
                                thumbnail_NewThumbnailType.BitmapBytes   = memoryStream.ToArray();
                                _ThumbnailKey = _rebuildThumbnailKey;
                            }
                            else
                            {
                                _ThumbnailKey = _rebuildThumbnailKey;
                            }
                        }
                    }
                }
                catch (NotSupportedException expr)
                {
                    _logger.Warn(expr.Message);
                }
            }
Example #3
0
            /// <summary>
            /// サムネイルを生成します
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="args"></param>
            public void Do(object sender, DoWorkEventArgs args)
            {
                try
                {
                    // バイナリに出力
                    using (MemoryStream memoryStream = new MemoryStream())
                    {
                        PngBitmapEncoder encoder = new PngBitmapEncoder();
                        var frame = BitmapFrame.Create((BitmapImage)this._ImageSource);
                        encoder.Frames.Add(frame);
                        encoder.Save(memoryStream);

                        using (var dbc = new ThumbDbContext())
                        {
                            var repo = new ThumbnailRepository(dbc);

                            if (string.IsNullOrEmpty(_rebuildThumbnailKey))
                            {
                                string key = null;
                                while (key == null)
                                {
                                    var tal = RandomAlphameric.RandomAlphanumeric(20);
                                    var r   = repo.FindFromKey(tal);
                                    if (r.Count == 0)
                                    {
                                        key = tal;
                                    }
                                    foreach (var p in r)
                                    {
                                        if (p.ThumbnailType != _ThumbnailType)
                                        {
                                            key = tal;
                                        }
                                    }
                                }

                                var thumbnail = new Thumbnail();
                                thumbnail.ThumbnailKey  = key;
                                thumbnail.ThumbnailType = _ThumbnailType;
                                thumbnail.BitmapBytes   = memoryStream.ToArray();

                                repo.Add(thumbnail);

                                _ThumbnailKey = key;
                            }
                            else
                            {
                                var thumbnail = repo.FindFromKey(_rebuildThumbnailKey);

                                // サムネイルタイプのエンティティが存在する場合、trueをセットする。
                                bool isThumbnailSave = false;
                                foreach (var prop in thumbnail)
                                {
                                    if (prop.ThumbnailType == _ThumbnailType)
                                    {
                                        prop.BitmapBytes = memoryStream.ToArray();
                                        isThumbnailSave  = true;
                                    }
                                }

                                if (!isThumbnailSave)
                                {
                                    // 指定したサムネイルタイプのエンティティを、
                                    // 新規作成する。
                                    var thumbnail_NewThumbnailType = new Thumbnail();
                                    thumbnail_NewThumbnailType.ThumbnailKey  = _rebuildThumbnailKey;
                                    thumbnail_NewThumbnailType.ThumbnailType = _ThumbnailType;
                                    thumbnail_NewThumbnailType.BitmapBytes   = memoryStream.ToArray();
                                    repo.Add(thumbnail_NewThumbnailType);
                                    _ThumbnailKey = _rebuildThumbnailKey;
                                }
                                else
                                {
                                    _ThumbnailKey = _rebuildThumbnailKey;
                                }
                            }
                            dbc.SaveChanges();
                        }
                    }
                }
                catch (NotSupportedException expr)
                {
                    LOG.WarnFormat(expr.Message);
                }
            }
Example #4
0
        protected override void Execute(CodeActivityContext context)
        {
            IWorkflowContext workflowContext = context.GetExtension <IWorkflowContext>();
            ParameterStack   pstack          = context.GetValue <ParameterStack>(this.Parameter);

            var target = pstack.GetValue <FileMappingInfo>(ActivityParameterStack.TARGET);

            Mogami.Model.Category category = null;
            if (pstack.ContainsKey(ActivityParameterStack.CATEGORY))
            {
                category = pstack.GetValue <Mogami.Model.Category>(ActivityParameterStack.CATEGORY);
            }

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

            // Guard
            Ensure.That(target).IsNotNull();

            // FileMappingInfoがArtifactとの関連が存在する場合、
            // 新規のArtifactは作成できないので、例外を投げる。
            if (target.Id != 0L)
            {
                var r = new ArtifactRepository(workflowContext.DbContext);
                var a = r.LoadByFileMappingInfo(target);
                if (a != null)
                {
                    throw new ApplicationException("すでに作成済みのFileMappingInfoです。");
                }
            }

            if (category == null)
            {
                var catrepo = new CategoryRepository(workflowContext.DbContext);
                var appcat  = catrepo.Load(3L);
                if (appcat == null)
                {
                    throw new ApplicationException();
                }
            }

            var tokens   = target.MappingFilePath.Split(new string[] { @"\" }, StringSplitOptions.None);
            var sttokens = new Stack <string>(tokens);
            var title    = sttokens.Pop();

            // 現Verでは画像のみ、メタ情報を生成できる。
            // (それ以外のファイルは、例外を投げる)
            if (target.Mimetype == "image/png")
            {
                var repo   = new ImageArtifactRepository(workflowContext.DbContext);
                var entity = new ImageArtifact
                {
                    Title           = title,
                    IdentifyKey     = RandomAlphameric.RandomAlphanumeric(10),
                    FileMappingInfo = target,
                    ImageHeight     = -1,                // 未実装
                    ImageWidth      = -1,                // 未実装
                };

                if (category != null)
                {
                    entity.Category = new T_Artifact2Category()
                    {
                        Artifact = entity,
                        Category = category,
                        OrderNo  = 1
                    }
                }
                ;

                repo.Add(entity);

                pstack.SetValue(outputname, entity);
            }
            else
            {
                throw new ApplicationException("処理不能なMIMEタイプです");
            }
        }

        #endregion メソッド
    }
        /// <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タイプです");
            }
            // --------------------
            // ここまで
            // --------------------
        }