package com.brightgenerous.injection;
import com.brightgenerous.lang.Args;
public class PackageImplResolver implements ImplResolver {
private static final long serialVersionUID = 3749055882136431301L;
private final Class<?> clazz;
private volatile boolean loaded;
private volatile String pkgName;
//
// ( ',_>`).oO( it is recommended that to use this, instead of #PackageGenerateImplResolver(Package).
//
public PackageImplResolver(Class<?> clazz) {
Args.notNull(clazz, "clazz");
this.clazz = clazz;
}
//
// ( ',_>`).oO( it would be troublesome that should prepare the Package instance..., Surely not ?
//
@Deprecated
public PackageImplResolver(Package pkg) {
Args.notNull(pkg, "pkg");
clazz = null;
pkgName = getPackageName(pkg);
loaded = true;
}
@Override
public <T> Class<? extends T> getImplClass(Class<T> clazz) {
if (clazz == null) {
return null;
}
String pkgName = getPackageName();
if (pkgName == null) {
return null;
}
String pName = getPackageName(clazz);
if (pName == null) {
return null;
}
try {
return (Class<? extends T>) Class.forName(clazz.getName().replace(pName, pkgName));
} catch (ClassNotFoundException e) {
throw new RuntimeException(e);
}
}
protected String getPackageName() {
if (!loaded) {
synchronized (this) {
if (!loaded) {
pkgName = getPackageName(clazz);
loaded = true;
}
}
}
return pkgName;
}
protected String getPackageName(Class<?> clazz) {
if (clazz == null) {
return null;
}
return getPackageName(clazz.getPackage());
}
protected String getPackageName(Package pkg) {
if (pkg == null) {
return null;
}
return pkg.getName();
}
}