3636 */ 
3737
3838import  java .io .File ;
39- import  java .io .InputStream ;
4039import  java .util .Collections ;
40+ import  java .util .Optional ;
4141
4242import  org .codehaus .plexus .ContainerConfiguration ;
4343import  org .codehaus .plexus .DefaultContainerConfiguration ;
4444import  org .codehaus .plexus .DefaultPlexusContainer ;
4545import  org .codehaus .plexus .PlexusConstants ;
4646import  org .codehaus .plexus .PlexusContainer ;
4747import  org .codehaus .plexus .PlexusContainerException ;
48- import  org .codehaus .plexus .component .repository .exception .ComponentLifecycleException ;
49- import  org .codehaus .plexus .component .repository .exception .ComponentLookupException ;
50- import  org .codehaus .plexus .configuration .PlexusConfiguration ;
5148import  org .codehaus .plexus .context .Context ;
5249import  org .codehaus .plexus .context .DefaultContext ;
5350import  org .junit .jupiter .api .extension .AfterEachCallback ;
6663 * @author Guillaume Nodet 
6764 */ 
6865public  class  PlexusExtension  implements  BeforeEachCallback , AfterEachCallback  {
69-     private  ExtensionContext  context ;
70-     private  PlexusContainer  container ;
7166
72-     private  static  String  basedir ;
67+     private  static  final  ExtensionContext .Namespace  PLEXUS_EXTENSION  =
68+             ExtensionContext .Namespace .create ("PlexusExtension" );
7369
74-     /** 
75-      *  The base directory for the test instance 
76-      */ 
77-     private  String  testBasedir ;
70+     public  static  final  String  BASEDIR_KEY  = "basedir" ;
71+ 
72+     private  static  final  ThreadLocal <ExtensionContext > extensionContextThreadLocal  = new  ThreadLocal <>();
7873
7974    static  {
8075        if  (System .getProperty ("guice_custom_class_loading" , "" ).trim ().isEmpty ()) {
@@ -84,41 +79,32 @@ public class PlexusExtension implements BeforeEachCallback, AfterEachCallback {
8479
8580    @ Override 
8681    public  void  beforeEach (ExtensionContext  context ) throws  Exception  {
82+         extensionContextThreadLocal .set (context );
8783
88-         setContext (context );
89- 
90-         getContainer ().addComponent (getContainer (), PlexusContainer .class .getName ());
91- 
92-         ((DefaultPlexusContainer ) getContainer ())
84+         ((DefaultPlexusContainer ) getContainer (context ))
9385                .addPlexusInjector (
9486                        Collections .emptyList (), binder  -> binder .requestInjection (context .getRequiredTestInstance ()));
9587    }
9688
97-     protected  void  setContext (ExtensionContext  context ) {
98-         this .context  = context ;
99-     }
100- 
101-     protected  void  setupContainer () {
89+     private  PlexusContainer  setupContainer (ExtensionContext  context ) {
10290        // ---------------------------------------------------------------------------- 
10391        // Context Setup 
10492        // ---------------------------------------------------------------------------- 
10593
106-         DefaultContext  context  = new  DefaultContext ();
107- 
108-         context .put ("basedir" , getTestBasedir ());
109- 
110-         customizeContext (context );
94+         DefaultContext  plexusContext  = new  DefaultContext ();
95+         plexusContext .put ("basedir" , getTestBasedir (context ));
96+         customizeContext (plexusContext );
11197
112-         boolean  hasPlexusHome  = context .contains ("plexus.home" );
98+         boolean  hasPlexusHome  = plexusContext .contains ("plexus.home" );
11399
114100        if  (!hasPlexusHome ) {
115-             File  f  = getTestFile ( "target/plexus-home" );
101+             File  f  = new   File ( getTestBasedir ( context ),  "target/plexus-home" );
116102
117103            if  (!f .isDirectory ()) {
118104                f .mkdir ();
119105            }
120106
121-             context .put ("plexus.home" , f .getAbsolutePath ());
107+             plexusContext .put ("plexus.home" , f .getAbsolutePath ());
122108        }
123109
124110        // ---------------------------------------------------------------------------- 
@@ -128,25 +114,29 @@ protected void setupContainer() {
128114        String  config  = getCustomConfigurationName ();
129115
130116        ContainerConfiguration  containerConfiguration  =
131-                 new  DefaultContainerConfiguration ().setName ("test" ).setContext (context .getContextData ());
117+                 new  DefaultContainerConfiguration ().setName ("test" ).setContext (plexusContext .getContextData ());
132118
133119        if  (config  != null ) {
134120            containerConfiguration .setContainerConfiguration (config );
135121        } else  {
136-             String  resource  = getConfigurationName (null );
137- 
122+             String  resource  = getConfigurationName (context );
138123            containerConfiguration .setContainerConfiguration (resource );
139124        }
140125
141126        customizeContainerConfiguration (containerConfiguration );
142-         testInstanceCustomizeContainerConfiguration (containerConfiguration );
127+         testInstanceCustomizeContainerConfiguration (containerConfiguration ,  context );
143128
129+         PlexusContainer  container ;
144130        try  {
145131            container  = new  DefaultPlexusContainer (containerConfiguration );
132+             container .addComponent (container , PlexusContainer .class .getName ());
146133        } catch  (PlexusContainerException  e ) {
147134            throw  new  IllegalArgumentException ("Failed to create plexus container." , e );
148135        }
149-         testInstanceCustomizeContainer (container );
136+         testInstanceCustomizeContainer (container , context );
137+         context .getStore (PLEXUS_EXTENSION ).put (PlexusContainer .class , container );
138+ 
139+         return  container ;
150140    }
151141
152142    /** 
@@ -160,14 +150,15 @@ protected void customizeContainerConfiguration(ContainerConfiguration containerC
160150        containerConfiguration .setClassPathScanning (PlexusConstants .SCANNING_INDEX );
161151    }
162152
163-     private  void  testInstanceCustomizeContainerConfiguration (ContainerConfiguration  containerConfiguration ) {
153+     private  void  testInstanceCustomizeContainerConfiguration (
154+             ContainerConfiguration  containerConfiguration , ExtensionContext  context ) {
164155        Object  testInstance  = context .getRequiredTestInstance ();
165156        if  (testInstance  instanceof  PlexusTestConfiguration ) {
166157            ((PlexusTestConfiguration ) testInstance ).customizeConfiguration (containerConfiguration );
167158        }
168159    }
169160
170-     private  void  testInstanceCustomizeContainer (PlexusContainer  container ) {
161+     private  void  testInstanceCustomizeContainer (PlexusContainer  container ,  ExtensionContext   context ) {
171162        Object  testInstance  = context .getRequiredTestInstance ();
172163        if  (testInstance  instanceof  PlexusTestConfiguration ) {
173164            ((PlexusTestConfiguration ) testInstance ).customizeContainer (container );
@@ -176,28 +167,30 @@ private void testInstanceCustomizeContainer(PlexusContainer container) {
176167
177168    protected  void  customizeContext (Context  context ) {}
178169
179-     protected  PlexusConfiguration  customizeComponentConfiguration () {
180-         return  null ;
181-     }
182- 
183170    @ Override 
184171    public  void  afterEach (ExtensionContext  context ) throws  Exception  {
172+         PlexusContainer  container  =
173+                 context .getStore (PLEXUS_EXTENSION ).remove (PlexusContainer .class , PlexusContainer .class );
185174        if  (container  != null ) {
186175            container .dispose ();
187- 
188-             container  = null ;
189176        }
177+         context .getStore (PLEXUS_EXTENSION ).remove ("testBasedir" , String .class );
178+         extensionContextThreadLocal .remove ();
190179    }
191180
192181    /** 
193182     * The base directory for the test instance. By default, this is the same as the basedir. 
194183     * 
184+      * @param context  the test execution context 
185+      * 
195186     * @return the testBasedir 
196187     * @since 1.7.0 
197188     */ 
198-     protected  String  getTestBasedir () {
189+     protected  String  getTestBasedir (ExtensionContext  context ) {
190+         String  testBasedir  = context .getStore (PLEXUS_EXTENSION ).get (BASEDIR_KEY , String .class );
199191        if  (testBasedir  == null ) {
200-             testBasedir  = getBasedir ();
192+             testBasedir  = getDefaultBasedir ();
193+             context .getStore (PLEXUS_EXTENSION ).put (BASEDIR_KEY , testBasedir );
201194        }
202195        return  testBasedir ;
203196    }
@@ -206,28 +199,22 @@ protected String getTestBasedir() {
206199     * Set the base directory for the test instance. By default, this is the same as the basedir. 
207200     * 
208201     * @param testBasedir the testBasedir for the test instance 
202+      * @param context  the test execution context 
209203     * @since 1.7.0 
210204     */ 
211-     protected  void  setTestBasedir (String  testBasedir ) {
212-         this . testBasedir  =  testBasedir ;
205+     protected  void  setTestBasedir (String  testBasedir ,  ExtensionContext   context ) {
206+         context . getStore ( PLEXUS_EXTENSION ). put ( BASEDIR_KEY ,  testBasedir ) ;
213207    }
214208
215-     public  PlexusContainer  getContainer () {
209+     public  PlexusContainer  getContainer (ExtensionContext  context ) {
210+         PlexusContainer  container  =
211+                 context .getStore (PLEXUS_EXTENSION ).get (PlexusContainer .class , PlexusContainer .class );
216212        if  (container  == null ) {
217-             setupContainer ();
213+             return   setupContainer (context );
218214        }
219- 
220215        return  container ;
221216    }
222217
223-     protected  InputStream  getConfiguration () throws  Exception  {
224-         return  getConfiguration (null );
225-     }
226- 
227-     protected  InputStream  getConfiguration (String  subname ) throws  Exception  {
228-         return  getResourceAsStream (getConfigurationName (subname ));
229-     }
230- 
231218    protected  String  getCustomConfigurationName () {
232219        return  null ;
233220    }
@@ -238,10 +225,9 @@ protected String getCustomConfigurationName() {
238225     * this will produce a resource name of org/foo/FunTest.xml which would be used to 
239226     * configure the Plexus container before running your test. 
240227     * 
241-      * @param subname the subname 
242228     * @return A configruation name 
243229     */ 
244-     protected  String  getConfigurationName (String   subname ) {
230+     protected  String  getConfigurationName (ExtensionContext   context ) {
245231        Class <?> testClass  = context .getRequiredTestClass ();
246232        for  (Class <?> clazz  = testClass ; clazz  != null ; clazz  = clazz .getSuperclass ()) {
247233            String  name  = clazz .getName ().replace ('.' , '/' ) + ".xml" ;
@@ -252,40 +238,6 @@ protected String getConfigurationName(String subname) {
252238        return  null ;
253239    }
254240
255-     protected  InputStream  getResourceAsStream (String  resource ) {
256-         return  context .getRequiredTestClass ().getResourceAsStream (resource );
257-     }
258- 
259-     protected  ClassLoader  getClassLoader () {
260-         return  context .getRequiredTestClass ().getClassLoader ();
261-     }
262- 
263-     // ---------------------------------------------------------------------- 
264-     // Container access 
265-     // ---------------------------------------------------------------------- 
266- 
267-     @ SuppressWarnings ("unchecked" )
268-     protected  <T > T  lookup (String  componentKey ) throws  ComponentLookupException  {
269-         return  (T ) getContainer ().lookup (componentKey );
270-     }
271- 
272-     @ SuppressWarnings ("unchecked" )
273-     protected  <T > T  lookup (String  role , String  roleHint ) throws  ComponentLookupException  {
274-         return  (T ) getContainer ().lookup (role , roleHint );
275-     }
276- 
277-     protected  <T > T  lookup (Class <T > componentClass ) throws  ComponentLookupException  {
278-         return  getContainer ().lookup (componentClass );
279-     }
280- 
281-     protected  <T > T  lookup (Class <T > componentClass , String  roleHint ) throws  ComponentLookupException  {
282-         return  getContainer ().lookup (componentClass , roleHint );
283-     }
284- 
285-     protected  void  release (Object  component ) throws  ComponentLifecycleException  {
286-         getContainer ().release (component );
287-     }
288- 
289241    // ---------------------------------------------------------------------- 
290242    // Helper methods for sub classes 
291243    // ---------------------------------------------------------------------- 
@@ -312,12 +264,8 @@ public static String getTestPath(String basedir, String path) {
312264        return  getTestFile (basedir , path ).getAbsolutePath ();
313265    }
314266
315-     public  static  String  getBasedir () {
316-         if  (basedir  != null ) {
317-             return  basedir ;
318-         }
319- 
320-         basedir  = System .getProperty ("basedir" );
267+     private  static  String  getDefaultBasedir () {
268+         String  basedir  = System .getProperty ("basedir" );
321269
322270        if  (basedir  == null ) {
323271            basedir  = new  File ("" ).getAbsolutePath ();
@@ -326,8 +274,10 @@ public static String getBasedir() {
326274        return  basedir ;
327275    }
328276
329-     public  String  getTestConfiguration () {
330-         return  getTestConfiguration (context .getRequiredTestClass ());
277+     public  static  String  getBasedir () {
278+         return  Optional .ofNullable (extensionContextThreadLocal .get ())
279+                 .map (ec  -> ec .getStore (PLEXUS_EXTENSION ).get (BASEDIR_KEY , String .class ))
280+                 .orElseGet (PlexusExtension ::getDefaultBasedir );
331281    }
332282
333283    public  static  String  getTestConfiguration (Class <?> clazz ) {
0 commit comments