PageRenderTime 46ms CodeModel.GetById 19ms RepoModel.GetById 1ms app.codeStats 0ms

/atlassian-plugins-core/src/test/java/com/atlassian/plugin/util/TestClassUtils.java

https://bitbucket.org/purewind/atlassian-plugins
Java | 174 lines | 140 code | 29 blank | 5 comment | 10 complexity | a19e6cfde39fbb3090155ea907dc69bd MD5 | raw file
  1. package com.atlassian.plugin.util;
  2. import junit.framework.TestCase;
  3. import java.io.IOException;
  4. import java.io.Serializable;
  5. import java.net.URL;
  6. import java.net.URLClassLoader;
  7. import java.util.AbstractCollection;
  8. import java.util.AbstractList;
  9. import java.util.ArrayList;
  10. import java.util.Collection;
  11. import java.util.Enumeration;
  12. import java.util.List;
  13. import java.util.RandomAccess;
  14. import static com.google.common.collect.Sets.newHashSet;
  15. import static java.util.Arrays.asList;
  16. import static java.util.Collections.singletonList;
  17. /**
  18. *
  19. */
  20. public class TestClassUtils extends TestCase {
  21. public void testFindAllTypes() {
  22. assertEquals(newHashSet(
  23. List.class,
  24. AbstractList.class,
  25. Cloneable.class,
  26. RandomAccess.class,
  27. AbstractCollection.class,
  28. Iterable.class,
  29. Collection.class,
  30. ArrayList.class,
  31. Object.class,
  32. Serializable.class
  33. ), ClassUtils.findAllTypes(ArrayList.class));
  34. }
  35. public void testGetTypeArguments() {
  36. assertEquals(asList(String.class), ClassUtils.getTypeArguments(BaseClass.class, Child.class));
  37. assertEquals(asList(String.class), ClassUtils.getTypeArguments(BaseClass.class, Baby.class));
  38. assertEquals(singletonList(null), ClassUtils.getTypeArguments(BaseClass.class, ForgotType.class));
  39. }
  40. public void testGetTypeArgumentsDifferentClassloader() throws Exception {
  41. ClassLoader cl = Thread.currentThread().getContextClassLoader();
  42. try {
  43. URL log4jUrl = getClass().getClassLoader().getResource("log4j.properties");
  44. URL root = new URL(new URL(log4jUrl.toExternalForm()), ".");
  45. URLClassLoader urlCl = new URLClassLoader(new URL[]{root}, new FilteredClassLoader(MySuperClass.class));
  46. ClosableClassLoader wrapCl = new ClosableClassLoader(getClass().getClassLoader());
  47. Thread.currentThread().setContextClassLoader(null);
  48. Class<?> module = ClassUtils.getTypeArguments((Class<Object>) urlCl.loadClass(MySuperClass.class.getName()),
  49. (Class<? extends MySuperClass>) urlCl.loadClass(MySubClass.class.getName())).get(0);
  50. assertEquals(MyModule.class.getName(), module.getName());
  51. ClassLoader urlCl2 = new URLClassLoader(new URL[]{root}, new FilteredClassLoader(MySuperClass.class));
  52. assertTrue(wrapCl.loadClass(MySuperClass.class.getName()) == urlCl2.loadClass(MySuperClass.class.getName()));
  53. assertTrue(wrapCl.loadClass(MySubClass.class.getName()) != urlCl2.loadClass(MySubClass.class.getName()));
  54. assertTrue(wrapCl.loadClass(MySubClass.class.getName()).getSuperclass() == urlCl2.loadClass(MySubClass.class.getName()).getSuperclass());
  55. wrapCl.setClosed(true);
  56. //Thread.currentThread().setContextClassLoader(urlCl2);
  57. Class<?> module2 = ClassUtils.getTypeArguments((Class<Object>) urlCl2.loadClass(MySuperClass.class.getName()),
  58. (Class<? extends MySuperClass>) urlCl2.loadClass(MySubClass.class.getName())).get(0);
  59. assertEquals(MyModule.class.getName(), module2.getName());
  60. assertTrue(module != module2);
  61. assertTrue(module != MyModule.class);
  62. assertTrue(module2 != MyModule.class);
  63. } finally {
  64. Thread.currentThread().setContextClassLoader(cl);
  65. }
  66. }
  67. public void testGetTypeArgumentsChildNotSubclass() {
  68. Class fakeChild = BaseClass.class;
  69. try {
  70. assertEquals(singletonList(null), ClassUtils.getTypeArguments(Baby.class, (Class<? extends Baby>) fakeChild));
  71. fail("Should have failed");
  72. } catch (IllegalArgumentException ex) {
  73. // this is good
  74. }
  75. }
  76. private static class BaseClass<T> {
  77. }
  78. private static class Child extends BaseClass<String> {
  79. }
  80. private static class ForgotType extends BaseClass {
  81. }
  82. private static class Mom<T> extends BaseClass<T> {
  83. }
  84. private static class Baby extends Mom<String> {
  85. }
  86. private static class ClosableClassLoader extends ClassLoader {
  87. private final ClassLoader delegate;
  88. private volatile boolean closed;
  89. public ClosableClassLoader(ClassLoader delegate) {
  90. super(null);
  91. this.delegate = delegate;
  92. }
  93. @Override
  94. public Class<?> loadClass(String name)
  95. throws ClassNotFoundException {
  96. checkClosed();
  97. return delegate.loadClass(name);
  98. }
  99. @Override
  100. public Class<?> loadClass(String name, boolean resolve)
  101. throws ClassNotFoundException {
  102. checkClosed();
  103. return delegate.loadClass(name);
  104. }
  105. private void checkClosed() {
  106. if (closed) {
  107. throw new IllegalStateException("Closed");
  108. }
  109. }
  110. @Override
  111. public URL getResource(String name) {
  112. checkClosed();
  113. return delegate.getResource(name);
  114. }
  115. @Override
  116. public Enumeration<URL> getResources(String name)
  117. throws IOException {
  118. checkClosed();
  119. return delegate.getResources(name);
  120. }
  121. public void setClosed(boolean closed) {
  122. this.closed = closed;
  123. }
  124. }
  125. private static class FilteredClassLoader extends ClassLoader {
  126. private final Collection<Class> classes;
  127. public FilteredClassLoader(Class... classes) {
  128. super(null);
  129. this.classes = asList(classes);
  130. }
  131. @Override
  132. public Class<?> loadClass(String name, boolean resolve)
  133. throws ClassNotFoundException {
  134. for (Class cls : classes) {
  135. if (cls.getName().equals(name)) {
  136. return cls;
  137. }
  138. }
  139. if (name.startsWith("java.")) {
  140. return ClassLoader.getSystemClassLoader().loadClass(name);
  141. }
  142. throw new ClassNotFoundException(name);
  143. }
  144. }
  145. }