1   package org.codehaus.classworlds;
2   
3   import junit.framework.TestCase;
4   
5   import java.io.File;
6   import java.io.InputStream;
7   import java.net.URL;
8   
9   import org.codehaus.classworlds.ClassWorld;
10  import org.codehaus.classworlds.ClassRealm;
11  import org.codehaus.classworlds.RealmClassLoader;
12  
13  public class UberJarRealmClassLoaderTest
14      extends TestCase
15  {
16      private ClassWorld world;
17  
18      private ClassRealm realm;
19  
20      public void setUp()
21          throws Exception
22      {
23          System.setProperty( "java.protocol.handler.pkgs", "org.codehaus.classworlds.uberjar.protocol" );
24  
25          System.setProperty( "classworlds.bootstrapped", "true" );
26  
27          world = new ClassWorld();
28  
29          realm = this.world.newRealm( "realm" );
30      }
31  
32      public void testFindResource_Simple()
33          throws Exception
34      {
35          URL url = getJarUrl( "nested.jar" );
36  
37          this.realm.addConstituent( url );
38  
39          RealmClassLoader cl = (RealmClassLoader) this.realm.getClassLoader();
40  
41          URL resource = cl.findResource( "nested.properties" );
42  
43          assertNotNull( resource );
44  
45          byte[] buffer = new byte[1024];
46  
47          int read = 0;
48  
49          StringBuffer content = new StringBuffer();
50  
51          InputStream in = resource.openStream();
52  
53          while ( ( read = in.read( buffer, 0, 1024 ) ) >= 0 )
54          {
55              content.append( new String( buffer, 0, read ) );
56          }
57  
58          assertTrue( content.toString().startsWith( "nested.properties" ) );
59      }
60  
61      public void testGetResourceAsStream_Simple()
62          throws Exception
63      {
64          URL url = getJarUrl( "nested.jar" );
65  
66          this.realm.addConstituent( url );
67  
68          RealmClassLoader cl = (RealmClassLoader) this.realm.getClassLoader();
69  
70          InputStream in = cl.getResourceAsStream( "nested.properties" );
71  
72          assertNotNull( in );
73  
74          String content = getContent( in );
75  
76          assertTrue( content.startsWith( "nested.properties" ) );
77      }
78  
79      public void testStandardJarUrl()
80          throws Exception
81      {
82          File testDir = new File( System.getProperty( "basedir" ), "target/test-data" );
83  
84          URL url = new URL( "jar:file:" + testDir + "/a.jar!/" );
85  
86          this.realm.addConstituent( url );
87  
88          RealmClassLoader cl = (RealmClassLoader) this.realm.getClassLoader();
89  
90          cl.loadClass( "a.A" );
91      }
92  
93  
94      public void testFindResource_NotFound()
95          throws Exception
96      {
97          URL url = getJarUrl( "nested.jar" );
98  
99          this.realm.addConstituent( url );
100 
101         RealmClassLoader cl = (RealmClassLoader) this.realm.getClassLoader();
102 
103         URL resource = cl.findResource( "deadbeef" );
104 
105         assertNull( resource );
106     }
107 
108     public void testGetResourceAsStream_NotFound()
109         throws Exception
110     {
111         URL url = getJarUrl( "nested.jar" );
112 
113         this.realm.addConstituent( url );
114 
115         RealmClassLoader cl = (RealmClassLoader) this.realm.getClassLoader();
116 
117         InputStream in = cl.getResourceAsStream( "deadbeef" );
118 
119         assertNull( in );
120     }
121 
122     protected String getContent( InputStream in )
123         throws Exception
124     {
125         byte[] buffer = new byte[1024];
126 
127         int read = 0;
128 
129         StringBuffer content = new StringBuffer();
130 
131         while ( ( read = in.read( buffer, 0, 1024 ) ) >= 0 )
132         {
133             content.append( new String( buffer, 0, read ) );
134         }
135 
136         return content.toString();
137     }
138 
139     public void testFindResource_Nested()
140         throws Exception
141     {
142         URL url = buildUrl( "nested.jar", "!/lib/a.jar" );
143 
144         this.realm.addConstituent( url );
145 
146         RealmClassLoader cl = (RealmClassLoader) this.realm.getClassLoader();
147 
148         URL resource = cl.findResource( "a.properties" );
149 
150         assertNotNull( resource );
151 
152         InputStream in = resource.openStream();
153 
154         assertNotNull( in );
155 
156         String content = getContent( in );
157 
158         assertTrue( content.startsWith( "a properties" ) );
159     }
160 
161     public void testGetResourceAsStream_Nested()
162         throws Exception
163     {
164         URL url = buildUrl( "nested.jar", "!/lib/a.jar" );
165 
166         this.realm.addConstituent( url );
167 
168         RealmClassLoader cl = (RealmClassLoader) this.realm.getClassLoader();
169 
170         InputStream in = cl.getResourceAsStream( "a.properties" );
171 
172         assertNotNull( in );
173 
174         String content = getContent( in );
175 
176         assertTrue( content.startsWith( "a properties" ) );
177     }
178 
179     protected URL getJarUrl( String jarName )
180         throws Exception
181     {
182         File testDir = new File( System.getProperty( "basedir" ), "target/test-data" );
183 
184         File jarFile = new File( testDir, jarName );
185 
186         String urlText = "jar:" + jarFile.toURL();
187 
188         return new URL( urlText );
189     }
190 
191     protected URL buildUrl( String jarName, String path )
192         throws Exception
193     {
194         URL jarUrl = getJarUrl( jarName );
195 
196         String urlText = jarUrl.toExternalForm() + path;
197 
198         URL url = new URL( urlText );
199 
200         return url;
201     }
202 }