| /* |
| * 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.IO; |
| using System.Linq; |
| using System.Collections.Generic; |
| using Lucene.Net.Support; |
| |
| namespace Lucene.Net.Util |
| { |
| /// <summary> |
| /// The static accessor class for file paths used in testing. |
| /// </summary> |
| public static class Paths |
| { |
| private static string s_tempDirectory = null; |
| private static string s_testDocDirectory = null; |
| private static string s_assemblyDirectory = null; |
| private static string s_projectRootDirectory = null; |
| |
| /// <summary> |
| /// Gets the temp directory. |
| /// </summary> |
| /// <value> |
| /// The temp directory. |
| /// </value> |
| /// <remarks> |
| /// <para> |
| /// The temp directory first looks at the app settings for the &qt;tempDir&qt; |
| /// key. If the path does not exists or the setting is empty, the temp directory |
| /// fall back to using the environment's temp directory path and |
| /// append &qt;lucene-net&qt; to it. |
| /// </para> |
| /// </remarks> |
| public static string TempDirectory |
| { |
| get |
| { |
| if (s_tempDirectory == null) |
| { |
| |
| string tempDirectory = AppSettings.Get("tempDir", ""); |
| |
| if (string.IsNullOrEmpty(tempDirectory) || |
| !Directory.Exists(tempDirectory)) |
| { |
| tempDirectory = CombinePath(Path.GetTempPath(), "lucene-net"); |
| |
| if (!Directory.Exists(tempDirectory)) |
| Directory.CreateDirectory(tempDirectory); |
| |
| } |
| s_tempDirectory = tempDirectory; |
| } |
| |
| return s_tempDirectory; |
| } |
| } |
| |
| /// <summary> |
| /// Gets the test document directory. |
| /// </summary> |
| /// <value> |
| /// The test document directory. |
| /// </value> |
| public static string TestDocDirectory |
| { |
| get |
| { |
| if (s_testDocDirectory == null) |
| { |
| s_testDocDirectory = CombinePath(TempDirectory, "TestDoc"); |
| } |
| return s_testDocDirectory; |
| } |
| } |
| |
| /// <summary> |
| /// Gets the directory where the compiled assembly Lucene.Net.Tests is found. |
| /// We use Assembly.CodeBase in case NUnit or the current test runner |
| /// has shadow copy enabled. |
| /// </summary> |
| public static string AssemblyDirectory |
| { |
| get |
| { |
| if (s_assemblyDirectory == null) |
| { |
| // CodeBase uses unc path, get rid of the file prefix if it exists. |
| // File prefix could be file:// or file:/// |
| var assemblyDirectoryUri = new Uri(typeof(Paths).Assembly.CodeBase); |
| s_assemblyDirectory = Path.GetDirectoryName(assemblyDirectoryUri.LocalPath); |
| } |
| return s_assemblyDirectory; |
| } |
| } |
| |
| /// <summary> |
| /// Gets the root directory for the project. e.g. if you were working on trunk |
| /// it would be the trunk directory. |
| /// </summary> |
| public static string ProjectRootDirectory |
| { |
| get |
| { |
| if (s_projectRootDirectory == null) |
| { |
| // we currently assume that the assembly's directory is root/bin/[Section]/[Build] |
| // where [Section] is either core, demo, or contrib, and [Build] is either Debug or Release. |
| string assemblyLocation = AssemblyDirectory; |
| int index = -1; |
| if (assemblyLocation.IndexOf("build") > -1) |
| index = assemblyLocation.IndexOf(Path.DirectorySeparatorChar + "build" + Path.DirectorySeparatorChar); |
| else |
| index = assemblyLocation.IndexOf(Path.DirectorySeparatorChar + "bin" + Path.DirectorySeparatorChar); |
| |
| int difference = assemblyLocation.Substring(index).Count(o => o == Path.DirectorySeparatorChar); |
| |
| var list = new List<string>(); |
| |
| for (int i = 0; i < difference; i++) |
| list.Add(".."); |
| |
| var parameters = list.ToArray(); |
| |
| s_projectRootDirectory = Path.GetFullPath(CombinePath(assemblyLocation, parameters)); |
| |
| //TODO: remove |
| Console.WriteLine(s_projectRootDirectory); |
| } |
| return s_projectRootDirectory; |
| } |
| |
| } |
| |
| /// <summary> |
| /// Combines the path. |
| /// </summary> |
| /// <returns> |
| /// The path. |
| /// </returns> |
| /// <param name='startSegment'> |
| /// Start segment of the path. |
| /// </param> |
| /// <param name='segments'> |
| /// Path segments e.g. directory or file names. |
| /// </param> |
| /// <exception cref='ArgumentNullException'> |
| /// Is thrown when an argument passed to a method is invalid because it is <see langword="null" /> . |
| /// </exception> |
| /// <exception cref='InvalidOperationException'> |
| /// Is thrown when an operation cannot be performed. |
| /// </exception> |
| internal static string CombinePath(string startSegment, params string[] segments) |
| { |
| if (startSegment == null) |
| throw new ArgumentNullException(startSegment); |
| |
| if (segments == null || segments.Length == 0) |
| throw new InvalidOperationException("Paths can not be combined" + |
| " unless the startSegment and one additional segment is present."); |
| |
| string path = startSegment; |
| |
| foreach (string segment in segments) |
| path = System.IO.Path.Combine(path, segment); |
| |
| return path; |
| } |
| } |
| } |