Skip to content

Commit

Permalink
refactor
Browse files Browse the repository at this point in the history
  • Loading branch information
straybirdzls committed Apr 10, 2018
1 parent 5f0fa59 commit b264291
Show file tree
Hide file tree
Showing 4 changed files with 209 additions and 95 deletions.
Expand Up @@ -27,6 +27,7 @@
import java.net.URL;
import java.net.URLClassLoader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Enumeration;
import java.util.List;

Expand Down Expand Up @@ -73,92 +74,42 @@ abstract protected Class<?> loadClassInternal(String name, boolean resolve)

@Override
public URL getResource(String name) {
if (StringUtils.isEmpty(name)) {
return null;
}
Handler.setUseFastConnectionExceptions(true);
try {
URL url;
// first find import resource
if (shouldFindExportedResource(name)) {
List<ClassLoader> exportResourceClassloadersInOrder = classloaderService
.findExportResourceClassloadersInOrder(name);
if (exportResourceClassloadersInOrder != null) {
for (ClassLoader exportResourceClassloader : exportResourceClassloadersInOrder) {
url = exportResourceClassloader.getResource(name);
if (url != null) {
return url;
}
}
}

}

url = super.getResource(name);

if (url != null) {
return url;
}

if (name.endsWith(CLASS_RESOURCE_SUFFIX)) {
url = findClassResource(name);
}

return url;

return getResourceInternal(name);
} finally {
Handler.setUseFastConnectionExceptions(false);
}
}

protected URL findClassResource(String resourceName) {
String className = transformClassName(resourceName);
if (shouldFindExportedClass(className)) {
ClassLoader classLoader = classloaderService.findExportClassloader(className);
return classLoader == null ? null : classLoader.getResource(resourceName);
}
return null;
}

private String transformClassName(String name) {
if (name.endsWith(CLASS_RESOURCE_SUFFIX)) {
name = name.substring(0, name.length() - CLASS_RESOURCE_SUFFIX.length());
}
return name.replace("/", ".");
}
/**
* Real logic to get resource,need to implement by Sub Classloader
* @param name
* @return
*/
abstract protected URL getResourceInternal(String name);

@Override
public Enumeration<URL> getResources(String name) throws IOException {
return getResources(name, true);
}

@SuppressWarnings("unchecked")
private Enumeration<URL> getResources(String name, boolean withExport) throws IOException {
Handler.setUseFastConnectionExceptions(true);
try {
Enumeration<URL> urlEnumeration = new UseFastConnectionExceptionsEnumeration(
super.getResources(name));

if (!withExport || !shouldFindExportedResource(name)) {
return urlEnumeration;
}

List<Enumeration<URL>> enumerationList = new ArrayList<>();
enumerationList.add(urlEnumeration);

List<ClassLoader> exportResourceClassloadersInOrder = classloaderService
.findExportResourceClassloadersInOrder(name);
if (exportResourceClassloadersInOrder != null) {
for (ClassLoader exportResourceClassloader : exportResourceClassloadersInOrder) {
enumerationList.add(((AbstractClasspathClassloader) exportResourceClassloader)
.getResources(name, false));
}
}

return new CompoundEnumeration<>(
enumerationList.toArray((Enumeration<URL>[]) new Enumeration<?>[0]));
return getResourcesInternal(name);
} finally {
Handler.setUseFastConnectionExceptions(false);
}
}

/**
* Real logic to get resources,need to implement by Sub Classloader
* @param name
* @return
* @throws IOException
*/
abstract protected Enumeration<URL> getResourcesInternal(String name) throws IOException;

/**
* Whether to find class that exported by other classloader
* @param className class name
Expand All @@ -174,37 +125,56 @@ private Enumeration<URL> getResources(String name, boolean withExport) throws IO
abstract boolean shouldFindExportedResource(String resourceName);

/**
* Load ark spi class
* Load JDK class
* @param name class name
* @return
*/
protected Class<?> resolveJDKClass(String name) {
try {
return classloaderService.getJDKClassloader().loadClass(name);
} catch (ClassNotFoundException e) {
// ignore
}
return null;
}

