1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.apache.maven.plugins.enforcer.internal;
20
21 import javax.inject.Inject;
22 import javax.inject.Named;
23 import javax.inject.Provider;
24 import javax.inject.Singleton;
25
26 import java.util.ArrayList;
27 import java.util.List;
28 import java.util.Objects;
29 import java.util.Optional;
30
31 import org.apache.maven.enforcer.rule.api.EnforcerLevel;
32 import org.apache.maven.enforcer.rule.api.EnforcerLogger;
33 import org.apache.maven.enforcer.rule.api.EnforcerRuleBase;
34 import org.apache.maven.execution.MavenSession;
35 import org.apache.maven.plugin.MojoExecution;
36 import org.apache.maven.plugin.PluginParameterExpressionEvaluator;
37 import org.apache.maven.plugin.logging.Log;
38 import org.codehaus.plexus.PlexusContainer;
39 import org.codehaus.plexus.classworlds.realm.ClassRealm;
40 import org.codehaus.plexus.component.configurator.ComponentConfigurationException;
41 import org.codehaus.plexus.component.configurator.ComponentConfigurator;
42 import org.codehaus.plexus.component.configurator.expression.ExpressionEvaluator;
43 import org.codehaus.plexus.component.repository.exception.ComponentLookupException;
44 import org.codehaus.plexus.configuration.PlexusConfiguration;
45
46
47
48
49
50
51
52 @Named
53 @Singleton
54 public class EnforcerRuleManager {
55
56 private final Provider<MavenSession> sessionProvider;
57
58 private final Provider<MojoExecution> mojoExecutionProvider;
59
60 private final ComponentConfigurator componentConfigurator;
61
62 private final PlexusContainer plexusContainer;
63
64 @Inject
65 public EnforcerRuleManager(
66 Provider<MavenSession> sessionProvider,
67 Provider<MojoExecution> mojoExecutionProvider,
68 @Named("basic") ComponentConfigurator componentConfigurator,
69 PlexusContainer plexusContainer) {
70 this.sessionProvider = Objects.requireNonNull(sessionProvider, "sessionProvider must be not null");
71 this.mojoExecutionProvider =
72 Objects.requireNonNull(mojoExecutionProvider, "mojoExecutionProvider must be not null");
73 this.componentConfigurator =
74 Objects.requireNonNull(componentConfigurator, "componentConfigurator must be not null");
75 this.plexusContainer = Objects.requireNonNull(plexusContainer, "plexusContainer must be not null");
76 }
77
78
79
80
81
82
83
84
85
86 public List<EnforcerRuleDesc> createRules(PlexusConfiguration rules, Log log) throws EnforcerRuleManagerException {
87
88 List<EnforcerRuleDesc> result = new ArrayList<>();
89
90 if (rules == null || rules.getChildCount() == 0) {
91 return result;
92 }
93
94 ClassRealm classRealm = mojoExecutionProvider
95 .get()
96 .getMojoDescriptor()
97 .getPluginDescriptor()
98 .getClassRealm();
99
100 ExpressionEvaluator evaluator =
101 new PluginParameterExpressionEvaluator(sessionProvider.get(), mojoExecutionProvider.get());
102
103 EnforcerLogger enforcerLoggerError = new EnforcerLoggerError(log);
104 EnforcerLogger enforcerLoggerWarn = new EnforcerLoggerWarn(log);
105
106 for (PlexusConfiguration ruleConfig : rules.getChildren()) {
107
108 EnforcerLevel ruleLevel = getRuleLevelFromConfig(ruleConfig);
109
110 EnforcerRuleDesc ruleDesc =
111 createRuleDesc(ruleConfig.getName(), ruleConfig.getAttribute("implementation"), log);
112
113 ruleDesc.getRule().setLog(ruleLevel == EnforcerLevel.ERROR ? enforcerLoggerError : enforcerLoggerWarn);
114 if (ruleConfig.getChildCount() > 0) {
115 try {
116 componentConfigurator.configureComponent(ruleDesc.getRule(), ruleConfig, evaluator, classRealm);
117 } catch (ComponentConfigurationException e) {
118 throw new EnforcerRuleManagerException(e);
119 }
120 }
121 result.add(ruleDesc);
122 }
123 return result;
124 }
125
126 private EnforcerLevel getRuleLevelFromConfig(PlexusConfiguration ruleConfig) {
127 PlexusConfiguration levelConfig = ruleConfig.getChild("level", false);
128 String level = Optional.ofNullable(levelConfig)
129 .map(PlexusConfiguration::getValue)
130 .orElse(EnforcerLevel.ERROR.name());
131 return EnforcerLevel.valueOf(level);
132 }
133
134 private EnforcerRuleDesc createRuleDesc(String name, String implementation, Log log)
135 throws EnforcerRuleManagerException {
136
137
138 String ruleName = Character.toLowerCase(name.charAt(0)) + name.substring(1);
139
140 if (plexusContainer.hasComponent(EnforcerRuleBase.class, ruleName)) {
141 try {
142 return new EnforcerRuleDesc(ruleName, plexusContainer.lookup(EnforcerRuleBase.class, ruleName));
143 } catch (ComponentLookupException e) {
144 throw new EnforcerRuleManagerException(e);
145 }
146 }
147
148 String ruleClass;
149 if (implementation != null && !implementation.isEmpty()) {
150 ruleClass = implementation;
151 } else {
152 ruleClass = name;
153 }
154
155 if (!ruleClass.contains(".")) {
156 ruleClass = "org.apache.maven.plugins.enforcer." + Character.toUpperCase(ruleClass.charAt(0))
157 + ruleClass.substring(1);
158 }
159
160 try {
161 log.warn(
162 "ruleName " + ruleName + " with implementation " + ruleClass
163 + "uses the deprecated Maven Enforcer Plugin API. This will not be supported in a future version of the plugin. Please contact the rule maintainer to upgrade the rule implementation to the current API.");
164 return new EnforcerRuleDesc(
165 ruleName, (EnforcerRuleBase) Class.forName(ruleClass).newInstance());
166 } catch (Exception e) {
167 throw new EnforcerRuleManagerException(
168 "Failed to create enforcer rules with name: " + ruleName + " or for class: " + ruleClass, e);
169 }
170 }
171 }