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ø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 }