Repository: reef Updated Branches: refs/heads/master 928a043fb -> 67894d51b
[REEF-1080] Add ITempFileCreator * Add ITempFileCreator interface and WorkingDirectoryTempFileCreator similar as Java did without creating File object as it doesn't make sense in C# * Add WorkingDirectoryTempFileConfigModule and WorkingDirectoryTempFileConfigProvider * Add ITempFileCreator as a parameter of FileSystemInputPartition injectable constructor * Add and modifies test cases JIRA: [REEF-1080](https://issues.apache.org/jira/browse/REEF-1080) Pull Request: This closes #742 Project: http://git-wip-us.apache.org/repos/asf/reef/repo Commit: http://git-wip-us.apache.org/repos/asf/reef/commit/67894d51 Tree: http://git-wip-us.apache.org/repos/asf/reef/tree/67894d51 Diff: http://git-wip-us.apache.org/repos/asf/reef/diff/67894d51 Branch: refs/heads/master Commit: 67894d51b25fb84afa26374620741951f4ac17e0 Parents: 928a043 Author: Julia Wang <[email protected]> Authored: Thu Dec 17 14:37:58 2015 -0800 Committer: Markus Weimer <[email protected]> Committed: Wed Jan 6 10:35:27 2016 -0800 ---------------------------------------------------------------------- .../Org.Apache.REEF.IO.Tests.csproj | 3 +- .../TestFilePartitionInputDataSet.cs | 46 +++++++++++ .../TestTempFolderCreator.cs | 78 ++++++++++++++++++ .../Org.Apache.REEF.IO.csproj | 8 +- .../FileSystem/FileSystemInputPartition.cs | 10 ++- .../TempFileCreation/ITempFileCreator.cs | 46 +++++++++++ .../TempFileConfigurationModule.cs | 47 +++++++++++ .../TempFileConfigurationProvider.cs | 58 ++++++++++++++ .../TempFileCreation/TempFileCreator.cs | 84 ++++++++++++++++++++ .../TempFileCreation/TempFileFolder.cs | 31 ++++++++ 10 files changed, 406 insertions(+), 5 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/reef/blob/67894d51/lang/cs/Org.Apache.REEF.IO.Tests/Org.Apache.REEF.IO.Tests.csproj ---------------------------------------------------------------------- diff --git a/lang/cs/Org.Apache.REEF.IO.Tests/Org.Apache.REEF.IO.Tests.csproj b/lang/cs/Org.Apache.REEF.IO.Tests/Org.Apache.REEF.IO.Tests.csproj index fb5145b..5a6c3b6 100644 --- a/lang/cs/Org.Apache.REEF.IO.Tests/Org.Apache.REEF.IO.Tests.csproj +++ b/lang/cs/Org.Apache.REEF.IO.Tests/Org.Apache.REEF.IO.Tests.csproj @@ -78,6 +78,7 @@ under the License. <Compile Include="TestHadoopFileSystem.cs" /> <Compile Include="TestLocalFileSystem.cs" /> <Compile Include="TestRandomInputDataSet.cs" /> + <Compile Include="TestTempFolderCreator.cs" /> </ItemGroup> <ItemGroup> <ProjectReference Include="$(SolutionDir)\Org.Apache.REEF.Common\Org.Apache.REEF.Common.csproj"> @@ -118,4 +119,4 @@ under the License. <Error Condition="!Exists('$(SolutionDir)\packages\xunit.core.2.1.0\build\portable-net45+win8+wp8+wpa81\xunit.core.props')" Text="$([System.String]::Format('$(ErrorText)', '$(PackagesDir)\xunit.core.2.1.0\build\portable-net45+win8+wp8+wpa81\xunit.core.props'))" /> <Error Condition="!Exists('$(SolutionDir)\packages\xunit.runner.visualstudio.2.1.0\build\net20\xunit.runner.visualstudio.props')" Text="$([System.String]::Format('$(ErrorText)', '$(PackagesDir)\xunit.runner.visualstudio.2.1.0\build\net20\xunit.runner.visualstudio.props'))" /> </Target> -</Project> +</Project> \ No newline at end of file http://git-wip-us.apache.org/repos/asf/reef/blob/67894d51/lang/cs/Org.Apache.REEF.IO.Tests/TestFilePartitionInputDataSet.cs ---------------------------------------------------------------------- diff --git a/lang/cs/Org.Apache.REEF.IO.Tests/TestFilePartitionInputDataSet.cs b/lang/cs/Org.Apache.REEF.IO.Tests/TestFilePartitionInputDataSet.cs index df80e6d..24f8d47 100644 --- a/lang/cs/Org.Apache.REEF.IO.Tests/TestFilePartitionInputDataSet.cs +++ b/lang/cs/Org.Apache.REEF.IO.Tests/TestFilePartitionInputDataSet.cs @@ -25,6 +25,7 @@ using Microsoft.VisualStudio.TestTools.UnitTesting; using Org.Apache.REEF.IO.PartitionedData; using Org.Apache.REEF.IO.PartitionedData.FileSystem; using Org.Apache.REEF.IO.PartitionedData.FileSystem.Parameters; +using Org.Apache.REEF.IO.TempFileCreation; using Org.Apache.REEF.Tang.Annotations; using Org.Apache.REEF.Tang.Formats; using Org.Apache.REEF.Tang.Implementations.Tang; @@ -222,6 +223,51 @@ namespace Org.Apache.REEF.IO.Tests Assert.AreEqual(count, 5); } + /// <remarks> + /// This test is to test injected IPartition with TempFileFolerParameter + /// </remarks> + [TestMethod] + public void TestTempFileFolderWithRowDeserializer() + { + MakeLocalTestFile(sourceFilePath1, new byte[] { 111, 112, 113 }); + MakeLocalTestFile(sourceFilePath2, new byte[] { 114, 115 }); + + var c1 = FileSystemInputPartitionConfiguration<IEnumerable<Row>>.ConfigurationModule + .Set(FileSystemInputPartitionConfiguration<IEnumerable<Row>>.FilePathForPartitions, sourceFilePath1) + .Set(FileSystemInputPartitionConfiguration<IEnumerable<Row>>.FilePathForPartitions, sourceFilePath2) + .Set(FileSystemInputPartitionConfiguration<IEnumerable<Row>>.FileSerializerConfig, + GetRowSerializerConfigString()) + .Build(); + + var c2 = TempFileConfigurationModule.ConfigurationModule + .Set(TempFileConfigurationModule.TempFileFolerParameter, @".\test2\abc\") + .Build(); + + var dataSet = TangFactory.GetTang() + .NewInjector(c1) + .GetInstance<IPartitionedInputDataSet>(); + + int count = 0; + foreach (var partitionDescriptor in dataSet) + { + var partition = + TangFactory.GetTang() + .NewInjector(partitionDescriptor.GetPartitionConfiguration(), c2) + .GetInstance<IInputPartition<IEnumerable<Row>>>(); + using (partition as IDisposable) + { + IEnumerable<Row> e = partition.GetPartitionHandle(); + + foreach (var row in e) + { + Logger.Log(Level.Info, string.Format(CultureInfo.CurrentCulture, "Data read {0}: ", row.GetValue())); + count++; + } + } + } + Assert.AreEqual(count, 5); + } + private void MakeLocalTestFile(string filePath, byte[] bytes) { if (File.Exists(filePath)) http://git-wip-us.apache.org/repos/asf/reef/blob/67894d51/lang/cs/Org.Apache.REEF.IO.Tests/TestTempFolderCreator.cs ---------------------------------------------------------------------- diff --git a/lang/cs/Org.Apache.REEF.IO.Tests/TestTempFolderCreator.cs b/lang/cs/Org.Apache.REEF.IO.Tests/TestTempFolderCreator.cs new file mode 100644 index 0000000..4f1ae22 --- /dev/null +++ b/lang/cs/Org.Apache.REEF.IO.Tests/TestTempFolderCreator.cs @@ -0,0 +1,78 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +using System.IO; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using Org.Apache.REEF.IO.TempFileCreation; +using Org.Apache.REEF.Tang.Implementations.Tang; + +namespace Org.Apache.REEF.IO.Tests +{ + [TestClass] + public class TestTempFolderCreator + { + /// <summary> + /// This is to test default TempFileFolder and ITempFileCreator + /// </summary> + [TestMethod] + public void TestDefaultTempFolder() + { + var b = TempFileConfigurationModule.ConfigurationModule.Build(); + var i = TangFactory.GetTang().NewInjector(b); + var tempFileCreator = i.GetInstance<ITempFileCreator>(); + var f1 = tempFileCreator.GetTempFileName(); + var f2 = (string)i.GetNamedInstance(typeof(TempFileFolder)); + var f = Path.GetFullPath(f2); + Assert.IsTrue(f1.StartsWith(f)); + } + + /// <summary> + /// This is to test setting a value to TempFileFolder + /// </summary> + [TestMethod] + public void TestTempFileFolerParameter() + { + var b = TempFileConfigurationModule.ConfigurationModule + .Set(TempFileConfigurationModule.TempFileFolerParameter, @".\test1\abc\") + .Build(); + var i = TangFactory.GetTang().NewInjector(b); + var tempFileCreator = i.GetInstance<ITempFileCreator>(); + var f1 = tempFileCreator.GetTempFileName(); + var f2 = (string)i.GetNamedInstance(typeof(TempFileFolder)); + var f = Path.GetFullPath(f2); + Assert.IsTrue(f1.StartsWith(f)); + } + + /// <summary> + /// This is to test CreateTempDirectory() by providing a subfolder + /// </summary> + [TestMethod] + public void TestCreateTempFileFoler() + { + var b = TempFileConfigurationModule.ConfigurationModule + .Set(TempFileConfigurationModule.TempFileFolerParameter, @"./test1/abc/") + .Build(); + var i = TangFactory.GetTang().NewInjector(b); + var tempFileCreator = i.GetInstance<ITempFileCreator>(); + var f1 = tempFileCreator.CreateTempDirectory("ddd\\fff"); + var f3 = tempFileCreator.CreateTempDirectory("ddd\\fff", "bbb"); + var f2 = Path.GetFullPath(@"./test1/abc/" + "ddd\\fff"); + Assert.IsTrue(f1.StartsWith(f2)); + Assert.IsTrue(f3.EndsWith("bbb")); + } + } +} http://git-wip-us.apache.org/repos/asf/reef/blob/67894d51/lang/cs/Org.Apache.REEF.IO/Org.Apache.REEF.IO.csproj ---------------------------------------------------------------------- diff --git a/lang/cs/Org.Apache.REEF.IO/Org.Apache.REEF.IO.csproj b/lang/cs/Org.Apache.REEF.IO/Org.Apache.REEF.IO.csproj index a67086c..f33d656 100644 --- a/lang/cs/Org.Apache.REEF.IO/Org.Apache.REEF.IO.csproj +++ b/lang/cs/Org.Apache.REEF.IO/Org.Apache.REEF.IO.csproj @@ -117,6 +117,11 @@ under the License. <Compile Include="PartitionedData\Random\RandomInputPartition.cs" /> <Compile Include="PartitionedData\Random\RandomInputPartitionDescriptor.cs" /> <Compile Include="Properties\AssemblyInfo.cs" /> + <Compile Include="TempFileCreation\ITempFileCreator.cs" /> + <Compile Include="TempFileCreation\TempFileFolder.cs" /> + <Compile Include="TempFileCreation\TempFileConfigurationModule.cs" /> + <Compile Include="TempFileCreation\TempFileConfigurationProvider.cs" /> + <Compile Include="TempFileCreation\TempFileCreator.cs" /> </ItemGroup> <ItemGroup> <None Include="Org.Apache.REEF.IO.nuspec" /> @@ -141,4 +146,5 @@ under the License. <ItemGroup> <WCFMetadata Include="Service References\" /> </ItemGroup> -</Project> + <ItemGroup /> +</Project> \ No newline at end of file http://git-wip-us.apache.org/repos/asf/reef/blob/67894d51/lang/cs/Org.Apache.REEF.IO/PartitionedData/FileSystem/FileSystemInputPartition.cs ---------------------------------------------------------------------- diff --git a/lang/cs/Org.Apache.REEF.IO/PartitionedData/FileSystem/FileSystemInputPartition.cs b/lang/cs/Org.Apache.REEF.IO/PartitionedData/FileSystem/FileSystemInputPartition.cs index 76cb128..1edf11f 100644 --- a/lang/cs/Org.Apache.REEF.IO/PartitionedData/FileSystem/FileSystemInputPartition.cs +++ b/lang/cs/Org.Apache.REEF.IO/PartitionedData/FileSystem/FileSystemInputPartition.cs @@ -24,6 +24,7 @@ using System.IO; using Org.Apache.REEF.IO.FileSystem; using Org.Apache.REEF.IO.PartitionedData.FileSystem.Parameters; using Org.Apache.REEF.IO.PartitionedData.Random.Parameters; +using Org.Apache.REEF.IO.TempFileCreation; using Org.Apache.REEF.Tang.Annotations; using Org.Apache.REEF.Utilities.Diagnostics; using Org.Apache.REEF.Utilities.Logging; @@ -41,17 +42,20 @@ namespace Org.Apache.REEF.IO.PartitionedData.FileSystem private bool _isInitialized; private readonly object _lock = new object(); private string _localFileFolder; + private readonly ITempFileCreator _tempFileCreator; [Inject] private FileSystemInputPartition([Parameter(typeof(PartitionId))] string id, [Parameter(typeof(FilePathsInInputPartition))] ISet<string> filePaths, IFileSystem fileSystem, + ITempFileCreator tempFileCreator, IFileDeSerializer<T> fileSerializer) { _id = id; _fileSystem = fileSystem; _fileSerializer = fileSerializer; _filePaths = filePaths; + _tempFileCreator = tempFileCreator; _isInitialized = false; } @@ -89,8 +93,8 @@ namespace Org.Apache.REEF.IO.PartitionedData.FileSystem private void CopyFromRemote() { - _localFileFolder = Path.GetTempPath() + "-partition-" + Guid.NewGuid().ToString("N").Substring(0, 8); - Directory.CreateDirectory(_localFileFolder); + _localFileFolder = _tempFileCreator.CreateTempDirectory("-partition-"); + Logger.Log(Level.Info, string.Format(CultureInfo.CurrentCulture, "Local file temp folder: {0}", _localFileFolder)); foreach (var sourceFilePath in _filePaths) { @@ -103,7 +107,7 @@ namespace Org.Apache.REEF.IO.PartitionedData.FileSystem } var localFilePath = _localFileFolder + "\\" + Guid.NewGuid().ToString("N").Substring(0, 8); - Logger.Log(Level.Info, string.Format(CultureInfo.CurrentCulture, "localFilePath {0}: ", localFilePath)); + Logger.Log(Level.Info, string.Format(CultureInfo.CurrentCulture, "LocalFilePath {0}: ", localFilePath)); if (File.Exists(localFilePath)) { File.Delete(localFilePath); http://git-wip-us.apache.org/repos/asf/reef/blob/67894d51/lang/cs/Org.Apache.REEF.IO/TempFileCreation/ITempFileCreator.cs ---------------------------------------------------------------------- diff --git a/lang/cs/Org.Apache.REEF.IO/TempFileCreation/ITempFileCreator.cs b/lang/cs/Org.Apache.REEF.IO/TempFileCreation/ITempFileCreator.cs new file mode 100644 index 0000000..f0b348c --- /dev/null +++ b/lang/cs/Org.Apache.REEF.IO/TempFileCreation/ITempFileCreator.cs @@ -0,0 +1,46 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +using Org.Apache.REEF.Tang.Annotations; + +namespace Org.Apache.REEF.IO.TempFileCreation +{ + /// <summary> + /// Provide interface to wrap temp file folder and temp file folder creation + /// </summary> + [DefaultImplementation(typeof(TempFileCreator))] + public interface ITempFileCreator + { + /// <summary> + /// Return the full path of a temp file name + /// </summary> + /// <param name="prefix"></param> + /// <param name="suffix"></param> + /// <returns></returns> + string GetTempFileName(string prefix = "", string suffix = ""); + + /// <summary> + /// Create a temp folder with given prefix and suffix as part of the name + /// </summary> + /// <param name="prefix"></param> + /// <param name="suffix"></param> + /// <returns></returns> + string CreateTempDirectory(string prefix = "", string suffix = ""); + } +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/reef/blob/67894d51/lang/cs/Org.Apache.REEF.IO/TempFileCreation/TempFileConfigurationModule.cs ---------------------------------------------------------------------- diff --git a/lang/cs/Org.Apache.REEF.IO/TempFileCreation/TempFileConfigurationModule.cs b/lang/cs/Org.Apache.REEF.IO/TempFileCreation/TempFileConfigurationModule.cs new file mode 100644 index 0000000..b915ab5 --- /dev/null +++ b/lang/cs/Org.Apache.REEF.IO/TempFileCreation/TempFileConfigurationModule.cs @@ -0,0 +1,47 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +using Org.Apache.REEF.Common.Client.Parameters; +using Org.Apache.REEF.Tang.Formats; +using Org.Apache.REEF.Tang.Interface; +using Org.Apache.REEF.Tang.Util; + +namespace Org.Apache.REEF.IO.TempFileCreation +{ + /// <summary> + /// Configuration Module for TempFileCreator. + /// </summary> + public sealed class TempFileConfigurationModule : ConfigurationModuleBuilder + { + /// <summary> + /// Temp file folder optional parameter. The default is @"./reef/tmp/" set in TempFileFolder class. + /// </summary> + public static readonly OptionalParameter<string> TempFileFolerParameter = new OptionalParameter<string>(); + + /// <summary> + /// It binds TempFileConfigurationProvider to DriverConfigurationProviders so that the configuration is set for + /// Driver configuration automatically. TempFileFolerParameter is set as an optional parameter for TempFileFolder. + /// </summary> + public static readonly ConfigurationModule ConfigurationModule = new TempFileConfigurationModule() + .BindSetEntry<DriverConfigurationProviders, TempFileConfigurationProvider, IConfigurationProvider>( + GenericType<DriverConfigurationProviders>.Class, GenericType<TempFileConfigurationProvider>.Class) + .BindNamedParameter(GenericType<TempFileFolder>.Class, TempFileFolerParameter) + .Build(); + } +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/reef/blob/67894d51/lang/cs/Org.Apache.REEF.IO/TempFileCreation/TempFileConfigurationProvider.cs ---------------------------------------------------------------------- diff --git a/lang/cs/Org.Apache.REEF.IO/TempFileCreation/TempFileConfigurationProvider.cs b/lang/cs/Org.Apache.REEF.IO/TempFileCreation/TempFileConfigurationProvider.cs new file mode 100644 index 0000000..e8222ea --- /dev/null +++ b/lang/cs/Org.Apache.REEF.IO/TempFileCreation/TempFileConfigurationProvider.cs @@ -0,0 +1,58 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +using Org.Apache.REEF.Common.Evaluator.Parameters; +using Org.Apache.REEF.Tang.Annotations; +using Org.Apache.REEF.Tang.Implementations.Tang; +using Org.Apache.REEF.Tang.Interface; +using Org.Apache.REEF.Tang.Util; + +namespace Org.Apache.REEF.IO.TempFileCreation +{ + /// <summary> + /// A configuration provider for tem file + /// </summary> + internal sealed class TempFileConfigurationProvider : IConfigurationProvider + { + private readonly IConfiguration _configuration; + + /// <summary> + /// Create configuration for for temp file + /// </summary> + /// <param name="tempFileFolder"></param> + [Inject] + private TempFileConfigurationProvider([Parameter(typeof(TempFileFolder))] string tempFileFolder) + { + _configuration = TangFactory.GetTang().NewConfigurationBuilder() + .BindImplementation(GenericType<ITempFileCreator>.Class, GenericType<TempFileCreator>.Class) + .BindStringNamedParam<TempFileFolder>(tempFileFolder) + .BindSetEntry<EvaluatorConfigurationProviders, TempFileConfigurationProvider, IConfigurationProvider>() + .Build(); + } + + /// <summary> + /// Returns temp file configuration + /// </summary> + /// <returns></returns> + IConfiguration IConfigurationProvider.GetConfiguration() + { + return _configuration; + } + } +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/reef/blob/67894d51/lang/cs/Org.Apache.REEF.IO/TempFileCreation/TempFileCreator.cs ---------------------------------------------------------------------- diff --git a/lang/cs/Org.Apache.REEF.IO/TempFileCreation/TempFileCreator.cs b/lang/cs/Org.Apache.REEF.IO/TempFileCreation/TempFileCreator.cs new file mode 100644 index 0000000..c68d3e7 --- /dev/null +++ b/lang/cs/Org.Apache.REEF.IO/TempFileCreation/TempFileCreator.cs @@ -0,0 +1,84 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +using System; +using System.Globalization; +using System.IO; +using Org.Apache.REEF.Tang.Annotations; +using Org.Apache.REEF.Utilities.Logging; + +namespace Org.Apache.REEF.IO.TempFileCreation +{ + /// <summary> + /// This class that wraps yemp file folder and provides an implementation of temp file folder creation + /// </summary> + internal sealed class TempFileCreator : ITempFileCreator + { + private static readonly Logger Logger = Logger.GetLogger(typeof(TempFileCreator)); + + private readonly string _tempFileFolder; + + /// <summary> + /// Create a file folder for given tempFileFolder name + /// </summary> + /// <param name="tempFileFolder"></param> + [Inject] + private TempFileCreator( + [Parameter(typeof(TempFileFolder))] string tempFileFolder) + { + _tempFileFolder = tempFileFolder; + if (!Directory.Exists(_tempFileFolder)) + { + Directory.CreateDirectory(Path.GetFullPath(tempFileFolder)); + } + Logger.Log(Level.Verbose, string.Format(CultureInfo.CurrentCulture, "Temp directory: {0} is created", Path.GetFullPath(tempFileFolder))); + } + + /// <summary> + /// Return a full path of a temp file name with a radom generated file name wraped with prefix and suffix + /// and the temp folder as the file folder + /// </summary> + /// <param name="prefix"></param> + /// <param name="suffix"></param> + /// <returns></returns> + public string GetTempFileName(string prefix, string suffix) + { + return Path.GetFullPath(Path.Combine(_tempFileFolder, prefix + Guid.NewGuid().ToString("N").Substring(0, 8) + suffix)); + } + + /// <summary> + /// Create a unique subfolder under the _tempFileFolder with given prefix and suffix + /// </summary> + /// <param name="prefix"></param> + /// <param name="suffix"></param> + /// <returns></returns> + public string CreateTempDirectory(string prefix, string suffix) + { + string fullPathOfSubFolder = GetTempFileName(prefix, suffix); + if (!Directory.Exists(fullPathOfSubFolder)) + { + Directory.CreateDirectory(fullPathOfSubFolder); + } + + Logger.Log(Level.Verbose, string.Format(CultureInfo.CurrentCulture, "Temp directory: {0} is created", fullPathOfSubFolder)); + + return fullPathOfSubFolder; + } + } +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/reef/blob/67894d51/lang/cs/Org.Apache.REEF.IO/TempFileCreation/TempFileFolder.cs ---------------------------------------------------------------------- diff --git a/lang/cs/Org.Apache.REEF.IO/TempFileCreation/TempFileFolder.cs b/lang/cs/Org.Apache.REEF.IO/TempFileCreation/TempFileFolder.cs new file mode 100644 index 0000000..ace5f0c --- /dev/null +++ b/lang/cs/Org.Apache.REEF.IO/TempFileCreation/TempFileFolder.cs @@ -0,0 +1,31 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +using Org.Apache.REEF.Tang.Annotations; + +namespace Org.Apache.REEF.IO.TempFileCreation +{ + /// <summary> + /// Folder for local temp file + /// </summary> + [NamedParameter("TempFileFolder", "TempFileFolder", @"./reef/tmp/")] + public sealed class TempFileFolder : Name<string> + { + } +} \ No newline at end of file
