View Javadoc
1   package org.codehaus.plexus.compiler.manager;
2   
3   /**
4    * The MIT License
5    *
6    * Copyright (c) 2005, The Codehaus
7    *
8    * Permission is hereby granted, free of charge, to any person obtaining a copy of
9    * this software and associated documentation files (the "Software"), to deal in
10   * the Software without restriction, including without limitation the rights to
11   * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
12   * of the Software, and to permit persons to whom the Software is furnished to do
13   * so, subject to the following conditions:
14   *
15   * The above copyright notice and this permission notice shall be included in all
16   * copies or substantial portions of the Software.
17   *
18   * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19   * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20   * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
21   * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22   * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23   * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
24   * SOFTWARE.
25   */
26  import javax.inject.Inject;
27  import javax.inject.Named;
28  import javax.inject.Provider;
29  
30  import java.util.Map;
31  
32  import org.codehaus.plexus.compiler.Compiler;
33  import org.slf4j.Logger;
34  import org.slf4j.LoggerFactory;
35  
36  /**
37   * @author <a href="mailto:trygvis@inamo.no">Trygve Laugst&oslash;l</a>
38   */
39  @Named
40  public class DefaultCompilerManager implements CompilerManager {
41      private static final String ERROR_MESSAGE = "Compiler '{}' could not be instantiated or injected properly. "
42              + "If you spelled the compiler ID correctly and all necessary dependencies are on the classpath, "
43              + "then next you can try running the build with -Dsisu.debug, looking for exceptions.";
44      private static final String ERROR_MESSAGE_DETAIL = "TypeNotPresentException caused by UnsupportedClassVersionError "
45              + "might indicate, that the compiler needs a more recent Java runtime. "
46              + "IllegalArgumentException in ClassReader.<init> might mean, that you need to upgrade Maven.";
47  
48      @Inject
49      private Map<String, Provider<Compiler>> compilers;
50  
51      private final Logger log = LoggerFactory.getLogger(getClass());
52  
53      // ----------------------------------------------------------------------
54      // CompilerManager Implementation
55      // ----------------------------------------------------------------------
56  
57      public Compiler getCompiler(String compilerId) throws NoSuchCompilerException {
58          // Provider<Class> is lazy -> presence of provider means compiler is present, but not yet constructed
59          Provider<Compiler> compilerProvider = compilers.get(compilerId);
60  
61          if (compilerProvider == null) {
62              // Compiler could not be injected for some reason
63              log.error(ERROR_MESSAGE + " " + ERROR_MESSAGE_DETAIL, compilerId);
64              throw new NoSuchCompilerException(compilerId);
65          }
66  
67          // Provider exists, but compiler was not created yet
68          try {
69              return compilerProvider.get();
70          } catch (Exception e) {
71              // DI could not construct compiler
72              log.error(ERROR_MESSAGE, compilerId);
73              throw new NoSuchCompilerException(compilerId, e);
74          }
75      }
76  }