Пример #1
0
        /// <summary>
        /// 項目の文字長に関する警告を取得します。
        /// </summary>
        /// <param name="property">対象プロパティ。</param>
        /// <returns>
        /// 項目の文字長に関する警告を返します。
        /// </returns>
        private List <ReplacingNameWarning> GetLengthWarnings(ReplacingNameWarning.Property property)
        {
            var warnings = new List <ReplacingNameWarning>();

            warnings.AddRange(GetOverlengthWarnings(property));
            warnings.AddRange(GetUnderlengthWarnings(property));
            return(warnings);
        }
        /// <summary>
        /// 処理に必要な情報の入力をビューに要求します。
        /// </summary>
        /// <param name="property">入力を要求するプロパティ。</param>
        private void SetProperty(ReplacingNameWarning.Property property)
        {
            var retry = true;

            while (retry)
            {
                switch (property)
                {
                case ReplacingNameWarning.Property.FilePath:
                    Model.FilePath = View.Require("ファイルパス");
                    break;

                case ReplacingNameWarning.Property.OldFirstName:
                    Model.OldFirstName = View.Require("古い1番目の名前");
                    break;

                case ReplacingNameWarning.Property.NewFirstName:
                    Model.NewFirstName = View.Require("新しい1番目の名前");
                    break;

                case ReplacingNameWarning.Property.OldSecondName:
                    Model.OldSecondName = View.Require("古い2番目の名前");
                    break;

                case ReplacingNameWarning.Property.NewSecondName:
                    Model.NewSecondName = View.Require("新しい2番目の名前");
                    break;

                default:
                    return;
                }
                var warnings = Model.GetWarnings().Where(x => x.TargetProperty == property);

                //許容できないエラー
                var notAllowed = warnings.Where(x => x.Level == ReplacingNameWarning.WarningLevel.NotAllowed);
                if (notAllowed.Count() > 0)
                {
                    View.ShowWarning(notAllowed.First().Message);
                    continue;
                }
                //警告すべきエラー
                var notRecomended = warnings.Where(x => x.Level == ReplacingNameWarning.WarningLevel.NotRecomended);
                if (notRecomended.Count() > 0)
                {
                    retry = !ConfirmAllWarnings(notRecomended);
                    continue;
                }
                //入力を確定
                retry = false;
            }
        }
Пример #3
0
        /// <summary>
        /// 項目が最小文字長より少ない場合の警告を取得する。
        /// </summary>
        /// <param name="property">対象プロパティ。</param>
        /// <returns>警告。</returns>
        private List <ReplacingNameWarning> GetUnderlengthWarnings(ReplacingNameWarning.Property property)
        {
            var warnings = new List <ReplacingNameWarning>();
            var value    = GetValue(property);

            if (value.Length < 1)
            {
                warnings.Add(new ReplacingNameWarning()
                {
                    TargetProperty = property,
                    Level          = ReplacingNameWarning.WarningLevel.NotAllowed,
                    Message        = "1文字以上で入力してください。"
                });
            }
            return(warnings);
        }
Пример #4
0
        /// <summary>
        /// 項目が最大文字長を超えている場合の警告を取得します。
        /// </summary>
        /// <param name="property">対象プロパティ。</param>
        /// <returns>
        /// 項目の最大文字長超過の警告を返します。
        /// </returns>
        private List <ReplacingNameWarning> GetOverlengthWarnings(ReplacingNameWarning.Property property)
        {
            var warnings  = new List <ReplacingNameWarning>();
            var value     = GetValue(property);
            var maxLength = GetMaxLength(property);

            if (value.Length > maxLength)
            {
                warnings.Add(new ReplacingNameWarning()
                {
                    TargetProperty = property,
                    Level          = ReplacingNameWarning.WarningLevel.NotAllowed,
                    Message        = string.Format("{0}文字以内で入力してください。", maxLength)
                });
            }
            return(warnings);
        }
Пример #5
0
        /// <summary>
        /// 警告プロパティに対応した最大文字長を取得します。
        /// </summary>
        /// <param name="property">対象プロパティ。</param>
        /// <returns>
        /// プロパティの最大文字長を返します。
        /// </returns>
        private int GetMaxLength(ReplacingNameWarning.Property property)
        {
            var maxLength = 0;

            switch (property)
            {
            case ReplacingNameWarning.Property.OldFirstName:
            case ReplacingNameWarning.Property.NewFirstName:
                maxLength = 10;
                break;

            case ReplacingNameWarning.Property.OldSecondName:
            case ReplacingNameWarning.Property.NewSecondName:
                maxLength = 19;
                break;
            }
            return(maxLength);
        }
