1 package org.nanocontainer.script.groovy; 2 3 import java.io.IOException ; 4 import java.io.Reader ; 5 import java.io.StringReader ; 6 import java.io.StringWriter ; 7 import java.util.ArrayList ; 8 import java.util.Vector ; 9 10 import org.jmock.Mock; 11 import org.nanocontainer.NanoPicoContainer; 12 import org.nanocontainer.TestHelper; 13 import org.nanocontainer.integrationkit.PicoCompositionException; 14 import org.nanocontainer.reflection.DefaultNanoPicoContainer; 15 import org.nanocontainer.script.AbstractScriptedContainerBuilderTestCase; 16 import org.nanocontainer.script.BarDecoratingPicoContainer; 17 import org.nanocontainer.script.FooDecoratingPicoContainer; 18 import org.nanocontainer.script.NanoContainerMarkupException; 19 import org.nanocontainer.testmodel.A; 20 import org.nanocontainer.testmodel.B; 21 import org.nanocontainer.testmodel.HasParams; 22 import org.nanocontainer.testmodel.ParentAssemblyScope; 23 import org.nanocontainer.testmodel.SomeAssemblyScope; 24 import org.nanocontainer.testmodel.WebServerConfig; 25 import org.nanocontainer.testmodel.X; 26 import org.picocontainer.ComponentAdapter; 27 import org.picocontainer.MutablePicoContainer; 28 import org.picocontainer.PicoContainer; 29 import org.picocontainer.defaults.ComponentAdapterFactory; 30 import org.picocontainer.defaults.InstanceComponentAdapter; 31 import org.picocontainer.defaults.SetterInjectionComponentAdapter; 32 import org.picocontainer.defaults.SetterInjectionComponentAdapterFactory; 33 import org.picocontainer.defaults.UnsatisfiableDependenciesException; 34 import java.io.File ; 35 import java.net.URLClassLoader ; 36 import java.net.URL ; 37 38 44 public class GroovyNodeBuilderTestCase extends AbstractScriptedContainerBuilderTestCase { 45 private static final String ASSEMBLY_SCOPE = "SOME_SCOPE"; 46 47 public void testInstantiateBasicScriptable() throws PicoCompositionException { 48 Reader script = new StringReader ("" + 49 "import org.nanocontainer.testmodel.*\n" + 50 "X.reset()\n" + 51 "builder = new org.nanocontainer.script.groovy.GroovyNodeBuilder()\n" + 52 "nano = builder.container {\n" + 53 " component(A)\n" + 54 "}"); 55 56 PicoContainer pico = buildContainer(script, null, ASSEMBLY_SCOPE); 57 pico.dispose(); 59 60 assertEquals("Should match the expression", "<A!A", X.componentRecorder); 61 } 62 63 public void testComponentInstances() throws PicoCompositionException { 64 Reader script = new StringReader ("" + 65 "import org.nanocontainer.testmodel.*\n" + 66 "builder = new org.nanocontainer.script.groovy.GroovyNodeBuilder()\n" + 67 "nano = builder.container {\n" + 68 " component(key:'a', instance:'apple')\n" + 69 " component(key:'b', instance:'banana')\n" + 70 " component(instance:'noKeySpecified')\n" + 71 "}"); 72 73 PicoContainer pico = buildContainer(script, null, ASSEMBLY_SCOPE); 74 assertEquals("apple", pico.getComponentInstance("a")); 75 assertEquals("banana", pico.getComponentInstance("b")); 76 assertEquals("noKeySpecified", pico.getComponentInstance(String .class)); 77 } 78 79 public void testShouldFailWhenNeitherClassNorInstanceIsSpecifiedForComponent() { 80 Reader script = new StringReader ("" + 81 "builder = new org.nanocontainer.script.groovy.GroovyNodeBuilder()\n" + 82 "nano = builder.container {\n" + 83 " component(key:'a')\n" + 84 "}"); 85 86 try { 87 buildContainer(script, null, ASSEMBLY_SCOPE); 88 fail("NanoContainerMarkupException should have been raised"); 89 } catch (NanoContainerMarkupException e) { 90 } 92 } 93 94 public void testShouldAcceptConstantParametersForComponent() throws PicoCompositionException { 95 Reader script = new StringReader ("" + 96 "import org.picocontainer.defaults.ConstantParameter\n" + 97 "import org.nanocontainer.testmodel.*\n" + 98 "" + 99 "builder = new org.nanocontainer.script.groovy.GroovyNodeBuilder()\n" + 100 "nano = builder.container {\n" + 101 " component(key:'byClass', class:HasParams, parameters:[ 'a', 'b', new ConstantParameter('c') ])\n" + 102 " component(key:'byClassString', class:'org.nanocontainer.testmodel.HasParams', parameters:[ 'c', 'a', 't' ])\n" + 103 "}"); 104 105 PicoContainer pico = buildContainer(script, null, ASSEMBLY_SCOPE); 106 HasParams byClass = (HasParams) pico.getComponentInstance("byClass"); 107 assertEquals("abc", byClass.getParams()); 108 109 HasParams byClassString = (HasParams) pico.getComponentInstance("byClassString"); 110 assertEquals("cat", byClassString.getParams()); 111 } 112 113 public void testShouldAcceptComponentParametersForComponent() throws PicoCompositionException { 114 Reader script = new StringReader ("" + 115 "import org.picocontainer.defaults.ComponentParameter\n" + 116 "import org.nanocontainer.testmodel.*\n" + 117 "" + 118 "builder = new org.nanocontainer.script.groovy.GroovyNodeBuilder()\n" + 119 "nano = builder.container {\n" + 120 " component(key:'a1', class:A)\n" + 121 " component(key:'a2', class:A)\n" + 122 " component(key:'b1', class:B, parameters:[ new ComponentParameter('a1') ])\n" + 123 " component(key:'b2', class:B, parameters:[ new ComponentParameter('a2') ])\n" + 124 "}"); 125 126 PicoContainer pico = buildContainer(script, null, ASSEMBLY_SCOPE); 127 A a1 = (A) pico.getComponentInstance("a1"); 128 A a2 = (A) pico.getComponentInstance("a2"); 129 B b1 = (B) pico.getComponentInstance("b1"); 130 B b2 = (B) pico.getComponentInstance("b2"); 131 132 assertNotNull(a1); 133 assertNotNull(a2); 134 assertNotNull(b1); 135 assertNotNull(b2); 136 137 assertSame(a1, b1.a); 138 assertSame(a2, b2.a); 139 assertNotSame(a1, a2); 140 assertNotSame(b1, b2); 141 } 142 143 public void testShouldAcceptComponentParameterWithClassNameKey() throws PicoCompositionException { 144 Reader script = new StringReader ("" + 145 "import org.picocontainer.defaults.ComponentParameter\n" + 146 "import org.nanocontainer.testmodel.*\n" + 147 "" + 148 "builder = new org.nanocontainer.script.groovy.GroovyNodeBuilder()\n" + 149 "nano = builder.container {\n" + 150 " component(class:A)\n" + 151 " component(key:B, class:B, parameters:[ new ComponentParameter(A) ])\n" + 152 "}"); 153 154 PicoContainer pico = buildContainer(script, null, ASSEMBLY_SCOPE); 155 A a = (A) pico.getComponentInstance(A.class); 156 B b = (B) pico.getComponentInstance(B.class); 157 158 assertNotNull(a); 159 assertNotNull(b); 160 assertSame(a, b.a); 161 } 162 163 public void testComponentParametersScript() { 164 Reader script = new StringReader ("" + 165 "package org.nanocontainer.script.groovy\n" + 166 "import org.picocontainer.defaults.ComponentParameter\n" + 167 "import org.nanocontainer.testmodel.*\n" + 168 "builder = new GroovyNodeBuilder()\n" + 169 "nano = builder.container {\n" + 170 " component(key:'a', class:A)\n" + 171 " component(key:'b', class:B, parameters:[ new ComponentParameter('a') ])\n" + 172 "}"); 173 174 PicoContainer pico = buildContainer(script, null, ASSEMBLY_SCOPE); 175 A a = (A) pico.getComponentInstance("a"); 176 B b = (B) pico.getComponentInstance("b"); 177 assertSame(a, b.a); 178 } 179 180 public void testShouldBeAbleToHandOffToNestedBuilder() { 181 Reader script = new StringReader ("" + 182 "package org.nanocontainer.script.groovy\n" + 183 "import org.nanocontainer.testmodel.*\n" + 184 "builder = new GroovyNodeBuilder()\n" + 185 "builder.registerBuilder(name:'foo', class:'org.nanocontainer.script.groovy.TestingChildBuilder')\n" + 186 "nano = builder.container {\n" + 187 " component(key:'a', class:A)\n" + 188 " foo {\n" + 189 " component(key:'b', class:B)\n" + 190 " }\n" + 191 "}"); 192 193 PicoContainer pico = buildContainer(script, null, ASSEMBLY_SCOPE); 194 Object a = pico.getComponentInstance("a"); 195 Object b = pico.getComponentInstance("b"); 196 197 assertNotNull(a); 198 assertNotNull(b); 199 } 200 201 public void testShouldBeAbleToHandOffToNestedBuilderTheInlinedWay() { 202 Reader script = new StringReader ("" + 203 "package org.nanocontainer.script.groovy\n" + 204 "import org.nanocontainer.testmodel.*\n" + 205 "builder = new GroovyNodeBuilder()\n" + 206 "nano = builder.container {\n" + 207 " component(key:'a', class:A)\n" + 208 " newBuilder(class:'org.nanocontainer.script.groovy.TestingChildBuilder') {\n" + 209 " component(key:'b', class:B)\n" + 210 " }\n" + 211 "}"); 212 213 PicoContainer pico = buildContainer(script, null, ASSEMBLY_SCOPE); 214 Object a = pico.getComponentInstance("a"); 215 Object b = pico.getComponentInstance("b"); 216 217 assertNotNull(a); 218 assertNotNull(b); 219 } 220 221 222 public void testInstantiateBasicComponentInDeeperTree() { 223 X.reset(); 224 Reader script = new StringReader ("" + 225 "package org.nanocontainer.script.groovy\n" + 226 "import org.nanocontainer.testmodel.*\n" + 227 "builder = new GroovyNodeBuilder()\n" + 228 "nano = builder.container {\n" + 229 " container() {\n" + 230 " component(A)\n" + 231 " }\n" + 232 "}"); 233 234 PicoContainer pico = buildContainer(script, null, ASSEMBLY_SCOPE); 235 pico.dispose(); 236 assertEquals("Should match the expression", "<A!A", X.componentRecorder); 237 } 238 239 public void testCustomComponentAdapterFactoryCanBeSpecified() { 240 Reader script = new StringReader ("" + 241 "package org.nanocontainer.script.groovy\n" + 242 "import org.nanocontainer.testmodel.*\n" + 243 "builder = new GroovyNodeBuilder()\n" + 244 "nano = builder.container(componentAdapterFactory:assemblyScope) {\n" + 245 " component(A)\n" + 246 "}"); 247 248 A a = new A(); 249 Mock cafMock = mock(ComponentAdapterFactory.class); 250 cafMock.expects(once()).method("createComponentAdapter").with(same(A.class), same(A.class), eq(null)).will(returnValue(new InstanceComponentAdapter(A.class, a))); 251 ComponentAdapterFactory componentAdapterFactory = (ComponentAdapterFactory) cafMock.proxy(); 252 PicoContainer pico = buildContainer(script, null, componentAdapterFactory); 253 assertSame(a, pico.getComponentInstanceOfType(A.class)); 254 } 255 256 public void testCustomComponentMonitorCanBeSpecified() { 257 Reader script = new StringReader ("" + 258 "package org.nanocontainer.script.groovy\n" + 259 "import java.io.StringWriter\n" + 260 "import org.picocontainer.monitors.WriterComponentMonitor\n" + 261 "import org.nanocontainer.testmodel.*\n" + 262 "builder = new GroovyNodeBuilder()\n" + 263 "writer = new StringWriter()\n" + 264 "monitor = new WriterComponentMonitor(writer) \n"+ 265 "nano = builder.container(componentMonitor: monitor) {\n" + 266 " component(A)\n" + 267 " component(key:StringWriter, instance:writer)\n" + 268 "}"); 269 270 PicoContainer pico = buildContainer(script, null, ASSEMBLY_SCOPE); 271 pico.getComponentInstanceOfType(WebServerConfig.class); 272 StringWriter writer = (StringWriter )pico.getComponentInstanceOfType(StringWriter .class); 273 assertTrue(writer.toString().length() > 0); 274 } 275 276 public void testCustomComponentMonitorCanBeSpecifiedWhenCAFIsSpecified() { 277 Reader script = new StringReader ("" + 278 "package org.nanocontainer.script.groovy\n" + 279 "import java.io.StringWriter\n" + 280 "import org.picocontainer.defaults.DefaultComponentAdapterFactory\n" + 281 "import org.picocontainer.monitors.WriterComponentMonitor\n" + 282 "import org.nanocontainer.testmodel.*\n" + 283 "builder = new GroovyNodeBuilder()\n" + 284 "writer = new StringWriter()\n" + 285 "monitor = new WriterComponentMonitor(writer) \n"+ 286 "nano = builder.container(componentAdapterFactory: new DefaultComponentAdapterFactory(), componentMonitor: monitor) {\n" + 287 " component(A)\n" + 288 " component(key:StringWriter, instance:writer)\n" + 289 "}"); 290 291 PicoContainer pico = buildContainer(script, null, ASSEMBLY_SCOPE); 292 pico.getComponentInstanceOfType(WebServerConfig.class); 293 StringWriter writer = (StringWriter )pico.getComponentInstanceOfType(StringWriter .class); 294 assertTrue(writer.toString().length() > 0); 295 } 296 297 public void testCustomComponentMonitorCanBeSpecifiedWhenParentIsSpecified() { 298 DefaultNanoPicoContainer parent = new DefaultNanoPicoContainer(); 299 Reader script = new StringReader ("" + 300 "package org.nanocontainer.script.groovy\n" + 301 "import java.io.StringWriter\n" + 302 "import org.picocontainer.monitors.WriterComponentMonitor\n" + 303 "import org.nanocontainer.testmodel.*\n" + 304 "builder = new GroovyNodeBuilder()\n" + 305 "writer = new StringWriter()\n" + 306 "monitor = new WriterComponentMonitor(writer) \n"+ 307 "nano = builder.container(parent:parent, componentMonitor: monitor) {\n" + 308 " component(A)\n" + 309 " component(key:StringWriter, instance:writer)\n" + 310 "}"); 311 312 PicoContainer pico = buildContainer(script, parent, ASSEMBLY_SCOPE); 313 pico.getComponentInstanceOfType(WebServerConfig.class); 314 StringWriter writer = (StringWriter )pico.getComponentInstanceOfType(StringWriter .class); 315 assertTrue(writer.toString().length() > 0); 316 } 317 318 public void testCustomComponentMonitorCanBeSpecifiedWhenParentAndCAFAreSpecified() { 319 DefaultNanoPicoContainer parent = new DefaultNanoPicoContainer(); 320 Reader script = new StringReader ("" + 321 "package org.nanocontainer.script.groovy\n" + 322 "import java.io.StringWriter\n" + 323 "import org.picocontainer.defaults.DefaultComponentAdapterFactory\n" + 324 "import org.picocontainer.monitors.WriterComponentMonitor\n" + 325 "import org.nanocontainer.testmodel.*\n" + 326 "builder = new GroovyNodeBuilder()\n" + 327 "writer = new StringWriter()\n" + 328 "monitor = new WriterComponentMonitor(writer) \n"+ 329 "nano = builder.container(parent:parent, componentAdapterFactory: new DefaultComponentAdapterFactory(), componentMonitor: monitor) {\n" + 330 " component(A)\n" + 331 " component(key:StringWriter, instance:writer)\n" + 332 "}"); 333 334 PicoContainer pico = buildContainer(script, parent, ASSEMBLY_SCOPE); 335 pico.getComponentInstanceOfType(WebServerConfig.class); 336 StringWriter writer = (StringWriter )pico.getComponentInstanceOfType(StringWriter .class); 337 assertTrue(writer.toString().length() > 0); 338 } 339 340 public void testInstantiateWithImpossibleComponentDependenciesConsideringTheHierarchy() { 341 X.reset(); 342 Reader script = new StringReader ("" + 343 "package org.nanocontainer.script.groovy\n" + 344 "import org.nanocontainer.testmodel.*\n" + 345 "builder = new GroovyNodeBuilder()\n" + 346 "nano = builder.container {\n" + 347 " component(B)\n" + 348 " container() {\n" + 349 " component(A)\n" + 350 " }\n" + 351 " component(C)\n" + 352 "}"); 353 354 try { 355 buildContainer(script, null, ASSEMBLY_SCOPE); 356 fail("Should not have been able to instansiate component tree due to visibility/parent reasons."); 357 } catch (UnsatisfiableDependenciesException expected) { 358 } 359 } 360 361 public void testInstantiateWithChildContainerAndStartStopAndDisposeOrderIsCorrect() { 362 X.reset(); 363 Reader script = new StringReader ("" + 364 "package org.nanocontainer.script.groovy\n" + 365 "import org.nanocontainer.testmodel.*\n" + 366 "builder = new GroovyNodeBuilder()\n" + 367 "nano = builder.container {\n" + 368 " component(A)\n" + 369 " container() {\n" + 370 " component(B)\n" + 371 " }\n" + 372 " component(C)\n" + 373 "}\n"); 374 375 PicoContainer pico = buildContainer(script, null, ASSEMBLY_SCOPE); 377 pico.stop(); 379 pico.dispose(); 380 381 assertEquals("Should match the expression", "<A<C<BB>C>A>!B!C!A", X.componentRecorder); 382 } 383 384 public void testBuildContainerWithParentAttribute() { 385 DefaultNanoPicoContainer parent = new DefaultNanoPicoContainer(); 386 parent.registerComponentInstance("hello", "world"); 387 388 Reader script = new StringReader ("" + 389 "package org.nanocontainer.script.groovy\n" + 390 "import org.nanocontainer.testmodel.*\n" + 391 "builder = new GroovyNodeBuilder()\n" + 392 "nano = builder.container(parent:parent) {\n" + 393 " component(A)\n" + 394 "}\n"); 395 396 PicoContainer pico = buildContainer(script, parent, ASSEMBLY_SCOPE); 397 assertEquals("world", pico.getComponentInstance("hello")); 399 } 400 401 402 public void testBuildContainerWithParentDependencyAndAssemblyScope() { 403 DefaultNanoPicoContainer parent = new DefaultNanoPicoContainer(); 404 parent.registerComponentImplementation("a", A.class); 405 406 Reader script = new StringReader ("" + 407 "package org.nanocontainer.script.groovy\n" + 408 "import org.nanocontainer.testmodel.*\n" + 409 "builder = new GroovyNodeBuilder()\n" + 410 "nano = builder.container(parent:parent) {\n" + 411 " if ( assemblyScope instanceof SomeAssemblyScope ){\n "+ 412 " component(B)\n" + 413 " }\n "+ 414 "}\n"); 415 416 PicoContainer pico = buildContainer(script, parent, new SomeAssemblyScope()); 417 assertNotNull(pico.getComponentInstanceOfType(B.class)); 418 } 419 420 public void testBuildContainerWithParentAndChildAssemblyScopes() throws IOException { 421 String scriptValue = ("" + 422 "package org.nanocontainer.script.groovy\n" + 423 "import org.nanocontainer.testmodel.*\n" + 424 "builder = new GroovyNodeBuilder()\n" + 425 "nano = builder.container(parent:parent) {\n" + 426 " System.out.println('assemblyScope:'+assemblyScope)\n " + 427 " if ( assemblyScope instanceof ParentAssemblyScope ){\n "+ 428 " System.out.println('parent scope')\n " + 429 " component(A)\n" + 430 " } else if ( assemblyScope instanceof SomeAssemblyScope ){\n "+ 431 " System.out.println('child scope')\n " + 432 " component(B)\n" + 433 " } else { \n" + 434 " throw new IllegalArgumentException('Invalid Scope: ' + assemblyScope.getClass().getName())\n" + 435 " System.out.println('Invalid scope')\n " + 436 " } \n "+ 437 "}\n"); 438 439 Reader script = new StringReader (scriptValue); 440 NanoPicoContainer parent = new DefaultNanoPicoContainer( 441 buildContainer(script, null, new ParentAssemblyScope())); 442 443 assertNotNull(parent.getComponentAdapterOfType(A.class)); 444 445 script = new StringReader (scriptValue); 446 PicoContainer pico = buildContainer(script, parent, new SomeAssemblyScope()); 447 assertNotNull(pico.getComponentInstance(B.class)); 448 } 449 450 451 452 public void testBuildContainerWhenExpectedParentDependencyIsNotFound() { 453 DefaultNanoPicoContainer parent = new DefaultNanoPicoContainer(); 454 455 Reader script = new StringReader ("" + 456 "package org.nanocontainer.script.groovy\n" + 457 "import org.nanocontainer.testmodel.*\n" + 458 "builder = new GroovyNodeBuilder()\n" + 459 "nano = builder.container(parent:parent) {\n" + 460 " if ( assemblyScope instanceof SomeAssemblyScope ){\n "+ 461 " component(B)\n" + 462 " }\n "+ 463 "}\n"); 464 465 try { 466 buildContainer(script, parent, new SomeAssemblyScope()); 467 fail("UnsatisfiableDependenciesException expected"); 468 } catch (UnsatisfiableDependenciesException e) { 469 } 471 } 472 473 public void testBuildContainerWithParentAttributesPropagatesComponentAdapterFactory() { 474 DefaultNanoPicoContainer parent = new DefaultNanoPicoContainer(new SetterInjectionComponentAdapterFactory() ); 475 Reader script = new StringReader ("" + 476 "package org.nanocontainer.script.groovy\n" + 477 "import org.nanocontainer.testmodel.*\n" + 478 "builder = new GroovyNodeBuilder()\n" + 479 "nano = builder.container(parent:parent) {\n" + 480 "}\n"); 481 482 MutablePicoContainer pico = (MutablePicoContainer)buildContainer(script, parent, ASSEMBLY_SCOPE); 483 ComponentAdapter componentAdapter = pico.registerComponentImplementation(String .class); 485 assertTrue("ComponentAdapter should be originally defined by parent" , componentAdapter instanceof SetterInjectionComponentAdapter); 486 } 487 488 489 490 public void testExceptionThrownWhenParentAttributeDefinedWithinChild() { 491 DefaultNanoPicoContainer parent = new DefaultNanoPicoContainer(new SetterInjectionComponentAdapterFactory() ); 492 Reader script = new StringReader ("" + 493 "package org.nanocontainer.script.groovy\n" + 494 "import org.nanocontainer.testmodel.*\n" + 495 "nano = new GroovyNodeBuilder().container() {\n" + 496 " component(A)\n" + 497 " container(parent:parent) {\n" + 498 " component(B)\n" + 499 " }\n" + 500 "}\n"); 501 502 try { 503 buildContainer(script, parent, ASSEMBLY_SCOPE); 504 fail("NanoContainerMarkupException should have been thrown."); 505 } catch (NanoContainerMarkupException ignore) { 506 } 508 } 509 510 public void testSpuriousAttributes() { 512 DefaultNanoPicoContainer parent = new DefaultNanoPicoContainer(); 513 514 Reader script = new StringReader ("" + 515 "package org.nanocontainer.script.groovy\n" + 516 "import org.nanocontainer.testmodel.*\n" + 517 "builder = new GroovyNodeBuilder()\n" + 518 "nano = builder.container(jim:'Jam', foo:'bar') {\n" + 519 520 "}\n"); 521 try { 522 buildContainer(script, parent, ASSEMBLY_SCOPE); 523 } catch (NanoContainerMarkupException ex) { 525 } 527 } 528 529 530 531 532 public void testWithDynamicClassPathThatDoesNotExist() { 533 DefaultNanoPicoContainer parent = new DefaultNanoPicoContainer(); 534 try { 535 Reader script = new StringReader ("" + 536 " child = null\n" + 537 " pico = builder.container {\n" + 538 " classPathElement(path:'this/path/does/not/exist.jar')\n" + 539 " component(class:\"FooBar\") " + 540 " }"); 541 542 buildContainer(script, parent, ASSEMBLY_SCOPE); 543 fail("should have barfed with bad path exception"); 544 } catch (NanoContainerMarkupException e) { 545 } 547 548 } 549 550 551 public void testWithDynamicClassPath() { 552 DefaultNanoPicoContainer parent = new DefaultNanoPicoContainer(); 553 Reader script = new StringReader ( 554 " builder = new org.nanocontainer.script.groovy.GroovyNodeBuilder()\n" 555 + " File testCompJar = org.nanocontainer.TestHelper.getTestCompJarFile()\n" 556 + " compJarPath = testCompJar.getCanonicalPath()\n" 557 + " child = null\n" 558 + " pico = builder.container {\n" 559 + " classPathElement(path:compJarPath)\n" 560 + " component(class:\"TestComp\")\n" 561 + " }"); 562 563 MutablePicoContainer pico = (MutablePicoContainer) buildContainer(script, parent, ASSEMBLY_SCOPE); 564 565 assertTrue(pico.getComponentInstances().size() == 1); 566 assertEquals("TestComp", pico.getComponentInstances().get(0).getClass() 567 .getName()); 568 } 569 570 571 572 573 public void testWithDynamicClassPathWithPermissions() { 574 DefaultNanoPicoContainer parent = new DefaultNanoPicoContainer(); 575 Reader script = new StringReader ( 576 "" 577 + " builder = new org.nanocontainer.script.groovy.GroovyNodeBuilder()\n" 578 + " File testCompJar = org.nanocontainer.TestHelper.getTestCompJarFile()\n" 579 + " compJarPath = testCompJar.getCanonicalPath()\n" 580 + " child = null\n" 581 + " pico = builder.container {\n" 582 + " classPathElement(path:compJarPath) {\n" 583 + " grant(new java.net.SocketPermission('google.com','connect'))\n" 584 + " }\n" 585 + " component(class:\"TestComp\")\n" 586 + " }" + ""); 587 588 MutablePicoContainer pico = (MutablePicoContainer)buildContainer(script, parent, ASSEMBLY_SCOPE); 589 590 assertTrue(pico.getComponentInstances().size() == 1); 591 } 594 595 596 public void testGrantPermissionInWrongPlace() { 597 DefaultNanoPicoContainer parent = new DefaultNanoPicoContainer(); 598 try { 599 Reader script = new StringReader ("" + 600 " builder = new org.nanocontainer.script.groovy.GroovyNodeBuilder()\n" + 601 " File testCompJar = org.nanocontainer.TestHelper.getTestCompJarFile()\n" + 602 " compJarPath = testCompJar.getCanonicalPath()\n" + 603 " child = null\n" + 604 " pico = builder.container {\n" + 605 " grant(new java.net.SocketPermission('google.com','connect'))\n" + 606 " }" + 607 ""); 608 609 buildContainer(script, parent, ASSEMBLY_SCOPE); 610 fail("should barf with [Don't know how to create a 'grant' child] exception"); 611 } catch (NanoContainerMarkupException e) { 612 assertTrue(e.getMessage().indexOf("Don't know how to create a 'grant' child") > -1); 613 } 614 615 } 616 617 621 public void testTestCompIsNotAvailableViaSystemClassPath() { 622 try { 623 Class testComp = getClass().getClassLoader().loadClass("TestComp"); 624 fail("Invalid configuration TestComp exists in system classpath. "); 625 } catch (ClassNotFoundException ex) { 626 } 628 629 } 630 631 632 public void testWithParentClassPathPropagatesWithNoParentContainer()throws IOException { 633 File testCompJar = TestHelper.getTestCompJarFile(); 634 635 URLClassLoader classLoader = new URLClassLoader (new URL [] {testCompJar.toURL()}, this.getClass().getClassLoader()); 636 Class testComp = null; 637 638 try { 639 testComp = classLoader.loadClass("TestComp"); 640 } catch (ClassNotFoundException ex) { 641 fail("Unable to load test component from the jar using a url classloader"); 642 } 643 Reader script = new StringReader ("" 644 + "pico = builder.container(parent:parent) {\n" 645 + " component(class:\"TestComp\")\n" 646 + "}"); 647 648 PicoContainer pico = buildContainer(new GroovyContainerBuilder(script, classLoader), null, null); 649 assertNotNull(pico); 650 Object testCompInstance = pico.getComponentInstance(testComp.getName()); 651 assertSame(testCompInstance.getClass(), testComp); 652 653 } 654 655 public void testValidationTurnedOnThrowsExceptionForUnknownAttributes() { 656 DefaultNanoPicoContainer parent = new DefaultNanoPicoContainer(); 657 Reader script = new StringReader ( 658 "import org.nanocontainer.script.NullNodeBuilderDecorationDelegate\n" + 659 "import org.nanocontainer.script.groovy.GroovyNodeBuilder\n" + 660 "import org.nanocontainer.testmodel.*\n" + 661 "builder = new GroovyNodeBuilder(new NullNodeBuilderDecorationDelegate(), GroovyNodeBuilder.PERFORM_ATTRIBUTE_VALIDATION)\n" + 662 "nano = builder.container {\n" + 663 " component(key:'a', instance:'apple', badAttribute:'foo')\n" + 664 "}"); 665 666 try { 667 buildContainer(script, parent, ASSEMBLY_SCOPE); 668 fail("GroovyNodeBuilder with validation should have thrown NanoContainerMarkupException"); 669 } catch(GroovyCompilationException ex) { 670 throw ex; 672 } catch (NanoContainerMarkupException ex) { 673 } 675 } 676 677 public void testValidationTurnedOffDoesntThrowExceptionForUnknownAttributes() { 678 DefaultNanoPicoContainer parent = new DefaultNanoPicoContainer(); 679 Reader script = new StringReader ( 680 "import org.nanocontainer.script.NullNodeBuilderDecorationDelegate\n" + 681 "import org.nanocontainer.script.groovy.GroovyNodeBuilder\n" + 682 "import org.nanocontainer.testmodel.*\n" + 683 "builder = new GroovyNodeBuilder(new NullNodeBuilderDecorationDelegate(), GroovyNodeBuilder.SKIP_ATTRIBUTE_VALIDATION)\n" + 684 "nano = builder.container {\n" + 685 " component(key:'a', instance:'apple', badAttribute:'foo')\n" + 686 "}"); 687 688 try { 689 buildContainer(script, parent, ASSEMBLY_SCOPE); 690 } catch(GroovyCompilationException ex) { 692 throw ex; 694 } catch (NanoContainerMarkupException ex) { 695 fail("GroovyNodeBuilder with validation turned off should never have thrown NanoContainerMarkupException: " + ex.getMessage()); 696 } 697 698 } 699 700 701 public void testComponentAdapterIsPotentiallyScriptable() throws PicoCompositionException { 702 Reader script = new StringReader ("" + 703 "import org.nanocontainer.testmodel.*\n" + 704 "X.reset()\n" + 705 "builder = new org.nanocontainer.script.groovy.OldGroovyNodeBuilder()\n" + 706 "nano = builder.container {\n" + 707 " ca = component(java.lang.Object) \n" + 708 " component(instance:ca.getClass().getName())\n" + 709 "}"); 710 711 PicoContainer pico = buildContainer(script, null, ASSEMBLY_SCOPE); 712 assertEquals("org.picocontainer.defaults.CachingComponentAdapter", pico.getComponentInstances().get(1).toString()); 714 } 715 716 717 private PicoContainer buildContainer(Reader script, PicoContainer parent, Object scope) { 718 return buildContainer(new GroovyContainerBuilder(script, getClass().getClassLoader()), parent, scope); 719 } 720 721 722 public void testChainOfDecoratingPicoContainersCanDoInterceptionOfMutablePicoContainerMethods() throws ClassNotFoundException { 723 724 Reader script = new StringReader ("" + 725 "import org.nanocontainer.testmodel.*\n" + 726 "builder = new org.nanocontainer.script.groovy.GroovyNodeBuilder()\n" + 727 "nano = builder.container {\n" + 728 " decoratingPicoContainer("+ FooDecoratingPicoContainer.class.getName()+")\n" + 729 " decoratingPicoContainer("+ BarDecoratingPicoContainer.class.getName()+")\n" + 730 " component(\"java.util.Vector\")\n" + 731 "}"); 732 733 PicoContainer pico = buildContainer(script, null, ASSEMBLY_SCOPE); 734 735 736 assertNotNull(pico.getComponentInstanceOfType(ArrayList .class)); 738 assertNull(pico.getComponentInstanceOfType(Vector .class)); 739 } 740 741 742 743 744 745 746 747 748 749 } 750 | Popular Tags |