• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

IQSS / dataverse / #21824

20 Mar 2024 08:05PM CUT coverage: 20.661% (+0.09%) from 20.57%
#21824

push

github

web-flow
Merge pull request #10211 from IQSS/9356-rate-limiting-command-engine

adding rate limiting for command engine

90 of 123 new or added lines in 14 files covered. (73.17%)

1 existing line in 1 file now uncovered.

17074 of 82639 relevant lines covered (20.66%)

0.21 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

57.14
/src/main/java/edu/harvard/iq/dataverse/util/cache/CacheFactoryBean.java
1
package edu.harvard.iq.dataverse.util.cache;
2

3
import edu.harvard.iq.dataverse.authorization.users.User;
4
import edu.harvard.iq.dataverse.engine.command.Command;
5
import edu.harvard.iq.dataverse.util.SystemConfig;
6
import jakarta.annotation.PostConstruct;
7
import jakarta.ejb.EJB;
8
import jakarta.ejb.Singleton;
9
import jakarta.ejb.Startup;
10
import jakarta.inject.Inject;
11

12
import javax.cache.Cache;
13
import javax.cache.CacheManager;
14
import javax.cache.configuration.CompleteConfiguration;
15
import javax.cache.configuration.MutableConfiguration;
16
import javax.cache.spi.CachingProvider;
17
import java.util.logging.Logger;
18

19
@Singleton
20
@Startup
21
public class CacheFactoryBean implements java.io.Serializable {
1✔
22
    private static final Logger logger = Logger.getLogger(CacheFactoryBean.class.getCanonicalName());
1✔
23
    // Retrieved from Hazelcast, implements ConcurrentMap and is threadsafe
24
    Cache<String, String> rateLimitCache;
25
    @EJB
26
    SystemConfig systemConfig;
27
    @Inject
28
    CacheManager manager;
29
    @Inject
30
    CachingProvider provider;
31
    public final static String RATE_LIMIT_CACHE = "rateLimitCache";
32

33
    @PostConstruct
34
    public void init() {
NEW
35
        rateLimitCache = manager.getCache(RATE_LIMIT_CACHE);
×
NEW
36
        if (rateLimitCache == null) {
×
NEW
37
            CompleteConfiguration<String, String> config =
×
38
                    new MutableConfiguration<String, String>()
NEW
39
                            .setTypes( String.class, String.class );
×
NEW
40
            rateLimitCache = manager.createCache(RATE_LIMIT_CACHE, config);
×
41
        }
NEW
42
    }
×
43

44
    /**
45
     * Check if user can make this call or if they are rate limited
46
     * @param user
47
     * @param command
48
     * @return true if user is superuser or rate not limited
49
     */
50
    public boolean checkRate(User user, Command command) {
51
        final String action = command.getClass().getSimpleName();
1✔
52
        int capacity = RateLimitUtil.getCapacity(systemConfig, user, action);
1✔
53
        if (capacity == RateLimitUtil.NO_LIMIT) {
1✔
54
            return true;
1✔
55
        } else {
56
            String cacheKey = RateLimitUtil.generateCacheKey(user, action);
1✔
57
            return (!RateLimitUtil.rateLimited(rateLimitCache, cacheKey, capacity));
1✔
58
        }
59
    }
60
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2025 Coveralls, Inc