/*
* 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.base.Objects;
import java.lang.reflect.Constructor;
import java.lang.reflect.Modifier;
import org.dlect.provider.Provider;
/**
*
* @author lee
*/
public final class ProviderDetail {
private final String name;
private final String code;
private final Class<? extends Provider> providerClass;
public ProviderDetail(String name, String code, Class<? extends Provider> providerClass) {
if (name == null) {
throw new IllegalArgumentException("Name is null");
}
if (code == null) {
throw new IllegalArgumentException("Code is null");
}
if (providerClass == null) {
throw new IllegalArgumentException("Provider Class is null");
}
validateProviderClass(providerClass);
this.name = name;
this.code = code;
this.providerClass = providerClass;
}
public String getName() {
return name;
}
public String getCode() {
return code;
}
public Class<? extends Provider> getProviderClass() {
return providerClass;
}
@Override
public String toString() {
return "ProviderDetail{" + "name=" + name + ", code=" + code + ", providerClass=" + providerClass + '}';
}
@Override
public int hashCode() {
return Objects.hashCode(this.code);
}
@Override
public boolean equals(Object obj) {
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
final ProviderDetail other = (ProviderDetail) obj;
return Objects.equal(other.getCode(), this.getCode());
}
public static void validateProviderClass(Class<? extends Provider> providerClass) {
int cModifiers = providerClass.getModifiers();
if (Modifier.isAbstract(cModifiers)) {
throw new IllegalArgumentException("Attempting to make an abstract class a provider.");
}
if (Modifier.isInterface(cModifiers)) {
throw new IllegalArgumentException("Attempting to make an interface class a provider.");
}
if (!Provider.class.isAssignableFrom(providerClass)) {
throw new IllegalArgumentException("The class goven is not a provider.");
}
try {
Constructor<? extends Provider> constructor = providerClass.getConstructor();
// TODO(Later) check that construction works.
} catch (NoSuchMethodException e) {
throw new IllegalArgumentException("Failed to find constructor with no arguments", e);
}
}
}