001package org.nasdanika.models.gitlab.util;
002
003import java.util.List;
004import java.util.function.BiConsumer;
005import java.util.logging.Handler;
006import java.util.logging.Level;
007import java.util.logging.Logger;
008
009import org.eclipse.emf.common.util.EMap;
010import org.gitlab4j.api.Constants.AutoDevopsDeployStrategy;
011import org.gitlab4j.api.Constants.BuildGitStrategy;
012import org.gitlab4j.api.Constants.SquashOption;
013import org.gitlab4j.api.GitLabApi;
014import org.gitlab4j.api.GitLabApiException;
015import org.gitlab4j.api.GroupApi;
016import org.gitlab4j.api.Pager;
017import org.gitlab4j.api.ProjectApi;
018import org.gitlab4j.api.ProjectLicense;
019import org.gitlab4j.api.RepositoryApi;
020import org.gitlab4j.api.RepositoryFileApi;
021import org.gitlab4j.api.models.AbstractUser;
022import org.gitlab4j.api.models.Branch;
023import org.gitlab4j.api.models.Commit;
024import org.gitlab4j.api.models.Contributor;
025import org.gitlab4j.api.models.CustomAttribute;
026import org.gitlab4j.api.models.Group.Statistics;
027import org.gitlab4j.api.models.GroupFilter;
028import org.gitlab4j.api.models.Owner;
029import org.gitlab4j.api.models.Permissions;
030import org.gitlab4j.api.models.Project;
031import org.gitlab4j.api.models.ProjectAccess;
032import org.gitlab4j.api.models.ProjectSharedGroup;
033import org.gitlab4j.api.models.ProjectStatistics;
034import org.gitlab4j.api.models.TreeItem;
035import org.gitlab4j.api.models.Visibility;
036import org.nasdanika.common.ProgressMonitor;
037import org.nasdanika.common.Status;
038import org.nasdanika.models.gitlab.GitLabFactory;
039import org.nasdanika.models.gitlab.MergeMethod;
040
041/**
042 * This class takes care of different ways to create {@link GitLabApi} and request throttling    
043 */
044public class GitLabApiProvider  implements AutoCloseable {
045        
046        private GitLabApi gitLabApi;
047        
048        /**
049         * Access to the API for configuration. 
050         * @return
051         */
052        public GitLabApi getGitLabApi() {
053                return gitLabApi;
054        }
055        
056        public GitLabApiProvider(String hostUrl, String accessToken) {
057                this(new GitLabApi(hostUrl, accessToken));
058        }       
059        
060        public GitLabApiProvider(GitLabApi gitLabApi) {
061                this(gitLabApi, new ThrottlingHandler());
062        }
063        
064        /**
065         * @param clientRateLimitWindow Client rate window in milliseconds. Client rate limit is enforced if this value and clientRateLimit are positive.
066         * @param clientRateLimit Client rate limit per rate window. Client rate limit is enforced if this value and clientRateLimitWindow are positive.
067         */     
068        public GitLabApiProvider(
069                        String hostUrl, 
070                        String accessToken, 
071                        long clientRateLimitWindow,
072                        int clientRateLimit) {
073                this(new GitLabApi(hostUrl, accessToken), clientRateLimitWindow, clientRateLimit);
074        }       
075        
076        /**
077         * @param clientRateLimitWindow Client rate window in milliseconds. Client rate limit is enforced if this value and clientRateLimit are positive.
078         * @param clientRateLimit Client rate limit per rate window. Client rate limit is enforced if this value and clientRateLimitWindow are positive.
079         */     
080        public GitLabApiProvider(
081                        GitLabApi gitLabApi,
082                        long clientRateLimitWindow,
083                        int clientRateLimit) {
084                this(gitLabApi, new ThrottlingHandler(clientRateLimitWindow, clientRateLimit));
085        }       
086        
087        public GitLabApiProvider(GitLabApi gitLabApi, Handler throttlingHandler) {
088                if (throttlingHandler != null) {                        
089                        Level level = Level.FINE;
090                        throttlingHandler.setLevel(level);
091                        Logger logger = Logger.getLogger(GitLabApi.class.getName());
092                        Level loggerLevel = logger.getLevel();
093                        if (loggerLevel == null || loggerLevel.intValue() > level.intValue()) {
094                                logger.setLevel(level);
095                        }
096                        logger.addHandler(throttlingHandler);
097                        gitLabApi.enableRequestResponseLogging();
098                }
099                
100                this.gitLabApi = gitLabApi;
101        }
102        
103        @Override
104        public void close() {
105                if (gitLabApi != null) {
106                        gitLabApi.close();
107                }
108        }
109        
110}