All Downloads are FREE. Search and download functionalities are using the official Maven repository.

net.amygdalum.testrecorder.profile.AbstractPathConfigurationLoader Maven / Gradle / Ivy

package net.amygdalum.testrecorder.profile;

import static java.nio.charset.StandardCharsets.UTF_8;
import static java.util.stream.Collectors.joining;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.URL;
import java.nio.file.FileSystemNotFoundException;
import java.nio.file.FileSystems;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Arrays;
import java.util.Collections;
import java.util.Objects;
import java.util.Optional;
import java.util.stream.Stream;

import net.amygdalum.testrecorder.util.Logger;

public abstract class AbstractPathConfigurationLoader implements ConfigurationLoader {

	protected ClassLoader loader;

	public AbstractPathConfigurationLoader(ClassLoader loader) {
		this.loader = loader;
	}

	protected  T logLoad(T object) {
		if (object != null) {
			Logger.info("loading " + object.getClass().getSimpleName());
		}
		return object;
	}

	protected  Stream configsFrom(Path path, Class clazz, Object[] args) throws IOException {
		return new BufferedReader(new InputStreamReader(Files.newInputStream(path), UTF_8)).lines()
			.map(line -> line.trim())
			.filter(line -> !line.isEmpty())
			.map(name -> configFrom(name, clazz, args))
			.filter(Objects::nonNull);

	}

	protected  T configFrom(String name, Class superClazz, Object[] args) {
		try {
			Class clazz = loader.loadClass(name);
			Optional> constructor = Arrays.stream(clazz.getConstructors())
				.filter(c -> matches(c, args))
				.findFirst();
			if (constructor.isPresent()) {
				return superClazz.cast(constructor.get().newInstance(args));
			} else {
				Logger.error("failed loading " + clazz.getName() + " because no constructor matching "
					+ Arrays.stream(args).map(arg -> arg == null ? "null" : arg.getClass().getSimpleName()).collect(joining(", ", "(", ")"))
					+ ", skipping");
				return null;
			}
		} catch (ClassNotFoundException e) {
			Logger.error("failed loading " + name + " from classpath, skipping");
			return null;
		} catch (ClassCastException e) {
			Logger.error("loaded class " + name + " is not a subclass of " + superClazz.getSimpleName() + ", skipping");
			return null;
		} catch (InvocationTargetException | InstantiationException | IllegalArgumentException | IllegalAccessException e) {
			Logger.error("failed instantiating " + name + ": ", e);
			return null;
		}
	}

	protected Path pathFrom(URL url) throws IOException {
		try {
			URI uri = url.toURI();
			try {
				return Paths.get(uri);
			} catch (FileSystemNotFoundException e) {
				FileSystems.newFileSystem(uri, Collections.singletonMap("create", "true"));
				return Paths.get(uri);
			}
		} catch (URISyntaxException e) {
			throw new IOException(e);
		}
	}

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy