Changeset 7744

Show
Ignore:
Timestamp:
03/10/08 07:18:09 (7 years ago)
Author:
coma2n
Message:

lang/powershell/PSCustomProviders/trunk: #75 の機能を実装した

Location:
lang/powershell/PSCustomProviders/trunk/src
Files:
3 added
3 modified

Legend:

Unmodified
Added
Removed
  • lang/powershell/PSCustomProviders/trunk/src/Dotnet.PowerShell.PSTodo.Test/Dotnet.PowerShell.PSTodo.Test.2005.csproj

    r7623 r7744  
    5050    <None Include="TestData\case-5\200" /> 
    5151    <None Include="TestData\case-5\300" /> 
     52    <None Include="TestData\case-6\100" /> 
     53    <None Include="TestData\case-6\200" /> 
    5254    <None Include="UnitTest.2005.nunit" /> 
    5355  </ItemGroup> 
  • lang/powershell/PSCustomProviders/trunk/src/Dotnet.PowerShell.PSTodo.Test/PSTodo/PSTodoProvider_Test.cs

    r7633 r7744  
    2525using System; 
    2626using System.IO; 
     27using System.Text; 
    2728using System.Collections.ObjectModel; 
    2829using System.Management.Automation; 
     
    270271                } 
    271272 
     273                /// <summary> 
     274                /// コンテントを取得する。 
     275                /// </summary> 
     276                [Test, Category("Success")] 
     277                public void コンテントを取得できる() { 
     278                        CreateTodoDrive("case-6"); 
     279 
     280                        Collection<PSObject> result = rsEngine.Invoke("Get-Content 100"); 
     281                        // Descriptionの内容が読み込まれる。 
     282                        Assert.That(result[0].BaseObject, Is.EqualTo("Hello, World")); 
     283                } 
     284 
     285                /// <summary> 
     286                /// コンテントを設定する。 
     287                /// </summary> 
     288                [Test, Category("Success")] 
     289                public void コンテントを設定できる() { 
     290                        CreateTodoDrive("case-6"); 
     291 
     292                        StringBuilder content = new StringBuilder(); 
     293                        content.AppendLine("Bob"); 
     294                        content.AppendLine("John"); 
     295                        content.AppendLine("Judy"); 
     296 
     297                        // Add-Contentの場合は追加、Set-Contentの場合は置き換え 
     298                        rsEngine.Invoke( 
     299                                string.Format("Set-Content 200 '{0}'", content.ToString()) 
     300                        ); 
     301 
     302                        Collection<PSObject> result = rsEngine.Invoke("Get-Item 200"); 
     303                        // 今のDescriptionの値に追加される 
     304                        Assert.That(result[0].BaseObject, Has.Property("Description", content.ToString())); 
     305                } 
     306 
    272307                #endregion 
    273308 
  • lang/powershell/PSCustomProviders/trunk/src/Dotnet.PowerShell.PSTodo/PSTodo/PSTodoProvider.cs

    r7633 r7744  
    2525using System; 
    2626using System.IO; 
     27using System.Text; 
     28using System.Collections; 
     29using System.Collections.Generic; 
    2730using System.Runtime.Serialization.Formatters.Binary; 
    2831using System.Management.Automation; 
     
    3235 
    3336using Dotnet.Commons; 
    34 using System.Collections.Generic; 
    3537 
    3638#endregion 
     
    4446        /// </summary> 
    4547        [CmdletProvider("Todo", ProviderCapabilities.ShouldProcess)] 
    46         public sealed class PSTodoProvider : NavigationCmdletProvider { 
     48        public sealed class PSTodoProvider : NavigationCmdletProvider, IContentCmdletProvider { 
    4749 
    4850                #region innerClass 
     
    5557                [Serializable] 
    5658                [DebuggerStepThrough] 
    57                 internal sealed class NewTodoItemParameters { 
     59                private sealed class NewTodoItemParameters { 
    5860 
    5961                        #region fields 
     
    6567 
    6668                        private SwitchParameter complete; 
     69                        private SwitchParameter gui; 
    6770 
    6871                        #endregion 
     
    111114                        /// 完了したかどうかを取得、設定します。 
    112115                        /// </summary> 
    113                         [Parameter(Position=3)] 
     116                        [Parameter] 
    114117                        public SwitchParameter Complete { 
    115118                                get { return complete; } 
     
    117120                        } 
    118121 
     122                        /// <summary> 
     123                        /// GUIを使用するかどうかを取得、設定します。 
     124                        /// </summary> 
     125                        [Parameter] 
     126                        public SwitchParameter GUI { 
     127                                get { return gui; } 
     128                                set { gui = value; } 
     129                        } 
     130 
    119131                        #endregion 
    120132 
     
    125137                        /// </summary> 
    126138                        /// <param name="title">タイトル</param> 
    127                         public NewTodoItemParameters(string title) { 
    128                                 #region ArgumentValidation 
    129                                 ArgumentValidation.CheckForNullOrEmpty(title, "title"); 
    130                                 #endregion 
    131  
     139                        internal NewTodoItemParameters(string title) { 
    132140                                this.title = title; 
     141                        } 
     142 
     143                        #endregion 
     144 
     145                } 
     146 
     147                #endregion 
     148 
     149                #region TodoItemContentReader class 
     150 
     151                /// <summary> 
     152                /// アイテムの情報をストリーミングするクラス 
     153                /// </summary> 
     154                private sealed class TodoItemContentReader : IContentReader { 
     155 
     156                        #region fields 
     157 
     158                        /// <summary> 
     159                        /// アイテムの詳細情報のストリーム 
     160                        /// </summary> 
     161                        private StringReader reader; 
     162 
     163                        #endregion 
     164 
     165                        #region constructors 
     166 
     167                        /// <summary> 
     168                        /// パスを設定するコンストラクタ 
     169                        /// </summary> 
     170                        /// <param name="path">パス</param> 
     171                        public TodoItemContentReader(string path) { 
     172                                PSTodoItem item = Deserialize(path); 
     173 
     174                                this.reader = new StringReader( 
     175                                        item.Description != null ? item.Description : string.Empty 
     176                                ); 
     177                        } 
     178 
     179                        #endregion 
     180 
     181                        #region IContentReader member 
     182 
     183                        /// <summary> 
     184                        /// <see cref="IContentReader.Close"/> 
     185                        /// </summary> 
     186                        public void Close() { 
     187                                reader.Close(); 
     188                        } 
     189 
     190                        /// <summary> 
     191                        /// <see cref="IContentReader.Read"/> 
     192                        /// </summary> 
     193                        /// <param name="readCount"></param> 
     194                        /// <returns></returns> 
     195                        IList IContentReader.Read(long readCount) { 
     196                                List<string> lines = new List<string>(); 
     197 
     198                                for(int i = 0; i < readCount; i++) { 
     199                                        string line = reader.ReadLine(); 
     200                                        if(line == null) break; 
     201 
     202                                        lines.Add(line); 
     203                                } 
     204                                return lines; 
     205                        } 
     206 
     207                        /// <summary> 
     208                        /// <see cref="IContentReader.Seek"/> 
     209                        /// </summary> 
     210                        /// <param name="offset"></param> 
     211                        /// <param name="origin"></param> 
     212                        void IContentReader.Seek(long offset, SeekOrigin origin) { 
     213                        } 
     214 
     215                        #endregion 
     216 
     217                        #region IDisposable member 
     218 
     219                        /// <summary> 
     220                        /// <see cref="IDisposable.Dispose()"/> 
     221                        /// </summary> 
     222                        void IDisposable.Dispose() { 
     223                                Close(); 
     224                        } 
     225 
     226                        #endregion 
     227 
     228                } 
     229 
     230                #endregion 
     231 
     232                #region TodoItemContentWriter class 
     233 
     234                /// <summary> 
     235                /// アイテムに情報を書き込むクラス 
     236                /// </summary> 
     237                private class TodoItemContentWriter : IContentWriter { 
     238 
     239                        #region fields 
     240 
     241                        private string path; 
     242                        private PSTodoItem item; 
     243                        private StringWriter writer; 
     244 
     245                        #endregion 
     246 
     247                        #region constructors 
     248 
     249                        /// <summary> 
     250                        /// パスを設定するコンストラクタ 
     251                        /// </summary> 
     252                        /// <param name="path"></param> 
     253                        public TodoItemContentWriter(string path) { 
     254                                this.path = path; 
     255                                this.item = Deserialize(path); 
     256 
     257                                StringBuilder buf = new StringBuilder( 
     258                                        !string.IsNullOrEmpty(item.Description) ? item.Description : string.Empty 
     259                                ); 
     260                                writer = new StringWriter(buf); 
     261                        } 
     262 
     263                        #endregion 
     264 
     265                        #region IContentWriter member 
     266 
     267                        /// <summary> 
     268                        /// <see cref="IContentWriter.Close"/> 
     269                        /// </summary> 
     270                        public void Close() { 
     271                                writer.Close(); 
     272                                item.Description = writer.GetStringBuilder().ToString(); 
     273 
     274                                Serialize(item, path); 
     275                        } 
     276 
     277                        /// <summary> 
     278                        /// <see cref="IContentWriter.Seek"/> 
     279                        /// </summary> 
     280                        /// <param name="offset"></param> 
     281                        /// <param name="origin"></param> 
     282                        void IContentWriter.Seek(long offset, SeekOrigin origin) { 
     283                        } 
     284 
     285                        /// <summary> 
     286                        /// <see cref="IContentWriter.Write"/> 
     287                        /// </summary> 
     288                        /// <param name="content"></param> 
     289                        /// <returns></returns> 
     290                        IList IContentWriter.Write(IList content) { 
     291                                foreach(string line in content) writer.WriteLine(line); 
     292 
     293                                return content; 
     294                        } 
     295 
     296                        #endregion 
     297 
     298                        #region IDisposable member 
     299 
     300                        /// <summary> 
     301                        /// <see cref="IDisposable.Dispose()"/> 
     302                        /// </summary> 
     303                        void IDisposable.Dispose() { 
     304                                Close(); 
    133305                        } 
    134306 
     
    158330                /// <param name="item">アイテム</param> 
    159331                /// <param name="path">ファイル名</param> 
    160                 private void Serialize(PSTodoItem item, string path) { 
     332                private static void Serialize(PSTodoItem item, string path) { 
    161333                        using(FileStream fs = new FileStream(path, FileMode.Create, FileAccess.Write)) { 
    162334                                BinaryFormatter formatter = new BinaryFormatter(); 
     
    171343                /// <param name="path">ファイル名</param> 
    172344                /// <returns>アイテム</returns> 
    173                 private PSTodoItem Deserialize(string path) { 
     345                private static PSTodoItem Deserialize(string path) { 
    174346                        using(FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read)) { 
    175347                                BinaryFormatter formatter = new BinaryFormatter(); 
     
    457629                #endregion 
    458630 
     631                #region IContentCmdletProvider member 
     632 
     633                /// <summary> 
     634                /// <see cref="IContentCmdletProvider.ClearContent"/> 
     635                /// </summary> 
     636                /// <param name="path"></param> 
     637                void IContentCmdletProvider.ClearContent(string path) { 
     638                        PSTodoItem item = Deserialize(path); 
     639                        item.Description = string.Empty; 
     640 
     641                        Serialize(item, path); 
     642                } 
     643 
     644                /// <summary> 
     645                /// <see cref="IContentCmdletProvider.ClearContentDynamicParameters"/> 
     646                /// </summary> 
     647                /// <param name="path"></param> 
     648                /// <returns></returns> 
     649                object IContentCmdletProvider.ClearContentDynamicParameters(string path) { 
     650                        return null; 
     651                } 
     652 
     653                /// <summary> 
     654                /// <see cref="IContentCmdletProvider.GetContentReader"/> 
     655                /// </summary> 
     656                /// <param name="path"></param> 
     657                /// <returns></returns> 
     658                IContentReader IContentCmdletProvider.GetContentReader(string path) { 
     659                        return new TodoItemContentReader(path); 
     660                } 
     661 
     662                /// <summary> 
     663                /// <see cref="IContentCmdletProvider.GetContentReaderDynamicParameters"/> 
     664                /// </summary> 
     665                /// <param name="path"></param> 
     666                /// <returns></returns> 
     667                object IContentCmdletProvider.GetContentReaderDynamicParameters(string path) { 
     668                        return null; 
     669                } 
     670 
     671                /// <summary> 
     672                /// <see cref="IContentCmdletProvider.GetContentWriter"/> 
     673                /// </summary> 
     674                /// <param name="path"></param> 
     675                /// <returns></returns> 
     676                IContentWriter IContentCmdletProvider.GetContentWriter(string path) { 
     677                        // Add-Content, Set-Contentでこのメソッドが呼び出される。 
     678                        // Set-Contentの場合はこのメソッドの前にClearContentメソッドが呼び出され、 
     679                        // コンテントがクリアされるので要注意!! 
     680                        return new TodoItemContentWriter(path); 
     681                } 
     682 
     683                /// <summary> 
     684                /// <see cref="IContentCmdletProvider.GetContentWriterDynamicParameters"/> 
     685                /// </summary> 
     686                /// <param name="path"></param> 
     687                /// <returns></returns> 
     688                object IContentCmdletProvider.GetContentWriterDynamicParameters(string path) { 
     689                        return null; 
     690                } 
     691 
     692                #endregion 
     693 
    459694        } 
    460695