| // Copyright (C) 2016 The Android Open Source Project |
| // |
| // Licensed under the Apache License, Version 2.0 (the "License"); |
| // you may not use this file except in compliance with the License. |
| // You may obtain a copy of the License at |
| // |
| // http://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, software |
| // distributed under the License is distributed on an "AS IS" BASIS, |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| // See the License for the specific language governing permissions and |
| // limitations under the License. |
| |
| package com.google.gerrit.server.mail.send; |
| |
| import com.google.gerrit.common.Nullable; |
| import com.google.gerrit.common.UsedAt; |
| import com.google.gerrit.entities.Change; |
| import com.google.gerrit.entities.Project; |
| import com.google.gerrit.extensions.registration.DynamicItem; |
| import com.google.gerrit.extensions.registration.DynamicSet; |
| import com.google.gerrit.server.AnonymousUser; |
| import com.google.gerrit.server.CurrentUser; |
| import com.google.gerrit.server.GerritPersonIdentProvider; |
| import com.google.gerrit.server.IdentifiedUser; |
| import com.google.gerrit.server.IdentifiedUser.GenericFactory; |
| import com.google.gerrit.server.PatchSetUtil; |
| import com.google.gerrit.server.account.AccountCache; |
| import com.google.gerrit.server.account.GroupBackend; |
| import com.google.gerrit.server.approval.ApprovalsUtil; |
| import com.google.gerrit.server.config.AllProjectsName; |
| import com.google.gerrit.server.config.AnonymousCowardName; |
| import com.google.gerrit.server.config.GerritInstanceName; |
| import com.google.gerrit.server.config.GerritServerConfig; |
| import com.google.gerrit.server.config.SitePaths; |
| import com.google.gerrit.server.config.UrlFormatter; |
| import com.google.gerrit.server.git.GitRepositoryManager; |
| import com.google.gerrit.server.mail.EmailSettings; |
| import com.google.gerrit.server.notedb.ChangeNotes; |
| import com.google.gerrit.server.patch.DiffOperations; |
| import com.google.gerrit.server.patch.PatchSetInfoFactory; |
| import com.google.gerrit.server.permissions.PermissionBackend; |
| import com.google.gerrit.server.project.ProjectCache; |
| import com.google.gerrit.server.query.account.InternalAccountQuery; |
| import com.google.gerrit.server.query.change.ChangeData; |
| import com.google.gerrit.server.query.change.ChangeQueryBuilder; |
| import com.google.gerrit.server.ssh.SshAdvertisedAddresses; |
| import com.google.gerrit.server.update.RetryHelper; |
| import com.google.gerrit.server.validators.OutgoingEmailValidationListener; |
| import com.google.inject.Inject; |
| import com.google.inject.Provider; |
| import com.google.inject.Singleton; |
| import com.google.template.soy.jbcsrc.api.SoySauce; |
| import java.net.URI; |
| import java.net.URISyntaxException; |
| import java.util.List; |
| import org.apache.http.client.utils.URIBuilder; |
| import org.eclipse.jgit.lib.Config; |
| import org.eclipse.jgit.lib.ObjectId; |
| import org.eclipse.jgit.lib.PersonIdent; |
| |
| /** |
| * Arguments used for sending notification emails. |
| * |
| * <p>Notification emails are sent by out by {@link OutgoingEmail} . To construct an email class (or |
| * its decorators) needs to get various other classes injected. Instead of injecting these classes |
| * into the sender classes directly, they only get {@code EmailArguments} injected and {@code |
| * EmailArguments} provides them all dependencies that they need. |
| * |
| * <p>This class is public because plugins need access to it for sending emails. |
| */ |
| @Singleton |
| @UsedAt(UsedAt.Project.PLUGINS_ALL) |
| public class EmailArguments { |
| public final GitRepositoryManager server; |
| public final ProjectCache projectCache; |
| public final PermissionBackend permissionBackend; |
| public final GroupBackend groupBackend; |
| public final AccountCache accountCache; |
| public final DiffOperations diffOperations; |
| public final PatchSetUtil patchSetUtil; |
| public final ApprovalsUtil approvalsUtil; |
| public final Provider<FromAddressGenerator> fromAddressGenerator; |
| public final EmailSender emailSender; |
| public final PatchSetInfoFactory patchSetInfoFactory; |
| public final IdentifiedUser.GenericFactory identifiedUserFactory; |
| public final ChangeNotes.Factory changeNotesFactory; |
| public final Provider<AnonymousUser> anonymousUser; |
| public final String anonymousCowardName; |
| public final Provider<PersonIdent> gerritPersonIdent; |
| public final DynamicItem<UrlFormatter> urlFormatter; |
| public final AllProjectsName allProjectsName; |
| public final List<String> sshAddresses; |
| public final SitePaths site; |
| public final Provider<ChangeQueryBuilder> queryBuilder; |
| public final ChangeData.Factory changeDataFactory; |
| public final Provider<SoySauce> soySauce; |
| public final EmailSettings settings; |
| public final DynamicSet<OutgoingEmailValidationListener> outgoingEmailValidationListeners; |
| public final Provider<InternalAccountQuery> accountQueryProvider; |
| public final OutgoingEmailValidator validator; |
| public final boolean addInstanceNameInSubject; |
| public final Provider<String> instanceNameProvider; |
| public final Provider<CurrentUser> currentUserProvider; |
| public final RetryHelper retryHelper; |
| |
| @Inject |
| EmailArguments( |
| GitRepositoryManager server, |
| ProjectCache projectCache, |
| PermissionBackend permissionBackend, |
| GroupBackend groupBackend, |
| AccountCache accountCache, |
| DiffOperations diffOperations, |
| PatchSetUtil patchSetUtil, |
| ApprovalsUtil approvalsUtil, |
| Provider<FromAddressGenerator> fromAddressGenerator, |
| EmailSender emailSender, |
| PatchSetInfoFactory patchSetInfoFactory, |
| GenericFactory identifiedUserFactory, |
| ChangeNotes.Factory changeNotesFactory, |
| Provider<AnonymousUser> anonymousUser, |
| @AnonymousCowardName String anonymousCowardName, |
| GerritPersonIdentProvider gerritPersonIdent, |
| DynamicItem<UrlFormatter> urlFormatter, |
| AllProjectsName allProjectsName, |
| Provider<ChangeQueryBuilder> queryBuilder, |
| ChangeData.Factory changeDataFactory, |
| @MailTemplates Provider<SoySauce> soySauce, |
| EmailSettings settings, |
| @SshAdvertisedAddresses List<String> sshAddresses, |
| SitePaths site, |
| DynamicSet<OutgoingEmailValidationListener> outgoingEmailValidationListeners, |
| Provider<InternalAccountQuery> accountQueryProvider, |
| OutgoingEmailValidator validator, |
| @GerritInstanceName Provider<String> instanceNameProvider, |
| @GerritServerConfig Config cfg, |
| Provider<CurrentUser> currentUserProvider, |
| RetryHelper retryHelper) { |
| this.server = server; |
| this.projectCache = projectCache; |
| this.permissionBackend = permissionBackend; |
| this.groupBackend = groupBackend; |
| this.accountCache = accountCache; |
| this.diffOperations = diffOperations; |
| this.patchSetUtil = patchSetUtil; |
| this.approvalsUtil = approvalsUtil; |
| this.fromAddressGenerator = fromAddressGenerator; |
| this.emailSender = emailSender; |
| this.patchSetInfoFactory = patchSetInfoFactory; |
| this.identifiedUserFactory = identifiedUserFactory; |
| this.changeNotesFactory = changeNotesFactory; |
| this.anonymousUser = anonymousUser; |
| this.anonymousCowardName = anonymousCowardName; |
| this.gerritPersonIdent = gerritPersonIdent; |
| this.urlFormatter = urlFormatter; |
| this.allProjectsName = allProjectsName; |
| this.queryBuilder = queryBuilder; |
| this.changeDataFactory = changeDataFactory; |
| this.soySauce = soySauce; |
| this.settings = settings; |
| this.sshAddresses = sshAddresses; |
| this.site = site; |
| this.outgoingEmailValidationListeners = outgoingEmailValidationListeners; |
| this.accountQueryProvider = accountQueryProvider; |
| this.validator = validator; |
| this.instanceNameProvider = instanceNameProvider; |
| this.addInstanceNameInSubject = cfg.getBoolean("sendemail", "addInstanceNameInSubject", false); |
| this.currentUserProvider = currentUserProvider; |
| this.retryHelper = retryHelper; |
| } |
| |
| /** Fetch ChangeData for the specified change. */ |
| public ChangeData newChangeData(Project.NameKey project, Change.Id id) { |
| return changeDataFactory.create(project, id); |
| } |
| |
| /** Fetch ChangeData for specified change and revision. */ |
| public ChangeData newChangeData(Project.NameKey project, Change.Id id, ObjectId metaId) { |
| return changeDataFactory.create(changeNotesFactory.createChecked(project, id, metaId)); |
| } |
| |
| @Nullable |
| public static String addUspParam(String url) { |
| try { |
| URI uri = new URIBuilder(url).addParameter("usp", "email").build(); |
| return uri.toString(); |
| } catch (URISyntaxException e) { |
| return null; |
| } |
| } |
| } |