//──────────────────────────────────────── /// <summary> /// 追加。 /// </summary> /// <param name="nItems"></param> /// <param name="request"></param> /// <param name="log_Reports"></param> public void Add( Expr_String eChild, Log_Reports log_Reports ) { Log_Method log_Method = new Log_MethodImpl(0); log_Method.BeginMethod(Info_Syntax.Name_Library, this, "Add", log_Reports); if (eChild is Expr_StringImpl) { ((Expr_StringImpl)eChild).Parent = this.owner_Expression; } else if (eChild is Expr_LeafStringImpl) { ((Expr_LeafStringImpl)eChild).Parent = this.owner_Expression; } else if (eChild is Expr_TexttemplateP1pImpl) { ((Expr_TexttemplateP1pImpl)eChild).Parent = this.owner_Expression; } else { log_Method.WriteWarning_ToConsole(" 想定外のクラス=[" + eChild.GetType().Name + "]"); } this.items.Add(eChild); log_Method.EndMethod(log_Reports); }
//──────────────────────────────────────── /// <summary> /// /// </summary> /// <param name="name">引数名</param> /// <param name="value">その値</param> /// <param name="cElm">引数のコンフィグ</param> /// <param name="eParent">親Expr</param> /// <param name="isRequired"></param> /// <param name="log_Reports"></param> /// <returns></returns> public bool TryGetValue2( PmName name, out Expr_String value, Conf_String cElm, Expr_String eParent, bool isRequired, Log_Reports log_Reports ) { bool isHit = false; string s;//コントロール名 this.TryGetValue(name, out s, isRequired, log_Reports); if (log_Reports.Successful) { value = new Expr_LeafStringImpl(s, eParent, cElm); isHit = true; } else { value = null; } return(isHit); }
//──────────────────────────────────────── /// <summary> /// 子要素を追加します。 /// </summary> /// <param name="name"></param> /// <param name="nItem"></param> /// <param name="request"></param> /// <param name="log_Reports"></param> public void Set( string name, Expr_String eItem, Log_Reports log_Reports ) { Log_Method log_Method = new Log_MethodImpl(0); log_Method.BeginMethod(Info_Syntax.Name_Library, this, "Set", log_Reports); if (!this.map.ContainsKey(name)) { // 新規項目なら // そのまま追加。 this.map.Add(name, eItem); } else { // 既存項目なら // 上書きします。 this.map.Remove(name); this.map.Add(name, eItem); if (log_Method.CanDebug(1)) { log_Method.WriteDebug_ToConsole(" 既に追加されていた項目を削除して、上書きしました。[" + name + "]"); } } log_Method.EndMethod(log_Reports); }
/// <summary> /// 属性を上書きします。 /// </summary> /// <param name="name_Attribute"></param> /// <param name="expr_Attribute"></param> /// <param name="log_Reports"></param> public void SetAttribute( string name_Attribute, Expr_String expr_Attribute, Log_Reports log_Reports ) { this.Attributes.Set(name_Attribute, expr_Attribute, log_Reports); }
//──────────────────────────────────────── /// <summary> /// コンストラクター。 /// </summary> /// <param name="parent_Expr"></param> /// <param name="cur_Conf">生成時に指定できないものもある。</param> public Expr_StringImpl(Expr_String parent_Expr, Conf_String cur_Conf) { this.parent_Expression = parent_Expr; this.conf_ = cur_Conf; enumHitcount = EnumHitcount.Unconstraint; this.eChildNodes = new Expr_StringListImpl(this); this.attributes = new ExprStringMapImpl(this.Conf); }
/// <summary> /// コンストラクター。 /// </summary> public Expr_LeafStringImpl(string sHumanInput, Expr_String parent_Expr, Conf_String cur_Conf) { this.sHumanInput = sHumanInput; this.parent_Expression = parent_Expr; this.conf_ = cur_Conf; this.enumHitcount = EnumHitcount.Unconstraint; this.dictionary_Expression_Attribute = new ExprStringMapImpl(this.Conf); }
/// <summary> /// E_Elm属性。 /// </summary> /// <param name="out_E_Result">検索結果。</param> /// <param name="sName"></param> /// <param name="bRequired"></param> /// <param name="hits"></param> /// <param name="log_Reports"></param> /// <returns>検索結果が1件以上あれば真。</returns> public bool TrySelectAttribute( out Expr_String out_eResult, string sName, EnumHitcount hits, Log_Reports log_Reports ) { return(this.Attributes.TrySelect( out out_eResult, sName, hits, log_Reports)); }
/// <summary> /// 属性。 /// </summary> /// <param name="out_E_Result">検索結果。</param> /// <param name="name"></param> /// <param name="bRequired"></param> /// <param name="hits"></param> /// <param name="log_Reports"></param> /// <returns>検索結果が1件以上あれば真。</returns> public bool TrySelectAttribute( out Expr_String eResult_Out, string name, EnumHitcount hits, Log_Reports log_Reports ) { // 使いません。 eResult_Out = new Expr_StringImpl(this, this.Conf); return(false); }
/// <summary> /// 属性。 /// </summary> /// <param name="out_E_Result">検索結果。</param> /// <param name="sName"></param> /// <param name="bRequired"></param> /// <param name="hits"></param> /// <param name="log_Reports"></param> /// <returns>検索結果が1件以上あれば真。</returns> public bool TrySelectAttribute( out Expr_String out_eResult, string sName, EnumHitcount hits, Log_Reports log_Reports ) { // 使いません。 out_eResult = new Expr_StringImpl(this, null); return(false); }
//──────────────────────────────────────── /// <summary> /// コンストラクター。 /// </summary> public Expr_TexttemplateP1pImpl(Expr_String eParent, Conf_String cElm) { this.parent_Expression = eParent; this.conf = cElm; this.requestItems = EnumHitcount.Unconstraint; this.dictionary_P1p = new Dictionary <int, string>(); this.list_Expression_Child = new Expr_StringListImpl(this);//使いません。 this.dictionary_Expression_Attribute = new ExprStringMapImpl(this.Conf); }
//──────────────────────────────────────── public SelectstatementImpl(Expr_String parent_Expr, Conf_String parent_Conf) { this.parent = parent_Conf; this.List_SName_SelectField = new List <string>(); this.Expression_From = new Expr_StringImpl(parent_Expr, parent_Conf); this.Expression_Into = new Expr_StringImpl(parent_Expr, parent_Conf); this.Expression_Where_RecordSetLoadFrom = new Expr_StringImpl(parent_Expr, parent_Conf); this.EnumWherelogic = EnumLogic.And;//whereのlogic属性のデフォルト。 this.list_Recordcondition = new List <Recordcondition>(); this.Required = ""; this.Storage = ""; this.Description = ""; }
public string GetMessage(Log_Reports log_Reports) { Expr_String eStr = this.p1pText.Compile(log_Reports); StringBuilder sb = new StringBuilder(); sb.Append(eStr.Lv4Execute_OnImplement(EnumHitcount.Unconstraint, log_Reports)); sb.Append(System.Environment.NewLine); // コールスタックを付けます。 sb.Append(this.text_Callstack); return(sb.ToString()); }
//──────────────────────────────────────── /// <summary> /// このデータは、ファイルパス型だ、と想定して、ファイルパスを取得します。 /// </summary> /// <returns></returns> public static Expr_Filepath Execute4_OnExpressionString_AsFilepath_Impl( Expr_String eCaller, EnumHitcount request, Log_Reports log_Reports ) { Log_Method log_Method = new Log_MethodImpl(); log_Method.BeginMethod(Info_Syntax.Name_Library, eCaller, "Execute4_OnExpressionString_AsFilepath_Impl", log_Reports); // // // // Expr_Filepath reulst_eRel; // // ファイルパス。 string sFpath = eCaller.Lv5_Implement(log_Reports); { reulst_eRel = Expr_FilepathImpl.Init2( "", sFpath, "ファイルパス出典未指定L01_1", eCaller.Conf, log_Reports ); if (!log_Reports.Successful) { // 既エラー。 reulst_eRel = null; goto gt_EndMethod; } } goto gt_EndMethod; // // gt_EndMethod: log_Method.EndMethod(log_Reports); return(reulst_eRel); }
//──────────────────────────────────────── /// <summary> /// 親E_Stringを遡って検索。一致するものがなければヌル。 /// </summary> /// <param name="nodeName">ノード名</param> /// <returns></returns> public static Expr_String GetParentEOrNull_(Expr_String eMe, string nodeName) { Expr_String result; if (eMe.Parent == null) { result = null; } else if (eMe.Parent.Conf.Name == nodeName) { result = eMe.Parent; } else { result = eMe.Parent.GetParentExpressionOrNull(nodeName); } return(result); }
//──────────────────────────────────────── /// <summary> /// 子要素を追加します。 /// </summary> /// <param name="items"></param> /// <param name="request"></param> /// <param name="log_Reports"></param> public void AddChildElement( Expr_String eChild, Log_Reports log_Reports ) { // // エラー。 Log_Method log_Method = new Log_MethodImpl(); log_Method.BeginMethod(Info_Syntax.Name_Library, this, "AddChildElement", log_Reports); // // // // if (log_Reports.CanCreateReport) { Log_RecordReports r = log_Reports.BeginCreateReport(EnumReport.Error); r.SetTitle("▲エラー201!", log_Method); Log_TextIndented t = new Log_TextIndentedImpl(); t.Append("このメソッド " + log_Method.Fullname + " は使わないでください。"); // ヒント t.Append(r.Message_Conf(this.Conf)); r.Message = t.ToString(); log_Reports.EndCreateReport(); } // // log_Method.EndMethod(log_Reports); }
//──────────────────────────────────────── public void ForEach(DELEGATE_Expression_Nodes dlgt1) { bool bBreak = false; bool bRemove = false; for (int nI = 0; nI < this.items.Count; nI++) { Expr_String cur_Expression = this.items[nI]; dlgt1(cur_Expression, ref bRemove, ref bBreak); if (bRemove) { this.items.RemoveAt(nI); nI--; bRemove = false; } if (bBreak) { break; } } }
//──────────────────────────────────────── /// <summary> /// コンストラクター。 /// </summary> public Expr_StringListImpl(Expr_String owner) { this.owner_Expression = owner; this.items = new List <Expr_String>(); }
//──────────────────────────────────────── public virtual string Lv5_Implement( Log_Reports log_Reports ) { Log_Method log_Method = new Log_MethodImpl(); log_Method.BeginMethod(Info_Syntax.Name_Library, this, "Lv5_Implement", log_Reports); // // StringBuilder sb_Result = new StringBuilder(); List <Expr_String> eChildList = this.ChildNodes.SelectList(EnumHitcount.Unconstraint, log_Reports); switch (this.enumHitcount) { case EnumHitcount.First_Exist: { // // 最初の1件のみ。存在しない場合エラー。 // if (0 < eChildList.Count) { Expr_String eChild = eChildList[0]; string s = eChild.Lv4Execute_OnImplement(this.enumHitcount, log_Reports); sb_Result.Append(s); } else { // // エラー goto gt_Error_NotFoundOne; } } break; case EnumHitcount.First_Exist_Or_Zero: { // // 最初の1件のみ。存在しない場合、空文字列。 // if (0 < eChildList.Count) { Expr_String eChild = eChildList[0]; string s = eChild.Lv4Execute_OnImplement(this.enumHitcount, log_Reports); sb_Result.Append(s); } else { // // 存在しないので、空文字列。 // // そのままスルー。 } } break; case EnumHitcount.Unconstraint: { // // 制限なし // foreach (Expr_String eChild in eChildList) { string s = eChild.Lv4Execute_OnImplement(this.enumHitcount, log_Reports); sb_Result.Append(s); } } break; default: { // // エラー goto gt_Error_UndefinedEnum; } } goto gt_EndMethod; // #region 異常系 //──────────────────────────────────────── gt_Error_NotFoundOne: if (log_Reports.CanCreateReport) { Log_RecordReports r = log_Reports.BeginCreateReport(EnumReport.Error); r.SetTitle("▲エラー111!", log_Method); StringBuilder sb = new StringBuilder(); sb.Append("必ず、最初の1件を取得する指定でしたが、1件も存在しませんでした。"); sb.Append(Environment.NewLine); sb.Append(Environment.NewLine); // ヒント r.Message = sb_Result.ToString(); log_Reports.EndCreateReport(); } goto gt_EndMethod; //──────────────────────────────────────── gt_Error_UndefinedEnum: if (log_Reports.CanCreateReport) { Log_RecordReports r = log_Reports.BeginCreateReport(EnumReport.Error); r.SetTitle("▲エラー113!", log_Method); StringBuilder sb = new StringBuilder(); sb.Append("this.requestItems.VolumeConstraintEnum=["); sb.Append(this.enumHitcount.ToString()); sb.Append("]には、プログラム側でまだ未対応です。"); // ヒント r.Message = sb_Result.ToString(); log_Reports.EndCreateReport(); } goto gt_EndMethod; //──────────────────────────────────────── #endregion // gt_EndMethod: log_Method.EndMethod(log_Reports); return(sb_Result.ToString()); }
//──────────────────────────────────────── /// <summary> /// コンストラクター。 /// </summary> public Expr_LeafStringImpl(Expr_String parent_Expr, Conf_String cur_Conf) : this("", parent_Expr, cur_Conf) { }
/// <summary> /// コンストラクター。 /// node_Configurationtree を後で InitializeBeforeuse を使って指定する必要がある。 /// </summary> /// <param name="eParent"></param> public Expr_StringImpl(Expr_String eParent) : this(eParent, null) { }
//──────────────────────────────────────── /// <summary> /// 例えば "data" と指定すれば、 /// 直下の子要素の中で <data > といったノード名を持つものはヒットする。 /// </summary> /// <param name="sName"></param> /// <param name="sExpectedValue"></param> /// <param name="request"></param> /// <param name="log_Reports"></param> /// <returns></returns> public static List <Expr_String> SelectItemByNodeName( List <Expr_String> eItems, string sName_ExpectedNode, bool bRemove, EnumHitcount request, Log_Reports log_Reports) { Log_Method log_Method = new Log_MethodImpl(0); log_Method.BeginMethod(Info_Syntax.Name_Library, "Expression_Node_StringImpl", "SelectItemByNodeName", log_Reports); List <Expr_String> result = new List <Expr_String>(); for (int nI = 0; nI < eItems.Count; nI++) { Expr_String eItem = eItems[nI]; if (log_Reports.Successful) { if (eItem.Conf.Name == sName_ExpectedNode) { result.Add(eItem); if (bRemove) { // 削除を要求します。 eItems.RemoveAt(nI); nI--; } if (EnumHitcount.First_Exist == request || EnumHitcount.First_Exist_Or_Zero == request) { // 最初の1件で終了。複数件ヒットするかどうかは判定しない。 break; } } } } if (EnumHitcount.One == request) { // 必ず1件だけヒットする想定。 if (result.Count != 1) { goto gt_errorNotOne; } } else if (EnumHitcount.First_Exist == request) { // 必ずヒットする。複数件あれば、最初の1件だけ取得。 if (0 == result.Count) { goto gt_errorNoHit; } else if (1 < result.Count) { result.RemoveRange(1, result.Count - 1); } } else if (EnumHitcount.First_Exist_Or_Zero == request) { // ヒットすれば最初の1件だけ、ヒットしなければ0件の想定。 if (1 < result.Count) { result.RemoveRange(1, result.Count - 1); } } else { } goto gt_EndMethod; // // #region 異常系 //──────────────────────────────────────── gt_errorNoHit: if (log_Reports.CanCreateReport) { Log_RecordReports r = log_Reports.BeginCreateReport(EnumReport.Error); r.SetTitle("▲エラー102!", log_Method); StringBuilder sb = new StringBuilder(); sb.Append("必ず、1件以上ヒットする指定でしたが、["); sb.Append(result.Count); sb.Append("]件ヒットしました。"); sb.Append(Environment.NewLine); sb.Append(Environment.NewLine); // ヒント r.Message = sb.ToString(); log_Reports.EndCreateReport(); } goto gt_EndMethod; // // gt_errorNotOne: if (log_Reports.CanCreateReport) { Log_RecordReports r = log_Reports.BeginCreateReport(EnumReport.Error); r.SetTitle("▲エラー101!", log_Method); StringBuilder sb = new StringBuilder(); sb.Append("必ず、1件のみ取得する指定でしたが、["); sb.Append(result.Count); sb.Append("]件取得しました。"); sb.Append(Environment.NewLine); sb.Append(Environment.NewLine); // ヒント r.Message = sb.ToString(); log_Reports.EndCreateReport(); } goto gt_EndMethod; //──────────────────────────────────────── #endregion // // gt_EndMethod: log_Method.EndMethod(log_Reports); return(result); }
//──────────────────────────────────────── /// <summary> /// /// </summary> /// <param name="e_Result">検索結果。</param> /// <param name="name"></param> /// <param name="bRequired"></param> /// <param name="hits"></param> /// <param name="log_Reports"></param> /// <returns>検索結果が1件以上あれば真。</returns> public bool TrySelect( out Expr_String out_eResult, string name, EnumHitcount hits, Log_Reports log_Reports//bug:ヌルのことがある? ) { Log_Method log_Method = new Log_MethodImpl(); log_Method.BeginMethod(Info_Syntax.Name_Library, this, "TrySelect", log_Reports); // bool isHit; if (this.map.ContainsKey(name)) { // ヒット。 out_eResult = this.map[name]; isHit = true; } else { // 一致なし。 isHit = false; if (Utility_Hitcount.IsError_IfNoHit(hits, log_Reports)) { //エラーにする。 out_eResult = null; goto gt_Error_NotFoundOne; } else { // 該当しないキーを指定され、値を取得できなかったが、エラー報告しない。 Conf_String parent_Conf = new Conf_StringImpl("!ハードコーディング_NStringDictionaryImpl#Get", null); out_eResult = new Expr_LeafStringImpl(null, parent_Conf); } } goto gt_EndMethod; // #region 異常系 //──────────────────────────────────────── gt_Error_NotFoundOne: if (log_Reports.CanCreateReport) { Log_RecordReports r = log_Reports.BeginCreateReport(EnumReport.Error); r.SetTitle("▲エラー141!", log_Method); Log_TextIndented s = new Log_TextIndentedImpl(); s.Append("指定された名前["); s.Append(name); s.Append("]は、“EDic(連想配列)”の中にありませんでした。"); s.Newline(); s.Append("┌────────┐キー一覧(個数=["); s.Append(this.map.Count); s.Append("])"); s.Newline(); foreach (string sKey in this.map.Keys) { s.Append("["); s.Append(sKey); s.Append("]"); s.Newline(); } s.Append("└────────┘"); s.Newline(); // ヒント if (null != this.Owner_Conf) { s.Append("◆オーナー情報1"); s.Newline(); this.Owner_Conf.ToText_Content(s); } if (0 < this.map.Count) { foreach (Expr_String eItem in this.map.Values) { Expr_String eParent = eItem.Parent; if (null != eParent)//親要素が設定されていないことがある。 { // 最初の1個。 s.Append("◆最初の要素の親の情報。"); s.Newline(); eParent.ToText_Snapshot(s); } break; } } // // オーナーの情報。 if (null != this.owner_Conf)//オーナー要素が設定されていないことがある。 { s.Newline(); s.Newline(); s.Append("◆オーナー情報2。"); s.Newline(); this.owner_Conf.ToText_Locationbreadcrumbs(s); } r.Message = s.ToString(); log_Reports.EndCreateReport(); } goto gt_EndMethod; //──────────────────────────────────────── #endregion // gt_EndMethod: log_Method.EndMethod(log_Reports); return(isHit); }