1   
2   
3   
4   
5   
6   
7   
8   
9   
10  
11  
12  
13  
14  
15  
16  
17  
18  
19  package org.apache.maven.cling.invoker;
20  
21  import java.util.Optional;
22  
23  import org.apache.maven.api.services.Lookup;
24  import org.apache.maven.internal.impl.DefaultLookup;
25  import org.codehaus.plexus.DefaultPlexusContainer;
26  
27  import static java.util.Objects.requireNonNull;
28  import static org.apache.maven.cling.invoker.CliUtils.toPlexusLoggingLevel;
29  
30  
31  
32  
33  public class PlexusContainerCapsule implements ContainerCapsule {
34      private final ClassLoader previousClassLoader;
35      private final DefaultPlexusContainer plexusContainer;
36      private final Lookup lookup;
37  
38      public PlexusContainerCapsule(
39              LookupContext context, ClassLoader previousClassLoader, DefaultPlexusContainer plexusContainer) {
40          this.previousClassLoader = requireNonNull(previousClassLoader, "previousClassLoader");
41          this.plexusContainer = requireNonNull(plexusContainer, "plexusContainer");
42          this.lookup = new DefaultLookup(plexusContainer);
43          updateLogging(context);
44      }
45  
46      @Override
47      public void updateLogging(LookupContext context) {
48          plexusContainer.getLoggerManager().setThresholds(toPlexusLoggingLevel(context.loggerLevel));
49      }
50  
51      @Override
52      public Lookup getLookup() {
53          return lookup;
54      }
55  
56      @Override
57      public Optional<ClassLoader> currentThreadClassLoader() {
58          return Optional.of(plexusContainer.getContainerRealm());
59      }
60  
61      @Override
62      public void close() {
63          try {
64              plexusContainer.dispose();
65          } finally {
66              Thread.currentThread().setContextClassLoader(previousClassLoader);
67          }
68      }
69  }