package org.apache.lucene.util; import java.lang.reflect.Constructor; import java.lang.reflect.UndeclaredThrowableException; public final class AttributeFactoryHelpers { static final AttributeFactory DEFAULT = new DefaultAttributeFactory(); static final Constructor findAttributeImplCtor(Class clazz) { try { return clazz.getConstructor(); } catch (NoSuchMethodException e) { throw new IllegalArgumentException("Cannot lookup accessible no-arg constructor for: " + clazz.getName(), e); } } static final class DefaultAttributeFactory extends AttributeFactory { private final ClassValue> constructors = new ClassValue>() { @Override protected Constructor computeValue(Class attClass) { return AttributeFactoryHelpers.findAttributeImplCtor(findImplClass(attClass.asSubclass(Attribute.class))); } }; DefaultAttributeFactory() {} @Override public AttributeImpl createAttributeInstance(Class attClass) { try { return constructors.get(attClass).newInstance(); } catch (Error | RuntimeException e) { throw e; } catch (Throwable e) { throw new UndeclaredThrowableException(e); } } private Class findImplClass(Class attClass) { try { return Class.forName(attClass.getName() + "Impl", true, attClass.getClassLoader()).asSubclass(AttributeImpl.class); } catch (ClassNotFoundException cnfe) { throw new IllegalArgumentException("Cannot find implementing class for: " + attClass.getName()); } } } public static AttributeFactory getStaticImplementation(AttributeFactory delegate, Class clazz) { final Constructor constr = AttributeFactoryHelpers.findAttributeImplCtor(clazz); return new AttributeFactory.StaticImplementationAttributeFactory(delegate, clazz) { @Override protected A createInstance() { try { return (A) constr.newInstance(); } catch (Error | RuntimeException e) { throw e; } catch (Throwable e) { throw new UndeclaredThrowableException(e); } } }; } }