/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package org.dlect.provider.loader;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Lists;
import java.util.List;
import java.util.concurrent.ExecutionException;
import org.dlect.file.FileController;
import org.dlect.helper.Conditions;
import org.dlect.model.Database;
import org.dlect.provider.Provider;
import org.dlect.provider.WrappedProvider;
import org.dlect.provider.impl.au.uniQld.UQProviderDetailBuilder;
import org.dlect.provider.impl.test.TestProviderDetailBuilder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
*
* @author lee
*/
public class ProviderLoader {
private static final Logger LOGGER = LoggerFactory.getLogger(ProviderLoader.class);
public static final List<Class<? extends ProviderDetailBuilder>> PROVIDERS = ImmutableList
.<Class<? extends ProviderDetailBuilder>>builder()
// .add(TestProviderDetailBuilder.class)
.add(UQProviderDetailBuilder.class)
.build();
public List<ProviderDetail> getProviders() {
List<ProviderDetail> details = Lists.newArrayList();
for (Class<? extends ProviderDetailBuilder> c : PROVIDERS) {
try {
ProviderDetailBuilder i = c.newInstance();
ProviderDetail pd = i.getProviderDetail();
if (pd != null) {
details.add(pd);
} else {
LOGGER.error("Null details returned from class: " + c + "; instance: " + i);
}
} catch (InstantiationException | IllegalAccessException ex) {
LOGGER.error("Failed to load class " + c, ex);
}
}
return details;
}
public WrappedProvider loadProvider(ProviderDetail pd, Database d, FileController fc) throws ExecutionException {
Conditions.checkNonNull(pd, "Provider Detail");
Conditions.checkNonNull(d, "Database");
Conditions.checkNonNull(fc, "File Controller");
try {
Provider p = pd.getProviderClass().newInstance();
WrappedProvider wp = new WrappedProvider(p, d, fc);
return wp;
} catch (InstantiationException | IllegalAccessException ex) {
LOGGER.error("Failed to create new provider of class " + pd.getProviderClass(), ex);
throw new ExecutionException("Provider breached contract. Exception thrown on construction", ex);
}
}
}