Class AbstractIssueProvider

    • Field Detail

      • LOG

        protected static final com.intellij.openapi.diagnostic.Logger LOG
      • EMPTY_PATTERN

        protected static final java.util.regex.Pattern EMPTY_PATTERN
      • REGEX_ISSUES_TIMEOUS_MS

        protected static final int REGEX_ISSUES_TIMEOUS_MS
        See Also:
        Constant Field Values
      • myType

        protected final java.lang.String myType
      • myHost

        protected java.lang.String myHost
      • myFetchHost

        protected java.lang.String myFetchHost
      • myCredentials

        protected org.apache.commons.httpclient.Credentials myCredentials
      • myPattern

        protected java.util.regex.Pattern myPattern
      • myProperties

        protected java.util.Map<java.lang.String,​java.lang.String> myProperties
    • Constructor Detail

      • AbstractIssueProvider

        public AbstractIssueProvider​(@NotNull
                                     java.lang.String type,
                                     @NotNull
                                     IssueFetcher fetcher)
      • AbstractIssueProvider

        protected AbstractIssueProvider​(@NotNull
                                        java.util.regex.Pattern pattern,
                                        @NotNull
                                        IssueFetcher fetcher)
    • Method Detail

      • fetchProjectIds

        @Nullable
        @Deprecated
        public java.util.List<java.lang.String> fetchProjectIds()
        Deprecated.
      • getType

        @NotNull
        public java.lang.String getType()
        Description copied from interface: IssueProvider
        Returns the type of this provider (the type of the corresponding factory). The type is immutable and consists of alpha-numeric characters.
        Specified by:
        getType in interface IssueProvider
        Returns:
        provider type
      • getRelatedIssues

        @NotNull
        public java.util.Collection<IssueMention> getRelatedIssues​(@NotNull
                                                                   java.lang.String comment)
        Description copied from interface: IssueProvider
        Returns the collection of issues related, or mentioned in the comment. The relation can be defined by a mention in the text (a mention means that comment contains the substring that matches a certain pattern), or by any way the plugin chooses.
        Specified by:
        getRelatedIssues in interface IssueProvider
        Parameters:
        comment - the comment
        Returns:
        collection of related issues
        See Also:
        IssueProvider.isHasRelatedIssues(String)
      • isHasRelatedIssues

        public boolean isHasRelatedIssues​(@NotNull
                                          java.lang.String comment)
        Description copied from interface: IssueProvider
        Returns whether there are related issues in the specified comment. The relation can be defined by a mention in the text (a mention means that comment contains the substring that matches a certain pattern), or by any way the plugin chooses.
        Specified by:
        isHasRelatedIssues in interface IssueProvider
        Parameters:
        comment - the comment
        Returns:
        true if the comment has related issues
        See Also:
        IssueProvider.getRelatedIssues(String)
      • findPossiblyExpiredIssue

        public IssueData findPossiblyExpiredIssue​(@NotNull
                                                  java.lang.String id)
        Description copied from interface: SIssueProvider
        Returns the issue data corresponding to the id.

        The main difference from IssueProvider.findIssueById(String) method is that method must be always fast (should use only cached data) and the result data isn't expected to be up-to-date. So this method should return the issue data if by chance it can be retrieved fast, even if a provider considers it out-dated and IssueProvider.findIssueById(String) method would make an extra call to the issue-tracking system.

        The simplest (100% legal) implementation of this method:

            public IssueData findPossiblyExpiredIssue(@NotNull String id) {
              return null;
            }
         
        This way TeamCity will always show 'Retrieving...' message, when the issue isn't fetched (see SIssueProvider.isFetched(String)).
        Specified by:
        findPossiblyExpiredIssue in interface SIssueProvider
        Parameters:
        id - the issue id
        Returns:
        issue data, or null if the it cannot be returned efficiently
      • isFailedToFetch

        public boolean isFailedToFetch​(@NotNull
                                       java.lang.String id)
        Description copied from interface: SIssueProvider
        Returns whether the issue could not be fetched due to error.

        In case of true, the issue data isn't in a cache (i.e. isFetched(id) == false), but the error is.

        Specified by:
        isFailedToFetch in interface SIssueProvider
        Parameters:
        id - the issue id
        Returns:
        true if issue could not be fetched
        See Also:
        SIssueProvider.isFetched(String)
      • findIssueById

        @Nullable
        public IssueData findIssueById​(@NotNull
                                       java.lang.String id)
        Description copied from interface: IssueProvider
        Returns the issue by the specified id. Returned data isn't expected to be up-to-date, i.e. fetched from the ITS at the moment of call.

        The implementors are encouraged to report retrieving errors by throwing RetrieveIssueException, rather than simply return null: NotFoundException when the issue cannot be found, UnsupportedException when the issue tracker protocol is not supported, etc.

        Specified by:
        findIssueById in interface IssueProvider
        Parameters:
        id - issue id
        Returns:
        the corresponding issue, or null if the issue cannot be retrieved
      • isBatchFetchSupported

        public boolean isBatchFetchSupported()
        Description copied from interface: IssueBatchProviderSupport
        Returns whether the issue provider supports fetching in batch.

        Note: the method is always fast.

        Specified by:
        isBatchFetchSupported in interface IssueBatchProviderSupport
        Returns:
        true if the issue provider supports fetching in batch
      • findIssuesByIds

        @Nullable
        public java.util.Map<java.lang.String,​IssueData> findIssuesByIds​(@NotNull
                                                                               java.util.Collection<java.lang.String> ids)
        Description copied from interface: IssueBatchProviderSupport
        Finds and returns the specified collection of issue ids. If current provider does not support batch fetching, null is returned.

        Note: the method is not necessarily fast, and should be called in a separate issue.

        Specified by:
        findIssuesByIds in interface IssueBatchProviderSupport
        Parameters:
        ids - the collection of issue ids to fetch
        Returns:
        the map issue id -> issue data, or null
      • getProperties

        @NotNull
        public java.util.Map<java.lang.String,​java.lang.String> getProperties()
        Description copied from interface: IssueProvider
        Returns the map of provider properties. This map includes all fields that are configured in admin UI and stored in TeamCity config file (e.g. credentials used in all communications with remote server, server url, etc, but not the id or type).

        The keys should consist of alphanumeric characters and start with a letter.

        Specified by:
        getProperties in interface IssueProvider
        Returns:
        the properties map
      • setProperties

        public void setProperties​(@NotNull
                                  java.util.Map<java.lang.String,​java.lang.String> map)
        Description copied from interface: IssueProvider
        Sets the provider properties (see IssueProvider.getProperties() method for the details).

        Few words about thread-safety: properties can be changed from the admin UI, or in config file. By any of these events this method is called (synchronously). Hence this method should lock any other API method.

        Specified by:
        setProperties in interface IssueProvider
        Parameters:
        map - a properties map
        See Also:
        IssueProvider.getProperties()
      • getFetchHost

        @NotNull
        protected java.lang.String getFetchHost()
      • dispose

        public void dispose()
        Description copied from interface: IssueProvider
        Disposes the provider (releases all necessary resources, dumps caches on disk, etc). This method is called when the provider is deleted from the system, and on server shutdown.
        Specified by:
        dispose in interface IssueProvider
      • getIssueViewUrl

        protected java.lang.String getIssueViewUrl​(@NotNull
                                                   java.lang.String id)
      • getConfigurationSummary

        public java.lang.String getConfigurationSummary()
        Description copied from interface: SIssueProvider
        Returns the basic summary of current configuration, for instance, "Jira" provider might return: "Projects: P1, P2".
        Specified by:
        getConfigurationSummary in interface SIssueProvider
        Returns:
        provider configuration summary, or null
      • toString

        public java.lang.String toString()
        Overrides:
        toString in class java.lang.Object
      • quickCheck

        protected boolean quickCheck​(@NotNull
                                     java.lang.String comment)
        Helper methods.
      • compilePattern

        @NotNull
        protected java.util.regex.Pattern compilePattern​(@NotNull
                                                         java.util.Map<java.lang.String,​java.lang.String> properties)
      • useIdPrefix

        protected boolean useIdPrefix()
      • isIdPrefixMandatory

        protected boolean isIdPrefixMandatory​(@NotNull
                                              java.util.Map<java.lang.String,​java.lang.String> properties)
      • extractId

        @NotNull
        protected java.lang.String extractId​(@NotNull
                                             java.lang.String match)
      • findIssuesByIdsImpl

        @Nullable
        protected java.util.Map<java.lang.String,​IssueData> findIssuesByIdsImpl​(@NotNull
                                                                                      java.util.Collection<java.lang.String> ids)
      • sanitizeHost

        @NotNull
        protected java.lang.String sanitizeHost​(@NotNull
                                                java.lang.String host)
      • checkIssueIdBeforeTestConnection

        @Nullable
        protected java.lang.String checkIssueIdBeforeTestConnection​(@NotNull
                                                                    java.lang.String issueId)
      • compileDisjunction

        @NotNull
        protected static java.util.regex.Pattern compileDisjunction​(@NotNull
                                                                    java.lang.String prefixes,
                                                                    @NotNull
                                                                    java.lang.String suffix)
        Given a string containing the prefixes, composes the reg.exp pattern that accepts any of them plus suffix. Example:
           prefixes = "foo bar";
           suffix = "-\\d+";
           result = "(foo|bar)-\\d+"
         

        Prefixes are separated by ' ', '\t', '\n', '\r', ',', ';' characters.

        Parameters:
        prefixes - the prefixes (in one string)
        suffix - the suffix
        Returns:
        disjunction pattern
      • safeCompile

        @NotNull
        protected static java.util.regex.Pattern safeCompile​(@NotNull
                                                             java.lang.String pattern)
        The same as Pattern.compile(pattern), but returns an empty pattern if the provided pattern is incorrect. In this case the issue provider will be disabled.

        The pattern that matches empty string is considered incorrect.

        Parameters:
        pattern - the pattern to compile
        Returns:
        a compiled pattern