blob: bf7367b818d4cf65fdcb69c5f75163b82d21f964 [file] [log] [blame]
using System;
using System.IO;
using System.Reflection;
namespace Lucene.Net.Util
{
/*
* 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 Directory = Lucene.Net.Store.Directory;
using FSDirectory = Lucene.Net.Store.FSDirectory;
/// <summary>
/// Class containing some useful methods used by command line tools
/// </summary>
public static class CommandLineUtil // LUCENENET specific - made static
{
/// <summary>
/// Creates a specific <see cref="FSDirectory"/> instance starting from its class name. </summary>
/// <param name="clazzName"> The name of the <see cref="FSDirectory"/> class to load. </param>
/// <param name="dir"> The <see cref="DirectoryInfo"/> to be used as parameter constructor. </param>
/// <returns> The new <see cref="FSDirectory"/> instance </returns>
public static FSDirectory NewFSDirectory(string clazzName, DirectoryInfo dir)
{
try
{
Type clazz = LoadFSDirectoryClass(clazzName);
return NewFSDirectory(clazz, dir);
}
catch (TypeLoadException e)
{
throw new ArgumentException(typeof(FSDirectory).Name + " implementation not found: " + clazzName, e);
}
catch (InvalidCastException e)
{
throw new ArgumentException(clazzName + " is not a " + typeof(FSDirectory).Name + " implementation", e);
}
catch (MissingMethodException e)
{
throw new ArgumentException(clazzName + " constructor with " + typeof(FileInfo).Name + " as parameter not found", e);
}
catch (Exception e)
{
throw new ArgumentException("Error creating " + clazzName + " instance", e);
}
}
/// <summary>
/// Loads a specific <see cref="Directory"/> implementation. </summary>
/// <param name="clazzName"> The name of the <see cref="Directory"/> class to load. </param>
/// <returns> The <see cref="Directory"/> class loaded. </returns>
/// <exception cref="TypeLoadException"> If the specified class cannot be found. </exception>
public static Type LoadDirectoryClass(string clazzName)
{
return Type.GetType(AdjustDirectoryClassName(clazzName));
}
/// <summary>
/// Loads a specific <see cref="FSDirectory"/> implementation. </summary>
/// <param name="clazzName"> The name of the <see cref="FSDirectory"/> class to load. </param>
/// <returns> The <see cref="FSDirectory"/> class loaded. </returns>
/// <exception cref="TypeLoadException"> If the specified class cannot be found. </exception>
public static Type LoadFSDirectoryClass(string clazzName)
{
return Type.GetType(AdjustDirectoryClassName(clazzName));
}
private static string AdjustDirectoryClassName(string clazzName)
{
if (clazzName == null || clazzName.Trim().Length == 0)
{
throw new ArgumentException("The " + typeof(FSDirectory).Name + " implementation cannot be null or empty");
}
// LUCENENET specific: Changed to use char rather than string so we get StringComparison.Ordinal,
// otherwise this could fail on some operating systems in certain cultures.
if (clazzName.IndexOf('.') == -1) // if not fully qualified, assume .store
{
// LUCENENET NOTE: .NET expects the type to be in the currently executing assembly or mscorlib
// if not fully qualified. This fails on macOS if called from LuceneTestCase.NewFSDirectory() without the AssemblyQualifiedName.
clazzName = typeof(Directory).AssemblyQualifiedName.Replace(nameof(Directory), clazzName);
}
return clazzName;
}
/// <summary>
/// Creates a new specific <see cref="FSDirectory"/> instance. </summary>
/// <param name="clazz"> The class of the object to be created </param>
/// <param name="dir"> The <see cref="DirectoryInfo"/> to be used as parameter constructor </param>
/// <returns> The new <see cref="FSDirectory"/> instance. </returns>
/// <exception cref="MissingMethodException"> If the <see cref="Directory"/> does not have a constructor that takes <see cref="DirectoryInfo"/>. </exception>
/// <exception cref="MemberAccessException"> If the class is abstract or an interface. </exception>
/// <exception cref="TypeLoadException"> If the constructor does not have public visibility. </exception>
/// <exception cref="TargetInvocationException"> If the constructor throws an exception </exception>
public static FSDirectory NewFSDirectory(Type clazz, DirectoryInfo dir)
{
// Assuming every FSDirectory has a ctor(File):
//Constructor<?> ctor = clazz.GetConstructor(typeof(File));
return (FSDirectory)Activator.CreateInstance(clazz, dir);
}
}
}