View Javadoc
1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one
3    * or more contributor license agreements.  See the NOTICE file
4    * distributed with this work for additional information
5    * regarding copyright ownership.  The ASF licenses this file
6    * to you under the Apache License, Version 2.0 (the
7    * "License"); you may not use this file except in compliance
8    * with the License.  You may obtain a copy of the License at
9    *
10   *   http://www.apache.org/licenses/LICENSE-2.0
11   *
12   * Unless required by applicable law or agreed to in writing,
13   * software distributed under the License is distributed on an
14   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15   * KIND, either express or implied.  See the License for the
16   * specific language governing permissions and limitations
17   * under the License.
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.HashMap;
28  import java.util.List;
29  import java.util.Map;
30  
31  import org.apache.maven.enforcer.rule.api.AbstractEnforcerRule;
32  import org.apache.maven.execution.MavenSession;
33  import org.eclipse.aether.SessionData;
34  import org.slf4j.Logger;
35  import org.slf4j.LoggerFactory;
36  
37  /**
38   * Service for manage rules cache storage.
39   *
40   * @author Slawomir Jaranowski
41   * @since 3.2.0
42   */
43  @Named
44  @Singleton
45  public class EnforcerRuleCache {
46  
47      private final Logger logger = LoggerFactory.getLogger(EnforcerRuleCache.class);
48  
49      private final Provider<MavenSession> sessionProvider;
50  
51      @Inject
52      EnforcerRuleCache(Provider<MavenSession> sessionProvider) {
53          this.sessionProvider = sessionProvider;
54      }
55  
56      @SuppressWarnings("unchecked")
57      public boolean isCached(AbstractEnforcerRule rule) {
58  
59          String cacheId = rule.getCacheId();
60  
61          if (cacheId == null) {
62              return false;
63          }
64  
65          Class<? extends AbstractEnforcerRule> ruleClass = rule.getClass();
66          logger.debug("Check cache for {} with id {}", ruleClass, cacheId);
67  
68          SessionData sessionData = sessionProvider.get().getRepositorySession().getData();
69  
70          synchronized (this) {
71  
72              // sessionData.computeIfAbsent() is available in Maven 3.9.x, so do it manually
73              Map<Class<? extends AbstractEnforcerRule>, List<String>> cache =
74                      (Map<Class<? extends AbstractEnforcerRule>, List<String>>) sessionData.get("enforcer-cache");
75  
76              if (cache == null) {
77                  cache = new HashMap<>();
78                  sessionData.set("enforcer-cache", cache);
79              }
80  
81              List<String> cacheIdList = cache.computeIfAbsent(ruleClass, k -> new ArrayList<>());
82              if (cacheIdList.contains(cacheId)) {
83                  logger.debug("Already cached {} with id {}", ruleClass, cacheId);
84                  return true;
85              }
86              logger.debug("Add cache {} with id {}", ruleClass, cacheId);
87              cacheIdList.add(cacheId);
88          }
89  
90          return false;
91      }
92  }