Пример #6
0
        /// <summary>
        /// 文字化けに関する警告を取得します。
        /// </summary>
        /// <param name="property">対象プロパティ。</param>
        /// <returns>
        /// 文字化けの発生が見込まれる場合、警告を返します。
        /// </returns>
        private List <ReplacingNameWarning> GetTextCorruptionWarnings(ReplacingNameWarning.Property property)
        {
            var warnings = new List <ReplacingNameWarning>();

            switch (property)
            {
            case ReplacingNameWarning.Property.OldFirstName:
            case ReplacingNameWarning.Property.NewFirstName:
                addWarningIfLengthsAreNotSame(this.OldFirstName, this.NewFirstName);
                break;

            case ReplacingNameWarning.Property.OldSecondName:
            case ReplacingNameWarning.Property.NewSecondName:
                addWarningIfLengthsAreNotSame(this.OldSecondName, this.NewSecondName);
                break;
            }
            return(warnings);

            void addWarningIfLengthsAreNotSame(string value1, string value2)
            {
                if (string.IsNullOrEmpty(value1) || string.IsNullOrEmpty(value2))
                {
                    return;
                }
                if (value1.Length != value2.Length)
                {
                    var message =
                        "置換前後の名前の文字数が異なります。" +
                        "名前が正しく表示されないことがあります。";
                    warnings.Add(new ReplacingNameWarning()
                    {
                        TargetProperty = property,
                        Level          = ReplacingNameWarning.WarningLevel.NotRecomended,
                        Message        = message
                    });
                }
            }
        }
Пример #7
0
        /// <summary>
        /// ファイルの置換対象が存在しない・複数存在する場合の警告を取得します。
        /// </summary>
        /// <param name="property">対象プロパティ。</param>
        /// <returns>
        /// 置換対象に関する警告を返します。
        /// </returns>
        private List <ReplacingNameWarning> GetUnintentionalReplacingWarnings(ReplacingNameWarning.Property property)
        {
            var warnings = new List <ReplacingNameWarning>();
            var value    = GetValue(property);

            if (this.FileContents == null)
            {
                // ファイルパスの指定前に反映しない
                return(warnings);
            }
            var count = this.FileContents.Count(value);

            if (count == 0)
            {
                var message = string.Format("[{0}]は対象のファイル内に存在しません。", this.OldFirstName);
                warnings.Add(new ReplacingNameWarning()
                {
                    TargetProperty = property,
                    Level          = ReplacingNameWarning.WarningLevel.NotRecomended,
                    Message        = message
                });
            }
            else if (count > 1)
            {
                var message = string.Format(
                    "[{0}]は{1}箇所で発見される表現です。" +
                    "このまま処理するとファイルが破損する恐れがあります。", this.OldFirstName, count);
                warnings.Add(new ReplacingNameWarning()
                {
                    TargetProperty = property,
                    Level          = ReplacingNameWarning.WarningLevel.NotRecomended,
                    Message        = message
                });
            }
            return(warnings);
        }
Пример #8
0
        /// <summary>
        /// 警告プロパティに対応した内容を取得します。
        /// </summary>
        /// <param name="property">対象プロパティ。</param>
        /// <returns>
        /// プロパティの内容を返します。
        /// </returns>
        private string GetValue(ReplacingNameWarning.Property property)
        {
            var value = string.Empty;

            switch (property)
            {
            case ReplacingNameWarning.Property.OldFirstName:
                value = this.OldFirstName;
                break;

            case ReplacingNameWarning.Property.NewFirstName:
                value = this.NewFirstName;
                break;

            case ReplacingNameWarning.Property.OldSecondName:
                value = this.OldSecondName;
                break;

            case ReplacingNameWarning.Property.NewSecondName:
                value = this.NewSecondName;
                break;
            }
            return(value ?? string.Empty);
        }
Пример #9
0
        /// <summary>
        /// 置換対象の組合せで、意図しない置換が行われる場合の警告を取得します。
        /// </summary>
        /// <remarks>
        /// 置換処理は2番目の名前から行われる関係上、2番目の置換対象に1番目の内容を含んでいると
        /// 本来1番目として置換されるべき表現が2番目の置換時に処理され、1番目の置換が行われません。
        /// </remarks>
        /// <param name="property">対象プロパティ。</param>
        /// <returns>
        /// 意図しない置換が発生する場合、警告を返します。
        /// </returns>
        private List <ReplacingNameWarning> GetUnintentionalReplaceingWarningsBetweenOlds(ReplacingNameWarning.Property property)
        {
            var warnings = new List <ReplacingNameWarning>();

            if (string.IsNullOrEmpty(this.OldFirstName) || string.IsNullOrEmpty(this.OldSecondName) || this.FileContents == null)
            {
                // 判定に必要な要素が指定される前に判定しない
                return(warnings);
            }
            var firstBytes = Encoding.Unicode.GetBytes(this.OldFirstName);
            var countFirstIncludingSecond = firstBytes.Count(this.OldSecondName);
            var countFileIncludingFirst   = this.FileContents.Count(this.OldFirstName);

            if (countFirstIncludingSecond > 1 && countFileIncludingFirst > 0)
            {
                var message =
                    "古い1番目の名前は2番目の名前を含んでいます。" +
                    "意図しない名称の置換が行われる可能性があります。";
                warnings.Add(new ReplacingNameWarning()
                {
                    TargetProperty = property,
                    Level          = ReplacingNameWarning.WarningLevel.NotRecomended,
                    Message        = message
                });
            }
            return(warnings);
        }