/**
* Load export class
* @param name
* @return
*/
protected Class<?> resolveArkClass(String name) {
if (classloaderService.isArkSpiClass(name)) {
try {
return classloaderService.getArkClassloader().loadClass(name);
} catch (ClassNotFoundException e) {
// ignore
protected Class<?> resolveExportClass(String name) {
if (shouldFindExportedClass(name)) {
ClassLoader importClassloader = classloaderService.findExportClassloader(name);
if (importClassloader != null) {
try {
return importClassloader.loadClass(name);
} catch (ClassNotFoundException e) {
// ignore
}
}
}
return null;
}

/**
* Load JDK class
* @param name class name
* Load ark spi class
* @param name
* @return
*/
protected Class<?> resolveJDKClass(String name) {
try {
return classloaderService.getJDKClassloader().loadClass(name);
} catch (ClassNotFoundException e) {
// ignore
protected Class<?> resolveArkClass(String name) {
if (classloaderService.isArkSpiClass(name)) {
try {
return classloaderService.getArkClassloader().loadClass(name);
} catch (ClassNotFoundException e) {
// ignore
}
}
return null;
}

/**
* Load biz classpath class
* Load classpath class
* @param name
* @return
*/
Expand Down Expand Up @@ -232,22 +202,85 @@ protected Class<?> resolveJavaAgentClass(String name) {
}

/**
* Load export class
* @param name
* Find export resource
* @param resourceName
* @return
*/
protected Class<?> resolveExportClass(String name) {
if (shouldFindExportedClass(name)) {
ClassLoader importClassloader = classloaderService.findExportClassloader(name);
if (importClassloader != null) {
try {
return importClassloader.loadClass(name);
} catch (ClassNotFoundException e) {
// ignore
protected URL getExportResource(String resourceName) {
if (shouldFindExportedResource(resourceName)) {
URL url;
List<ClassLoader> exportResourceClassloadersInOrder = classloaderService
.findExportResourceClassloadersInOrder(resourceName);
if (exportResourceClassloadersInOrder != null) {
for (ClassLoader exportResourceClassloader : exportResourceClassloadersInOrder) {
url = exportResourceClassloader.getResource(resourceName);
if (url != null) {
return url;
}
}
}

}
return null;
}

/**
* Find .class resource
* @param resourceName
* @return
*/
protected URL getClassResource(String resourceName) {
if (resourceName.endsWith(CLASS_RESOURCE_SUFFIX)) {
String className = transformClassName(resourceName);
if (shouldFindExportedClass(className)) {
ClassLoader classLoader = classloaderService.findExportClassloader(className);
return classLoader == null ? null : classLoader.getResource(resourceName);
}

}
return null;
}

/**
* Find local resource
* @param resourceName
* @return
*/
protected URL getLocalResource(String resourceName) {
return super.getResource(resourceName);
}

private String transformClassName(String name) {
if (name.endsWith(CLASS_RESOURCE_SUFFIX)) {
name = name.substring(0, name.length() - CLASS_RESOURCE_SUFFIX.length());
}
return name.replace("/", ".");
}

/**
* Find export resources
* @param resourceName
* @return
*/
protected Enumeration<URL> getExportResources(String resourceName) throws IOException {
if (shouldFindExportedResource(resourceName)) {
List<ClassLoader> exportResourceClassloadersInOrder = classloaderService
.findExportResourceClassloadersInOrder(resourceName);
if (exportResourceClassloadersInOrder != null) {
List<Enumeration<URL>> enumerationList = new ArrayList<>();
for (ClassLoader exportResourceClassloader : exportResourceClassloadersInOrder) {
enumerationList.add(((AbstractClasspathClassloader) exportResourceClassloader)
.getLocalResources(resourceName));
}
return new CompoundEnumeration<>(
enumerationList.toArray((Enumeration<URL>[]) new Enumeration<?>[0]));
}
}
return Collections.emptyEnumeration();
}

protected Enumeration<URL> getLocalResources(String resourceName) throws IOException {
return new UseFastConnectionExceptionsEnumeration(super.getResources(resourceName));
}

}
Expand Up @@ -17,7 +17,13 @@
package com.alipay.sofa.ark.container.service.classloader;

import com.alipay.sofa.ark.exception.ArkLoaderException;
import sun.misc.CompoundEnumeration;

import java.io.IOException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;

/**
* Ark Biz Classloader
Expand Down Expand Up @@ -85,6 +91,40 @@ protected Class<?> loadClassInternal(String name, boolean resolve) throws ArkLoa
bizName, name));
}

@SuppressWarnings("unchecked")
@Override
protected URL getResourceInternal(String name) {
// 1. find export resource
URL url = getExportResource(name);

// 2. get .class resource
if (url == null) {
url = getClassResource(name);
}

// 3. get local resource
if (url == null) {
url = getLocalResource(name);
}

return url;
}

@SuppressWarnings("unchecked")
protected Enumeration<URL> getResourcesInternal(String name) throws IOException {
List<Enumeration<URL>> enumerationList = new ArrayList<>();

// 1. find exported resources
enumerationList.add(getExportResources(name));

// 2. find local resources
enumerationList.add(getLocalResources(name));

return new CompoundEnumeration<>(
enumerationList.toArray((Enumeration<URL>[]) new Enumeration<?>[0]));

}

@Override
boolean shouldFindExportedClass(String className) {
return !classloaderService.isDeniedImportClass(bizName, className);
Expand Down
Expand Up @@ -17,8 +17,13 @@
package com.alipay.sofa.ark.container.service.classloader;

import com.alipay.sofa.ark.exception.ArkLoaderException;
import sun.misc.CompoundEnumeration;

import java.io.IOException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;

/**
* Ark Plugin Classloader
Expand Down Expand Up @@ -90,6 +95,40 @@ protected Class<?> loadClassInternal(String name, boolean resolve) throws ArkLoa
"[ArkPlugin Loader] %s : can not load class: %s", pluginName, name));
}

@SuppressWarnings("unchecked")
@Override
protected URL getResourceInternal(String name) {
// 1. find export resource
URL url = getExportResource(name);

// 2. get .class resource
if (url == null) {
url = getClassResource(name);
}

// 3. get local resource
if (url == null) {
url = getLocalResource(name);
}

return url;
}

@SuppressWarnings("unchecked")
protected Enumeration<URL> getResourcesInternal(String name) throws IOException {
List<Enumeration<URL>> enumerationList = new ArrayList<>();

// 1. find exported resources
enumerationList.add(getExportResources(name));

// 2. find local resources
enumerationList.add(getLocalResources(name));

return new CompoundEnumeration<>(
enumerationList.toArray((Enumeration<URL>[]) new Enumeration<?>[0]));

}

@Override
boolean shouldFindExportedClass(String className) {
return classloaderService.isClassInImport(pluginName, className);
Expand Down

0 comments on commit b264291

Please sign in to comment.