package org.kevoree.tools.aether.framework.android;
import org.kevoree.DeployUnit;
import org.kevoree.api.service.core.classloading.DeployUnitResolver;
import org.kevoree.kcl.KevoreeJarClassLoader;
import org.kevoree.log.Log;
import org.kevoree.tools.aether.framework.AetherUtil;
import org.kevoree.tools.aether.framework.JCLContextHandler;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
/**
* Created by duke on 25/07/13.
*/
public class AndroidJCLContextHandler extends JCLContextHandler {
private android.content.Context ctx;
private ClassLoader parent;
public AndroidJCLContextHandler(android.content.Context ctx, ClassLoader parent) {
this.ctx = ctx;
this.parent = parent;
}
public KevoreeJarClassLoader installDeployUnitNoFileInternals(DeployUnit du) {
File resolvedFile = null;
for (DeployUnitResolver resolver : getResolvers()) {
try {
resolvedFile = resolver.resolve(du);
break;
} catch (Exception e) {
}
}
if (resolvedFile == null) {
resolvedFile = AetherUtil.instance$.resolveDeployUnit(du);
}
if (resolvedFile != null) {
return installDeployUnitInternals(du, resolvedFile);
} else {
Log.error("Error while resolving deploy unit " + du.getName());
return null;
}
}
@Override
public KevoreeJarClassLoader installDeployUnitInternals(DeployUnit du, File file) {
KevoreeJarClassLoader previousKCL = getKCLInternals(du);
KevoreeJarClassLoader res = null;
if (previousKCL != null) {
Log.debug("Take already installed {}", buildKEY(du));
res = previousKCL;
} else {
String cleankey = buildKEY(du).replace(File.separator, "_");
AndroidKevoreeJarClassLoader newcl = new AndroidKevoreeJarClassLoader(cleankey, ctx, parent);
newcl.setLazyLoad(false);
newcl.add(file.getAbsolutePath());
getKcl_cache().put(buildKEY(du), newcl);
getKcl_cache_file().put(buildKEY(du), file);
//TRY TO RECOVER FAILED LINK
//TRY TO RECOVER FAILED LINK
if (getFailedLinks().containsKey(buildKEY(du))) {
for (KevoreeJarClassLoader toLinkKCL : getFailedLinks().get(buildKEY(du))) {
toLinkKCL.addSubClassLoader(newcl);
newcl.addWeakClassLoader(toLinkKCL);
Log.debug("UnbreakLink " + du.getName() + "->" + toLinkKCL.getLoadedURLs().get(0));
}
getFailedLinks().remove(buildKEY(du));
Log.debug("Failed Link {} remain size : {}", du.getName(), getFailedLinks().size());
}
for (DeployUnit rLib : du.getRequiredLibs()) {
KevoreeJarClassLoader kcl = getKCLInternals(rLib);
if (kcl != null) {
newcl.addSubClassLoader(kcl);
kcl.addWeakClassLoader(newcl);
for (DeployUnit rLibIn : du.getRequiredLibs()) {
if (rLibIn != rLib) {
KevoreeJarClassLoader kcl2 = getKCLInternals(rLibIn);
if (kcl2 != null) {
kcl.addWeakClassLoader(kcl2);
}
}
}
} else {
Log.debug("Fail link ! Warning ");
List<KevoreeJarClassLoader> pendings = getFailedLinks().get(buildKEY(rLib));
if (pendings == null) {
pendings = new ArrayList<KevoreeJarClassLoader>();
getFailedLinks().put(buildKEY(rLib), pendings);
}
pendings.add(newcl);
}
}
res = newcl;
}
return res;
}
}